如何从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”提供程序未在本地计算机上注册。

(这里的问题是,我无法在我的远程testing机器上安装新的软件,所以我无法修复它,需要find其他解决scheme。)

我还需要确保导入的数据将以一种简单的方式存储(我是初学者程序员)让我遍历它,即用行数据创build对象。

其他方法我检查:

  • https://bytescout.com/products/developer/spreadsheetsdk/read-write-excel.html

评论:似乎可能为我工作,但不支持未知尺寸的Excel文件(随机数的行和列)。

  • https://exceldatareader.codeplex.com/

注释:不支持设置不同于第一行的列名称(在我的一些Excel文件中,有4-6个第一行的注释,然后是下面的标题行和数据)。

  • http://blog.fryhard.com/archive/2010/10/28/reading-xlsx-files-using-c-and-epplus.aspx

评论:与上面相同的问题。

  • https://freenetexcel.codeplex.com/

评论:下载的包裹重量超过60MB,它需要我安装在系统上,这是不可能在我的情况。 无论如何,人们评论说它只限于150行。

同时我会尝试检查https://code.google.com/p/linqtoexcel/ ,但其他所有的想法都是值得欢迎的!

编辑:刚才检查LinqToExcel,同上面的问题:

“Microsoft.ACE.OLEDB.12.0”提供程序未在本地计算机上注册。

编辑2:最终,这个解决scheme似乎解决了我的问题:

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

如果您正在从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 your data for (int rowNum = 1; rowNum <= totalRows; rowNum++) //selet 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)); } } 

只有安装了MS Jet引擎(MS Access),才能使用OLE提供程序读取Excel文件。 我注意到你决定使用.NET interop来API,但这不是一个好主意:它需要安装MS Excel,不build议用于服务器自动化。

如果您不需要支持旧的(二进制)Excel格式(xls)并且阅读XLSX就足够了,我build议使用EPPlus库。 它为读写XLSX文件提供了简单而强大的API(并且有很多例子):

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

你也在这台机器上开发吗? 如果不是,我会build议使用OpenXml SDK,您只能在开发人员的机器上安装它 。