我正在编写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
和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>
,因为它们的起源可以追溯到泛型之前的时代,所以需要使用强制转换。
为了使此代码正常工作,您的电子表格必须实际包含已定义的表,而不仅仅是其中的数据。