gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:27 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com