使用ExcelDataReader获取Excel表格列名

7

我正在编写C#库,用于读取Excel文件,而不依赖于其他库如OLDEB(AccessDatabaseEngine)。

因此,我选择了ExcelDataReader库来读取.XLS和.XLSX文件。

ExcelDataReader可以完美地在本地和部署服务器环境下使用这两种文件格式。

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


1
你说的列名是指什么?像 Excel 中显示的 A、B、C 这样的吗? - Johan Appelgren
@venkat:你找到这个问题的解决方案了吗? - Alek Davis
2个回答

3

@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()
                          });

1
最简单的方法是将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<T>,因为它们的起源可以追溯到泛型之前的时代,所以需要使用强制转换。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接