我有一个带有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/

10-11 01:00