c#-4.0 - vsto Excel 工作簿项目 : How to write HUGE datatable into a excel sheet fairly quickly

标签 c#-4.0 vsto

我有一个复杂的对象(树结构),我将其展平到数据表中以将其显示在 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/

相关文章:

C#比较两个集合的更有效方法

arrays - 向右旋转二维数组

c# - 如何创建自定义 Outlook 项目?

ms-office - 部署 VSTO Office 插件时出错

vsto - 如何确定占位符正在使用中?

c# - C# 中的可选委托(delegate)

c# - 类型参数到变量

xml - 为什么 XmlDocument 在 .NET 4 中不是动态的?

c# - Word VSTO 加载项快捷键

excel - 自定义任务 Pane 如何在保持 UI 响应的同时切换可见性?