使用格式化从datagridview生成Excel的最快方法

我有一个代码从datagridview 导出数据到Excel工作表,但问题是它是非常缓慢,因为它插入数据和格式化每个单元格

我该如何提高这个操作的性能?

以下是我的代码

 public static void ExcelExport(DataGridView Dg, string TypePass) { Microsoft.Office.Interop.Excel.ApplicationClass ExcelApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); ExcelApp.Application.Workbooks.Add(Type.Missing); Excel_12.ApplicationClass oExcel_12 = null; //Excel_12 Application Excel_12.Workbook oBook = null; // Excel_12 Workbook Excel_12.Sheets oSheetsColl = null; // Excel_12 Worksheets collection Excel_12.Worksheet oSheet = null; // Excel_12 Worksheet Excel_12.Range oRange = null; // Cell or Range in worksheet Object oMissing = System.Reflection.Missing.Value; oExcel_12 = new Excel_12.ApplicationClass(); oExcel_12.UserControl = true; oBook = oExcel_12.Workbooks.Add(oMissing); oSheetsColl = oExcel_12.Worksheets; oSheet = (Excel_12.Worksheet)oSheetsColl.get_Item("Sheet1"); oRange = (Excel_12.Range)oSheet.Cells[1, 1]; oRange.Value2 = ""; oRange.Font.Name = "Tahoma"; oRange.Font.Size = 12; (oRange).Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.White); (oRange).Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Gray); if (TypePass.Trim().Length > 0) { oRange = (Excel_12.Range)oSheet.Cells[2, 1]; oRange.Value2 = TypePass; oRange.Font.Name = "Tahoma"; oRange.Font.Size = 10; } int c = 0; if (Dg.ColumnHeadersVisible == true) { for (int j = 0; j < Dg.Columns.Count; j++) { if (Dg.Columns[j].Visible == true) { oRange = (Excel_12.Range)oSheet.Cells[4, c + 1]; oRange.Value2 = Dg.Columns[j].HeaderText + " "; oRange.Font.Bold = true; oRange.Font.Name = "Tahoma"; oRange.Font.Size = 9; (oRange).Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.White); (oRange).Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Teal); oExcel_12.Columns.AutoFit(); c++; } } } c = 0; for (int i = 0; i < Dg.Rows.Count; i++) { for (int j = 0; j < Dg.Columns.Count; j++) { if (Dg.Columns[j].Visible == true) { oRange = (Excel_12.Range)oSheet.Cells[i + 5, c + 1]; if (Dg[j, i].Value == null) { oRange.Value2 = " "; } else { oRange.Value2 = Dg[j, i].Value.ToString().Replace('\n', ' ') + " "; } oRange.Borders.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black); oRange.Font.Name = "Tahoma"; oRange.Font.Size = 8; oExcel_12.Columns.AutoFit(); // oRange.NumberFormat = "dd/MM/yyyy"; c++; } } c = 0; } oExcel_12.Visible = true; oBook = null; oExcel_12 = null; GC.Collect(); } 

如果你喜欢,你可以使用Open XML SDK 。

我已经使用Open XML导出数据到Excel电子表格(.XLSX格式),我可以保证性能是伟大的。

  • 我可以在2秒钟内生成50,000个单元格的电子表格

  • 在60秒内有1百万个单元电子表格[这是10,000行100列电子表格]

你需要知道的是:

  • 精简电子表格的结构
  • 按照给定的指南在这里和这里
  • 了解造型[种类的PRO水平,使许多可能性]
  • 使用Open XML生产力工具 ; 将缓解你的学习曲线指南

优点:

  • 您可以创build格式良好的Excel表单,而无需安装Office程序包。
  • 如果你愿意的话,你甚至可以将电子表格生成到服务器端。
  • 起初,与InterOp相比,你会觉得很难,但是一旦你正确实施了,你将能够使用相同的Excel电子表格function来执行任何项目。

如果您决定坚持使用Microsoft.Office.Interop.Excel,则可以通过正确设置范围内的格式和数据来使用代码。

  1. 设置1行的标题样式
  2. 从列*行设置内容样式
  3. 从DataGridView单元格值构build数组然后将其写入范围是一种非常快速的方法: 将数组写入Excel范围

顺便说一下,GC.Collect不能用于closuresCOM对象,请参考C#中COM对象的正确处理,特别是MS Office应用程序

MS Office Interop速度很慢,甚至Microsoft不推荐在服务器端使用Interop。 有关更多详细信息,请参阅Microsoft 为何不使用OLE自动化所述 。

Microsoft Excel在Office 2007中发布了XLSX文件格式,并build议使用OpenXML SDK而不是Interop。

如果您必须以XLS文件格式保存Excel文件,则可以使用EasyXLS之类的Excel库。

将以下代码示例作为将DataGridView导出到Excel的替代方法:

 // Create a DataSet and add the DataTable of DataGridView DataSet dataSet = new DataSet(); dataSet.Tables.Add((DataTable)dataGridView);//or ((DataTable)dataGridView.DataSource).Copy() to create a copy // Export Excel file ExcelDocument workbook = new ExcelDocument(); workbook.easy_WriteXLSFile_FromDataSet(filePath, dataSet, new EasyXLS.ExcelAutoFormat(EasyXLS.Constants.Styles.AUTOFORMAT_EASYXLS1), "Sheet1"); 

为了导出您需要的格式,您可以创build自己的ExcelAutoFormat。 查看这个代码示例, 了解如何使用C#格式将datagridview导出到Excel 。