我有一个复杂的对象(树结构),我将其展平到数据表中以将其显示在 Excel 工作表上。数据表很大,大约有 20000 行和 10000 列。
一次将数据写入 Excel 单元格需要很长时间。因此,我将复杂对象转换为数据表,然后使用下面的代码将其写入 Excel 工作表。
是否可以在不到一分钟或 < 5 分钟的时间内相当快地将 20K 行 x 10K 列数据写入 Excel 工作表?快速完成这项任务的最佳技术是什么。
环境:Visual studio 2010、VSTO Excel 工作簿项目、.net Framework 4.0、Excel 2010/2007
编辑:
原始数据来源是 json 格式的 REST 服务响应。然后,我将 json 响应反序列化为 C# 对象,最后将其展平为数据表。
使用此代码将数据表写入 Excel 工作表:
Excel.Range oRange;
var oSheet = Globals.Sheet3;
int rowCount = 1;
foreach (DataRow dr in resultsDataTable.Rows)
{
rowCount += 1;
for (int i = 1; i < resultsDataTable.Columns.Count + 1; i++)
{
// Add the header the first time through
if (rowCount == 2)
{
oSheet.Cells[1, i] = resultsDataTable.Columns[i - 1].ColumnName;
}
oSheet.Cells[rowCount, i] = dr[i - 1].ToString();
}
}
// Resize the columns
oRange = oSheet.get_Range(oSheet.Cells[1, 1],
oSheet.Cells[rowCount, resultsDataTable.Columns.Count]);
oRange.EntireColumn.AutoFit();
最终解决方案: 使用 2D 对象数组而不是数据表并将其写入范围。
最佳答案
除了卡住 Excel 的动画之外,根据给定的数据源,您还可以通过 Excel.Range
对象来避免循环,这必然会成为瓶颈。写入 Datatable
的方法是写入 string[,]
,Excel 可以使用该字符串立即写入 Range
。循环遍历 string[,]
比循环遍历 Excel 单元格快得多。
string[,] importString = new string[yourJsonSource.Rows.Count, yourJsonSource.Columns.Count];
//populate the string[,] however you can
for (int r = 0; r < yourJsonSource.Rows.Count; r++)
{
for (int c = 0; c < yourJsonSource.Columns.Count; c++)
{
importString[r, c] = yourJsonSource[r][c].ToString();
}
}
var oSheet = Globals.Sheet3;
Excel.Range oRange = oSheet.get_Range(oSheet.Cells[1, 1],
oSheet.Cells[yourJsonSource.Rows.Count, yourJsonSource.Columns.Count]);
oRange.Value = importString;
关于c#-4.0 - vsto Excel 工作簿项目 : How to write HUGE datatable into a excel sheet fairly quickly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8607105/