提高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的成熟的图书馆