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

时间:2011-12-22 16:45:50

标签: c#-4.0 vsto

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

3 个答案:

答案 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,它会有所帮助。