6

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

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

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

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

4

2 回答 2

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()
                          });
于 2020-02-24T10:17:47.900 回答
1

最简单的方法是同时转换DataTableCollectionand ,DataColumnCollection这样您就可以对它们使用普通的 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()
                          });

强制转换是必要的原因是因为两者都DataTableCollection只是DataColumnCollection实现IEnumerable,而不是IEnumerable<T>因为它们可以追溯到泛型之前的日子。

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

于 2017-01-12T09:24:56.057 回答