提高Excel文件创build的性能

我有一个TabControl的应用程序。 它得到了一些TabPages ,都有一个DataGridView被填充一个DataTable
一旦TabControl被填充,我想能够导出所有的DataGridViews (或者他们的DataSources ,这是所有的DataTables )到一个Excel文件。
我有以下的代码。 它的工作,但需要近一分钟。

button被点击:

 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的扩展方法取自以下问题 :

 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文件,用户等待一分钟真的没什么好玩的。

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

逐个设置单元格效率非常低。 我build议你一次设置整个表格:

 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; 

或者,至less,要使用更大的和平。

这是正常的,使用COM DLL的Excel是需要时间来做到这一点

尝试这个。 你不需要机器上的excel。 我testing了一下,我用这种方法导出数据到excel 1 000 000行

https://github.com/jsegarra1971/SejExcelExport

完整的例子如何使用它:

http://www.codeproject.com/Tips/829389/Fast-Excel-Import-and-Export

我用了三种方法:

1)写出一个CSV文件,然后将其导入到Excel工作表中。

2)将数据放入剪贴板,用制表符分隔数值,然后粘贴到Excel中(可能使用粘贴特殊 – >无格式)。 你是否能做到这一点显然取决于程序运行的环境。

3)了解和使用OpenXmlWriter。 这比其他任何选项都要灵活得多,但是也有相当的学习曲线。

您可以生成Excel文件而不执行Excel应用程序您可以使用EPPlus库 。 这是一个有很多function的成熟的图书馆