如何阅读XLSX(Excel)?

时间:2015-10-23 12:21:56

标签: c# .net 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://freenetexcel.codeplex.com/,但所有其他想法都非常受欢迎!

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

  

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

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

https://code.google.com/p/linqtoexcel/

3 个答案:

答案 0 :(得分:26)

如果您正在从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));
    }
}

答案 1 :(得分:2)

只有安装了MS Jet引擎(MS Access),才能使用OLE提供程序读取Excel文件。我注意到你决定使用.NET interop到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
}

答案 2 :(得分:2)

我想建议开源和免费的ExcelMapper 库(在NuGet上可用)。

与例如通过以下方式更传统的方法相比,它提供了一种更简洁(即可读)的读取Excel文件的方式。 OLE查询或Microsoft.Interop.Office。

1。给定一个Excel文件

enter image description here

2。创建一个Person C#对象:

AXWindow

3。使用ExcelMapper进行阅读

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

您还可以通过简单地传入一个额外的工作表参数来读取其他工作表:

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

您可以使用NuGet进行安装

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

免责声明:我没有与ExcelMapper关联,但是在尝试了各种不同的库之后,我发现该库最容易使用。

这里是一个免费的简短video展示ExcelMapper。 instructional video - how to read excel files in c# (来源:excel-automation-guide.com