【发布时间】:2018-09-06 22:38:15
【问题描述】:
我正在将不同 Excel 文件的第一张表中的数据复制到单个工作簿中。我已经尝试过使用不同的替代方案,如npoi、spire.xls 和Interop,效果很好,但它浪费了我太多的时间。如果有人能给我推荐一个更好的,那将非常感激。在网上翻了很多表格,都找不到。
仅供参考:我的每个文件的大小都超过 50 MB。有些是 10 MB 或更少。
这是我尝试过的一种(使用 Spire.xls):
workbook = new Workbook();
//laod first file
workbook.LoadFromFile(names[0]);
//load the remaining files starting with second file
for (int i = 1; i < cnt; i++)
{
LoadFIle(names[i]);
//merge the loaded file immediately and than load next file
MergeData();
}
private void LoadFIle(string filePath)
{
//load other workbooks starting with 2nd workbbook
tempbook = new Workbook();
tempbook.LoadFromFile(filePath);
}
private void MergeData()
{
try
{
int c1 = workbook.ActiveSheet.LastRow, c2 = tempbook.Worksheets[0].LastRow;
//check if you have exceeded 1st sheet limit
if ((c1 + c2) <= 1048575)
{
//import the second workbook's worksheet into the first workbook using a datatable
//load 1st sheet of tempbook into sheet
Worksheet sheet = tempbook.Worksheets[0];
//copy data from sheet into a datatable
DataTable dataTable = sheet.ExportDataTable();
//load sheet1
Worksheet sheet1 = workbook.Worksheets[workbook.ActiveSheetIndex];
sheet1.InsertDataTable(dataTable, false, sheet1.LastRow + 1, 1);
}
else if ((c1 >= 1048575 && c2 >= 1048575) || c1 >= 1048575 || c2 >= 1048575 || (c1 + c2) >= 1048575)
{
workbook.Worksheets.AddCopy(tempbook.Worksheets[0]);
indx = workbook.ActiveSheet.Index;
workbook.ActiveSheetIndex = ++indx;
}
else
{
//import the second workbook's worksheet into the first workbook using a datatable
//load 1st sheet of tempbook into sheet
Worksheet sheet = tempbook.Worksheets[0];
//copy data from sheet into a datatable
DataTable dataTable = sheet.ExportDataTable();
//load sheet1
Worksheet sheet1 = workbook.Worksheets[workbook.ActiveSheetIndex];
sheet1.InsertDataTable(dataTable, false, sheet1.LastRow + 1, 1);
}
}
catch (IndexOutOfRangeException)
{
}
}
}
嗯,这很好用,但如上所述需要很长时间。欢迎任何建议。提前致谢。
【问题讨论】:
-
我知道这不是您想要的答案,但您为什么要在电子表格中处理大型数据集?数据库擅长这项任务。如果您需要将数据提取到工作表中,Excel 可以查询数据库。
-
@Neil:这是客户要求。帮不上忙。这些文件也来自客户端。
-
客户端可能是错误的。你需要反击并说“要么需要很长时间,要么你应该这样做'这样'会更快”。
-
50MB 不是很多数据。 Excel 可以使用 PowerPivot 处理 许多 百万行数据。它与 SSAS 使用的压缩内存列存储引擎相同。 Excel 的 PowerQuery 几乎是一个完整的 ETL 工具,可以轻松合并来自多个源的数据,包括数据库、Hadoop 等。合并 Excel 源非常容易
-
我猜您使用的是 .xls 文件而不是 .xlsx? Excel 互操作也可以很快,当您只想复制内容时更是如此。就像选择范围一样,将其复制到数组中,在新工作表中选择范围并将其粘贴到那里。这是非常基本的东西。就像你说的:“有一个解决方案,但是需要1天的时间来学习,所以我不尝试,给我一个更好的解决方案”