vsto excel工作簿项目:如何快速地将HUGE数据表写入excel表

Ken*_*Ken 4 vsto c#-4.0

我有一个复杂的对象(树结构),我将它展平成一个数据表,以显示在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对象数组而不是数据表并将其写入范围.

Pet*_*eed 5

除了冻结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)


Mat*_*ias 5

我不能谈论为工作使用数据表,但如果你想使用Interop,你肯定希望避免逐个单元格编写.相反,创建一个二维数组,并将其一次写入一个范围,这将为您带来非常显着的性能提升.

您应该考虑的另一个选择是完全避免互操作,并使用OpenXML.如果您使用的是Excel 2007或更高版本,这通常是一种更好的操作文件的方法.