我有一个复杂的对象(树结构),我将它展平成一个数据表,以便在excel表上显示它。数据表很大,有大约20000行和10000列。
将数据一次一个地写入excel单元格需要永远。所以,我正在将复杂对象转换为数据表,然后使用下面的代码将其写入excel表。
是否有可能在不到一分钟或相当快的时间内将20K行×10K列数据写入excel表。 5分钟?什么是快速完成这项任务的最佳技术。
环境:Visual Studio 2010,VSTO excel工作簿项目,.net framework 4.0,excel 2010/2007
编辑:
原始数据源是json格式的休息服务响应。然后我将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 Object数组而不是datatable并将其写入范围。
答案 0 :(得分:5)
除了冻结Excel的动画之外,你可以根据它来自的数据源,通过Excel.Range
对象来保存循环,这必然是一个瓶颈,而不是写入{ {1}},写入Datatable
,Excel可以用来立即写入string[,]
。循环遍历Range
比循环遍历Excel单元格要快得多。
string[,]
答案 1 :(得分:5)
我不能谈论为工作使用数据表,但如果你想使用Interop,你肯定想避免逐个单元地编写。取而代之的是create a 2-d array, and write it at once to a range,它将为您带来非常显着的性能提升。
您应该考虑的另一个选择是完全避免互操作,并使用OpenXML。如果您使用的是Excel 2007或更高版本,这通常是一种更好的操作文件的方法。
答案 2 :(得分:1)
VSTO总是会耗费时间,我可以与你分享的最佳提示是在填充数据时禁用工作表刷新,一种方法是弹出“模态”进度对话框并在后台刷新工作表,这将使您的性能提高50-70%。你可以做的另一件事是将VS更新为sp1,它会有所帮助。