c# - 提高 Excel 文件创建的性能

标签 c# excel winforms performance iteration

我有一个带有 TabControl 的应用程序。它获得了一些 TabPages,所有这些都有一个 DataGridView,其中填充了一个 DataTable
TabControl 填充后,我希望能够导出所有 DataGridViews(或者更确切地说是它们的 DataSources,它们都是 DataTables) 到一个 Excel 文件中。
我有以下代码。它有效,但需要将近一分钟的时间。

按钮被点击:

private void exportBtn_Click(object sender, EventArgs e)
{
    var result = new List<DataTable>();
    foreach (TabPage page in tabControl1.TabPages)
    {
        var dgv = page.Controls[0] as DataGridView;
        if (dgv == null) continue;
        
        var dt = dgv.DataSource as DataTable;
        if (dt == null) continue;
        dt.TableName = page.Text;

        result.Add(dt);
    }

    ExportServices.ToExcel(result);
}

ExportServices 看起来像这样:

internal static class ExportServices
{
    public static void ToExcel(List<DataTable> tables)
    {
        var excelApp = new Microsoft.Office.Interop.Excel.Application();
        excelApp.Workbooks.Add();

        foreach (var table in tables)
        {
            table.AddSheetToExcelApp(excelApp);
        }
        excelApp.Visible = true;
    }
}

DataTable的扩展方法,摘自this question :

public static void AddSheetToExcelApp(this DataTable Tbl, Microsoft.Office.Interop.Excel.Application excelApp)
{
    try
    {
        if (Tbl == null || Tbl.Columns.Count == 0)
            throw new Exception("ExportToExcel: Null or empty input table!\n");

        // single worksheet
        _Worksheet workSheet = (_Worksheet)excelApp.Sheets.Add();
        workSheet.Name = Tbl.TableName.Remove(5,1);

        // column headings
        for (int i = 0; i < Tbl.Columns.Count; i++)
        {
            workSheet.Cells[1, (i + 1)] = Tbl.Columns[i].ColumnName;
        }
        // rows
        for (int i = 0; i < Tbl.Rows.Count; i++)
        {
            for (int j = 0; j < Tbl.Columns.Count; j++)
            {
                workSheet.Cells[(i + 2), (j + 1)] = Tbl.Rows[i][j];
            }
        }
    }
    catch (Exception ex)
    {
        throw new Exception("ExportToExcel: \n" + ex.Message);
    }
}

正如我所说,这段代码有效。但这样做需要永远。在随机时间暂停程序的执行告诉我,大部分时间它在 //rows 下面的循环中工作。
有什么办法可以加速吗?用户为一个 Excel 文件等待一分钟真的没有多大乐趣。

编辑: 忘了说除了我已经安装的库,我不能使用任何其他库。我们公司正在处理非常敏感的数据,因此我们不允许运行来自“外部世界”的任何代码。

最佳答案

一个一个地设置单元格是非常低效的。我建议您一次设置整个表:

object[,] array = new object[Tbl.Rows.Count,Tbl.Columns.Count]
// Fill the array with values then

workSheet.Range[workSheet.Cells[1, 1], workSheet.Cells[Tbl.Rows.Count, Tbl.Columns.Count]].Value = array;

或者,至少,使用更大的碎片。

关于c# - 提高 Excel 文件创建的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34946059/

相关文章:

Excel下拉列表: quick select?

vb.net - 设置当前日期的格式

c# - PictureBox 中的 DragDrop - DragEnter 永远不会被调用

c# - 人们要求我修复 N+1 错误?

c# - 我的异步功能什么时候完成

c# - 缺少 .NET 4.0 的引用程序集文件夹

c# - 输入箭头键时如何防止MDI子窗体发生变化?

c# - raisepropertychanged 和 PropertyChanged 有什么区别?

.net - 使用 excel 和 Visual Studio 2010 时出现 "Class not registered"错误

c# - 为什么 ListView 框中的项目都挤在一起?