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