我们希望根据特定范围读取Excel工作表数据并将其存储到数据库中。 我们的Excel工作表包含1807列和541行,因此我们无法使用Datatable将数据存储到其中。 另外,我们需要每个单元格检查excel表单,以便将其存储到Datatable中。
目前我们已经使用“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;
}
答案 0 :(得分:0)
这里最好的解决方案是使用OpenXML SDK,这比Interop程序集要快得多。可能知道Interop通过COM工作并且它不能很快,因为你必须为代码中的每个操作调用(例如从单元格读取数据)。 OpenXML SDK在这里是一个很好的解决方案,因为它直接从excel文件读取数据而不需要调用Microsoft Office API,它是免费的。 您可以看到使用OpenXML SDK here读取数据的示例。
答案 1 :(得分:0)
为什么不使用EPPlus或Spreadsheet Light库:
http://spreadsheetlight.com/download/
这两个也可以通过NuGet
获得SO中有大量资源可以帮助您: