web-dev-qa-db-ja.com

Microsoft.Office.Interop.Excelライブラリを使用せずにC#でExcelファイルを読み取る方法

C#で.Net-Windowsアプリケーションを使用しています。 Excelを開いて処理する必要があります。 Microsoft.Office.Interop.Excelライブラリを使用せずにこれを行うにはどうすればよいですか?

42
ASD
var fileName = @"C:\ExcelFile.xlsx";
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ;
using (var conn = new OleDbConnection(connectionString))
{
    conn.Open();

    var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] ";

        var adapter = new OleDbDataAdapter(cmd);
        var ds = new DataSet();
        adapter.Fill(ds);
    }
}
40

私は強くお勧めします CSharpJExcel Excel 97-2003ファイル(xls)および ExcelPackage Excel 2007/2010ファイル(Office Open XML形式、xlsx)の読み取り用。

どちらも完全に機能します。それらは何にも依存していません。

CSharpJExcelを使用したサンプル:

Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName));
var sheet = workbook.getSheet(0);
...
var content = sheet.getCell(colIndex, rowIndex).getContents();
...
workbook.close();

ExcelPackageを使用したサンプル:

using (ExcelPackage xlPackage = new ExcelPackage(existingFile))
{
  // get the first worksheet in the workbook
  ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1];
  int iCol = 2;  // the column to read

  // output the data in column 2
  for (int iRow = 1; iRow < 6; iRow++)
    Console.WriteLine("Cell({0},{1}).Value={2}", iRow, iCol, 
      worksheet.Cell(iRow, iCol).Value);

  // output the formula in row 6
  Console.WriteLine("Cell({0},{1}).Formula={2}", 6, iCol, 
    worksheet.Cell(6, iCol).Formula);

} // the using statement calls Dispose() which closes the package.

編集

別のプロジェクト ExcelDataReader があり、両方の形式を処理する機能があるようです。また、私が言及した他のものと同様に簡単です。

他のライブラリもあります。

  • NPOI:Apache POIライブラリの.NETへのポート
    非常に強力で無料のオープンソース。 Excel(97-2010)に加えて、WordおよびPowerPointファイルもサポートしています。

  • ExcelLibrary
    Excel 97-2003(xls)ファイルのみをサポートしています。

  • EPPlus
    ExcelPackageの拡張。使いやすい(推測する)。

56

GSpread.NETを探してください。また、OpenSourceプロジェクトであり、Officeをインストールする必要はありません。 Microsoft ExcelのAPIを使用して、Googleスプレッドシートを操作できます。古いコードを再利用してGoogleスプレッドシートにアクセスしたい場合は、GSpread.NETが最適な方法です。いくつかの行を追加する必要があります。

Set objExcel = CreateObject("GSpreadCOM.Application")
// Name             - User name, any you like
// ClientIdAndSecret - `client_id|client_secret` format
// ScriptId         - Google Apps script ID
app.MailLogon(Name, ClientIdAndSecret, ScriptId);

以降のコードは変更されません。

http://scand.com/products/gspread/index.html

2
miro

XLSXファイルではなくXLSファイルを開く必要がある場合は、 http://npoi.codeplex.com/ が最適です。私たちはそれをプロジェクトに良い影響を与えるために使用しました。

2
Pete McKinney

サーバーで実行する場合は特に、OleDBの使用をお勧めします。長い目で見ればコストがかかる可能性が高い-たとえば、ストアドプロシージャを呼び出すSSISジョブで、OleDBがsptrocのExcelファイルを読み取り、SQLボックスをクラッシュさせ続けていました。 OleDBをsprocから取り出し、サーバーのクラッシュを停止しました。

私が見つけたより良い方法は、Office 2003とXMLファイルでそれを行うことです- Officeのサーバー側オートメーションの考慮事項 に関して。注:Office 2003は、これを実行するための最小要件です。

RefExcelからの読み取り: http://www.roelvanlisdonk.nl/?p=924 (さらに調査してください他の例を見つけるため)

RefExcelスプレッドシートの記述: http://weblogs.asp.net/jgaylord/archive/2008/08/11/use -linq-to-xml-to-generate-Excel-documents.aspx

