我正在编写 C# 库来读取 Excel 文件,而不需要任何其他依赖项,例如 OLDEB(AccessDatabaseEngine) 库。
所以我选择了 ExcelDataReader 库来读取 .XLS 和 .XLSX 文件。
ExcelDataReader 在我的本地和部署服务器环境中完美地处理这两种文件格式。
我遇到了问题,如何从给定的 Excel 文件中获取所有列名?
我正在编写 C# 库来读取 Excel 文件,而不需要任何其他依赖项,例如 OLDEB(AccessDatabaseEngine) 库。
所以我选择了 ExcelDataReader 库来读取 .XLS 和 .XLSX 文件。
ExcelDataReader 在我的本地和部署服务器环境中完美地处理这两种文件格式。
我遇到了问题,如何从给定的 Excel 文件中获取所有列名?
@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()
});
最简单的方法是同时转换DataTableCollection
and ,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>
因为它们可以追溯到泛型之前的日子。
要使此代码正常工作,您的电子表格必须实际包含已定义的表,而不仅仅是其中包含数据。