我有一个复杂的对象(树结构),我将它展平成一个数据表,以显示在Excel工作表上.数据表很大,有大约20000行和10000列.
一次一个地将数据写入excel单元需要永远.因此,我将复杂对象转换为数据表,然后使用下面的代码将其写入excel表.
是否可以在不到一分钟或<5分钟内相当快速地将20K行x 10K列数据写入excel表?什么是快速完成这项任务的最佳技术.
环境: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();
Run Code Online (Sandbox Code Playgroud)
最终解决方案:使用2D对象数组而不是数据表并将其写入范围.
除了冻结Excel的动画之外,你可以在给定数据来源的情况下,通过Excel.Range对象来循环,这必然会成为一个瓶颈,而不是写入Datatable,写入一个string[,],Excel可以使用Range马上写一个.循环通过a 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;
Run Code Online (Sandbox Code Playgroud)
我不能谈论为工作使用数据表,但如果你想使用Interop,你肯定希望避免逐个单元格编写.相反,创建一个二维数组,并将其一次写入一个范围,这将为您带来非常显着的性能提升.
您应该考虑的另一个选择是完全避免互操作,并使用OpenXML.如果您使用的是Excel 2007或更高版本,这通常是一种更好的操作文件的方法.
| 归档时间: |
|
| 查看次数: |
3181 次 |
| 最近记录: |