public void ReadExcelCellTest()
        {
            XDocument document = XDocument.Load(@"C:\BDATA\Cars.xml");
            XNamespace workbookNameSpace = @"urn:schemas-Microsoft-com:office:spreadsheet";

            // Get worksheet
            var query = from w in document.Elements(workbookNameSpace + "Workbook").Elements(workbookNameSpace + "Worksheet")
                        where w.Attribute(workbookNameSpace + "Name").Value.Equals("Settings")
                        select w;
            List<XElement> foundWoksheets = query.ToList<XElement>();
            if (foundWoksheets.Count() <= 0) { throw new ApplicationException("Worksheet Settings could not be found"); }
            XElement worksheet = query.ToList<XElement>()[0];

            // Get the row for "Seat"
            query = from d in worksheet.Elements(workbookNameSpace + "Table").Elements(workbookNameSpace + "Row").Elements(workbookNameSpace + "Cell").Elements(workbookNameSpace + "Data")
                    where d.Value.Equals("Seat")
                    select d;
            List<XElement> foundData = query.ToList<XElement>();
            if (foundData.Count() <= 0) { throw new ApplicationException("Row 'Seat' could not be found"); }
            XElement row = query.ToList<XElement>()[0].Parent.Parent;

            // Get value cell of Etl_SPIImportLocation_ImportPath setting
            XElement cell = row.Elements().ToList<XElement>()[1];

            // Get the value "Leon"
            string cellValue = cell.Elements(workbookNameSpace + "Data").ToList<XElement>()[0].Value;

            Console.WriteLine(cellValue);
        }
2
Jeremy Thompson

最近、Excelブックファイルを DataSet に変換するこのライブラリを見つけました: Excel Data Reader

2
Hand-E-Food

OleDBを試して、Excelファイルからデータを読み取ることができます。次のように試してください。

DataSet ds_Data = new DataSet();
OleDbConnection oleCon = new OleDbConnection();

string strExcelFile = @"C:\Test.xlsx";
oleCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFile + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";;

 string SpreadSheetName = "";

OleDbDataAdapter Adapter = new OleDbDataAdapter();
OleDbConnection conn = new OleDbConnection(sConnectionString);

string strQuery;
conn.Open();

int workSheetNumber = 0;

DataTable ExcelSheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

SpreadSheetName = ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString();

strQuery = "select * from [" + SpreadSheetName + "] ";
OleDbCommand cmd = new OleDbCommand(strQuery, conn);
Adapter.SelectCommand = cmd;
DataSet dsExcel = new DataSet();
Adapter.Fill(dsExcel);
conn.Close();
1
Thit Lwin Oo

私はちょうど解決策を探していて、遭遇しました Spreadsheetlight

とても有望に見えます。オープンソースであり、nugetパッケージとして利用可能です。

1
Nick

私はExcel.dllライブラリを使用しました:

  • オープンソース
  • 軽量
  • fast
  • xlsおよびxlsxと互換性があります

ここで利用可能なドキュメント: https://exceldatareader.codeplex.com/

強くお勧めします。

1
Kunal Kakkad

相互運用機能を使用したくない場合は、 OfficeWriter を試してください。ただし、ファイルに対して実際に行う必要のある処理の量によっては、やり過ぎになる場合があります。無料トライアルをリクエストできます。 ドキュメントサイト で完全にドキュメント化されたAPIを利用できます。

免責事項:私は最新バージョンを作成したエンジニアの一人です。

0
Nick Martin

また、私がやることや、次のような商用コントロールを使用することもできます。 http://www.syncfusion.com/products/reporting-edition/xlsio

商用ソリューションで終わるまで、私は長年苦労してきました。私は最初に開発環境で非常に使いやすいOLEDBアプローチを試しましたが、展開するのは悪夢です。それから私はオープンソースのソリューションを試しましたが、それらのほとんどは時代遅れで、悪いサポートがあります。

Syncfusionのxlsioコントロールは私が使用するものであり、満足していますが、他のものも存在します。努力できるなら、ためらわずに、それが最善の解決策です。どうして?システムとの依存関係がなく、すべてのバージョンのオフィスをすぐにサポートするためです。他の利点の中でも、それは本当に速いです。

そしていや、私は融合のために働いていません;)

0
Jonx