【问题标题】:How to read from XLSX (Excel)?如何从 XLSX (Excel) 中读取?
【发布时间】:2015-10-23 12:21:55
【问题描述】:

我在读取 .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 行有 cmets,然后是标题行和下面的数据)。

评论:和上面的问题一样。

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

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

编辑:刚刚检查了 LinqToExcel,与上述问题相同:

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

EDIT2:最终,这个解决方案似乎解决了我的问题:

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

【问题讨论】:

标签: c# .net excel


【解决方案1】:

如果你从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));
    }
}

【讨论】:

  • 谢谢!这对我来说是最好的解决方案。我只是对其进行了一些更改,并用 foreach 替换了附加到 stringbuilder。
  • @BlackHat 很高兴它有帮助:)
  • EPPlus 已获得 GNU GPL v3 许可。
【解决方案2】:

只有在安装了 MS Jet 引擎 (MS Access) 的情况下,才可以使用 OLE 提供程序读取 Excel 文件。我注意到您决定使用 .NET 与 API 互操作,但这不是一个好主意:它需要安装 MS Excel,不建议用于服务器上的自动化。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多