【问题标题】:get excel sheet column names using exceldatareader使用 exceldatareader 获取 excel 工作表列名
【发布时间】:2017-01-11 12:24:00
【问题描述】:

我正在编写 C# 库来读取 Excel 文件,而无需任何其他依赖项,例如 OLDEB(AccessDatabaseEngine) 库。

所以我选择了 ExcelDataReader 库来读取 .XLS 和 .XLSX 文件。

ExcelDataReader 在我的本地和部署服务器环境中完美地处理这两种文件格式。

我遇到了问题,如何从给定的 Excel 文件中获取所有列名?

【问题讨论】:

  • 列名是什么意思?像 Excel 中显示的 A、B、C 还是?
  • @venkat:你找到解决方案了吗?

标签: c# exceldatareader


【解决方案1】:

@Kevin 的答案相同,但需要设置 ExcelDataReader 以使用标题行作为列标题。 代码如下所示:

var stream = File.Open(@"C:\temp\Book1.xlsx", FileMode.Open, FileAccess.Read);

var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

var result = reader.AsDataSet(new ExcelDataSetConfiguration() {
ConfigureDataTable = (_) => new ExcelDataTableConfiguration() {
    UseHeaderRow = true
}
});

var tables = result.Tables
                   .Cast<DataTable>()
                   .Select(t => new {
                                     TableName = t.TableName,
                                     Columns = t.Columns
                                                .Cast<DataColumn>()
                                                .Select(x => x.ColumnName)
                                                .ToList()
                          });

【讨论】:

    【解决方案2】:

    最简单的方法是同时转换 DataTableCollectionDataColumnCollection,这样您就可以对它们使用普通的 Linq 查询。

    例如:

    var stream = File.Open(@"C:\temp\Book1.xlsx", FileMode.Open, FileAccess.Read);
    
    var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
    
    var result = excelReader.AsDataSet();
    
    var tables = result.Tables
                       .Cast<DataTable>()
                       .Select(t => new {
                                         TableName = t.TableName,
                                         Columns = t.Columns
                                                    .Cast<DataColumn>()
                                                    .Select(x => x.ColumnName)
                                                    .ToList()
                              });
    

    强制转换的原因是因为DataTableCollectionDataColumnCollection 只实现IEnumerable 而不是IEnumerable&lt;T&gt;,因为它们可以追溯到泛型之前的日子。

    要使此代码正常工作,您的电子表格必须实际包含已定义的表,而不仅仅是其中包含数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      相关资源
      最近更新 更多