我想将Excel工作表的内容读入C#DataTable。 Excel工作表可以包含可变数量的列和行。 Excel工作表中的第一行始终包含列名,但其他行可能为空。
我在这里看到的所有建议都假定存在Microsoft.ACE.OLEDB
。我没有在我的系统上安装此库,因为当我尝试其中一些解决方案时,我收到此错误。
Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
考虑到我安装了Office 2016,这很奇怪。
出于这个原因,我希望通过Nuget使用ClosedXML库,但我没有在他们的维基中看到任何用C#读取Excel工作表到Excel中的示例。
答案 0 :(得分:6)
这个例子不是我的。我不记得我从哪里得到它,因为它在我的档案中。但是,这对我有用。我遇到的唯一问题是空白单元格。根据{{3}},它与Excel有关,无法跟踪不受数据限制的空单元格。我发现,如果我将数据添加到单元格中,然后删除相同的数据,则该过程可以正常工作。
public static DataTable ImportExceltoDatatable(string filePath, string sheetName)
{
// Open the Excel file using ClosedXML.
// Keep in mind the Excel file cannot be open when trying to read it
using (XLWorkbook workBook = new XLWorkbook(filePath))
{
//Read the first Sheet from Excel file.
IXLWorksheet workSheet = workBook.Worksheet(1);
//Create a new DataTable.
DataTable dt = new DataTable();
//Loop through the Worksheet rows.
bool firstRow = true;
foreach (IXLRow row in workSheet.Rows())
{
//Use the first row to add columns to DataTable.
if (firstRow)
{
foreach (IXLCell cell in row.Cells())
{
dt.Columns.Add(cell.Value.ToString());
}
firstRow = false;
}
else
{
//Add rows to DataTable.
dt.Rows.Add();
int i = 0;
foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber, row.LastCellUsed().Address.ColumnNumber))
{
dt.Rows[dt.Rows.Count - 1][i] = cell.Value.ToString();
i++;
}
}
}
return dt;
}
}
需要添加
using System.Data;
using ClosedXML.Excel;
以及ClosedXML nuget包
答案 1 :(得分:1)
使用此代码,您可以阅读excel工作表的内容。您可以指定工作表的名称或编号,一个数据集将与工作表的内容一起返回。
if (!result) result = await getResult();
return result;