.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:最終的に、この解決策は私の問題を解決したようです:
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));
}
}
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
}
オープンソース&無料 ExcelMapperライブラリ(NuGetで利用可能)を提案したいと思います。
Excelファイルを読み取るための従来のアプローチと比較して、はるかに簡潔な(読みやすい)方法を提供します。 OLEクエリまたはMicrosoft.Interop.Office。
1。 Excelファイルが与えられた場合:
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の紹介です。