使用exceldatareader获取Excel工作表列名称

时间:2017-01-11 12:24:01

标签: c# exceldatareader

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

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

ExcelDataReader完全适用于我的本地和部署服务器环境的两种文件格式。

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

2 个答案:

答案 0 :(得分:2)

@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 :(得分:0)

最简单的方法是投射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>,因为它们可以追溯到泛型之前的日子。

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