C# 按范围阅读Excel表格
我们需要根据一定的范围读取excel表格数据,并将其存储到数据库中。 我们的excel工作表包含1807列541行,所以我们不能使用Datatable将数据存储到其中。 此外,我们还需要检查每个单元格的excel工作表,以便将其存储到数据表中 目前,我们已经使用Microsoft.Office.Interop.Excel组件来读取Excel工作表数据。但在使用该组件时,从excel工作表读取数据需要很长时间,我们希望使其快速处理。 我们也用NPOI进行了尝试,但我们没有获得任何获取范围数据的选项 , 所以,我们只想知道有没有其他的组件可以做这个 下面是我们尝试过的代码:C# 按范围阅读Excel表格,c#,excel,npoi,C#,Excel,Npoi,我们需要根据一定的范围读取excel表格数据,并将其存储到数据库中。 我们的excel工作表包含1807列541行,所以我们不能使用Datatable将数据存储到其中。 此外,我们还需要检查每个单元格的excel工作表,以便将其存储到数据表中 目前,我们已经使用Microsoft.Office.Interop.Excel组件来读取Excel工作表数据。但在使用该组件时,从excel工作表读取数据需要很长时间,我们希望使其快速处理。 我们也用NPOI进行了尝试,但我们没有获得任何获取范围数据的选项
public System.Data.DataTable getCellRangeValueAsDataTable(string filename, string startCell, string endCell)
{
System.Data.DataTable newTable = new System.Data.DataTable();
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
string result = "";
Workbook wb = xlApp.Workbooks.Open(filename,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing);
Worksheet ws = (Worksheet)wb.Worksheets[2];
Range aRange = ws.get_Range(startCell, endCell);
for (int cCnt = 1; cCnt <= aRange.Columns.Count; cCnt++)
{
newTable.Columns.Add("String" + cCnt, typeof(string));
}
for (int rCnt = 1; rCnt <= aRange.Rows.Count; rCnt++)
{
object[] objArr = new object[aRange.Columns.Count];
for (int cCnt = 1; cCnt <= aRange.Columns.Count; cCnt++)
{
objArr[cCnt - 1] = (aRange.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Value;
}
newTable.Rows.Add(objArr);
}
return newTable;
}
public System.Data.DataTable getCellRangeValueAsDataTable(字符串文件名、字符串startCell、字符串endCell)
{
System.Data.DataTable newTable=新的System.Data.DataTable();
Microsoft.Office.Interop.Excel.Application xlApp=新的Microsoft.Office.Interop.Excel.Application();
字符串结果=”;
工作簿wb=xlApp.Workbooks.Open(文件名,
类型。缺失,类型。缺失,类型。缺失,类型。缺失,类型。缺失,
类型。缺失,类型。缺失,类型。缺失,类型。缺失,类型。缺失,
类型。缺失,类型。缺失,类型。缺失,类型。缺失,类型。缺失,
类型。缺失,类型。缺失);
工作表ws=(工作表)wb.工作表[2];
Range aRange=ws.get_Range(起始单元格、结束单元格);
对于(int-cCnt=1;cCnt这里最好的解决方案是使用,这将比Interop程序集快得多。正如我们所知,Interop通过COM工作,它不能太快,因为您必须调用代码中的每个操作(例如从单元格读取数据)。OpenXML SDK在这里是一个很好的解决方案,因为它可以直接从excel文件读取数据,而无需调用Microsoft Office API,而且是免费的。
您可以看到使用OpenXML SDK读取数据的示例。为什么不使用ePlus或电子表格库:
这两个都可以通过NuGet获得
在整个过程中,有大量资源可以帮助您:
可能的副本也值得一读。