web-dev-qa-db-ja.com

XLSX(Excel)から読み取る方法

.xlsx(Excel)ファイルからの読み取りに問題があります。私は使用しようとしました:

var fileName = @"C:\automated_testing\ProductsUploadTemplate-2015-10-22.xlsx";
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();
adapter.Fill(ds, "XLSData");
DataTable data = ds.Tables["XLSData"];

// ... Loop over all rows.
StringBuilder sb = new StringBuilder();
foreach (DataRow row in data.Rows)
{
    sb.AppendLine(string.Join(",", row.ItemArray));
}

しかし、connectionStringが原因で失敗した場合。そこで、.xlsxをサポートするように行を更新しました。

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", fileName);

しかし、私は得る:

「Microsoft.ACE.OLEDB.12.0」プロバイダーがローカルマシンに登録されていません。

(ここでの問題は、リモートテストマシンに新しいソフトウェアをインストールできないため、修正できず、他のソリューションを見つける必要があることです。)

また、インポートされたデータが単純な方法で保存されていることを確認する必要があります(私は初心者プログラマーです)、それを反復させる、つまり行のデータでオブジェクトを作成します。

私がチェックした他のアプローチ:

コメント:おそらく私にはうまくいくようですが、未知の次元(行と列のランダムな数)のExcelファイルをサポートしていません。

コメント:最初の行とは異なる行の設定列名をサポートしていません(Excelファイルの一部では、最初の行に4-6のコメントがあり、ヘッダー行と下のデータです)。

コメント:上記と同じ問題。

コメント:ダウンロードしたパッケージの重量は60MBを超えていたため、システムにインストールする必要がありますが、これは私の状況では不可能です。とにかく、人々は150行に制限されているとコメントしています。

一方、私は https://code.google.com/p/linqtoexcel/ をチェックしようとしますが、他のすべてのアイデアは大歓迎です!

編集:LinqToExcelをチェックしたところ、上記と同じ問題:

「Microsoft.ACE.OLEDB.12.0」プロバイダーがローカルマシンに登録されていません。

EDIT2:最終的に、この解決策は私の問題を解決したようです:

https://stackoverflow.com/a/19065266/3146582

20

Excelファイルからデータを読み取る場合は、EPPlus NuGetパッケージを使用して、次のコードを使用できます。

//using OfficeOpenXml;
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(@"C:\YourDirectory\sample.xlsx")))
{
    var myWorksheet = xlPackage.Workbook.Worksheets.First(); //select sheet here
    var totalRows = myWorksheet.Dimension.End.Row;
    var totalColumns = myWorksheet.Dimension.End.Column;

    var sb = new StringBuilder(); //this is your data
    for (int rowNum = 1; rowNum <= totalRows; rowNum++) //select starting row here
    {
        var row = myWorksheet.Cells[rowNum, 1, rowNum, totalColumns].Select(c => c.Value == null ? string.Empty : c.Value.ToString());
        sb.AppendLine(string.Join(",", row));
    }
}
28
Arghya C

OLEプロバイダーでExcelファイルを読み取ることは、MS Jetエンジン(MS Access)がインストールされている場合にのみ可能です。NETinteropをAPIに使用することにしました。 MS Excelをインストールする必要があり、サーバーの自動化に使用することはお勧めしません。

古い(バイナリ)Excel形式(xls)をサポートする必要がなく、XLSXを読むだけで十分な場合は、 EPPlus libraryを使用することをお勧めします。 XLSXファイルの読み取りと書き込みの両方にシンプルで強力なAPIを提供します(そして多くの例があります):

var existingFile = new FileInfo(filePath);
// Open and read the XlSX file.
using (var package = new ExcelPackage(existingFile)) {
   // access worksheets, cells etc
}
2

オープンソース&無料 ExcelMapperライブラリ(NuGetで利用可能)を提案したいと思います。

Excelファイルを読み取るための従来のアプローチと比較して、はるかに簡潔な(読みやすい)方法を提供します。 OLEクエリまたはMicrosoft.Interop.Office。

1。 Excelファイルが与えられた場合

enter image description here

2.Person C#オブジェクトの作成:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
}

3.ExcelMapperを使用して読む

  var fileName = @"C:\Temp\Names.xlsx"; // your Excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>();

追加のシート引数を渡すだけで、他のワークシートから読み取ることもできます。

  var fileName = @"C:\Temp\Names.xlsx"; // your Excel file
  List<Person> people = new ExcelMapper(fileName).Fetch<Person>("Sheet2");

NuGetを使用してインストールできます

Install-Package ExcelMapper

免責事項:ExcelMapperとは関係ありませんが、さまざまなライブラリを試した後、このライブラリが最も使いやすいことがわかりました。

こちらが無料の短い video ExcelMapperの紹介です。 instructional video - how to read Excel files in c#