經過對Excel深入瞭解,採用資料寫入到range的方法,效率更高,更明顯;與常用的逐儲存格寫有所不同,可查看[C#]WinForm中DataGrid擴充 - 匯出Excel檔案 (1)
本例的實現方式以[C#]WinForm中DataGrid擴充 - 匯出Excel檔案 (1)相似。
1public bool ExportExcel(string p_ReportName)
2 {
3 if ( this.TableStyles.Count == 0 ) return false;
4 DataGridTableStyle ts = this.TableStyles[0];
5
6 // 建立Excel對象 --LeeWenjie 2006-11-29
7 Excel.Application xlApp = new Excel.ApplicationClass();
8 if ( xlApp == null )
9 {
10 MessageBox.Show("Excel無法啟動");
11 return false;
12 }
13 // 建立Excel工作薄
14 Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
15 Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[1];
16
17 // 設定標題
18 Excel.Range range = xlSheet.get_Range(xlApp.Cells[1,1],xlApp.Cells[1,ts.GridColumnStyles.Count]);
19 range.MergeCells = true;
20 xlApp.ActiveCell.FormulaR1C1 = p_ReportName;
21 xlApp.ActiveCell.Font.Size = 20;
22 xlApp.ActiveCell.Font.Bold = true;
23 xlApp.ActiveCell.HorizontalAlignment = Excel.Constants.xlCenter;
24
25 // 列索引,行索引,總列數,總行數
26 int colIndex = 0;
27 int RowIndex = 0;
28 int colCount = ts.GridColumnStyles.Count;
29 int RowCount = this.BindingContext[this.DataSource,this.DataMember].Count;
30
31 // 建立快取資料
32 object[,] objData = new object[RowCount + 1, colCount ];
33 // 擷取欄位標題
34 foreach(DataGridColumnStyle cs in ts.GridColumnStyles)
35 {
36 objData[RowIndex,colIndex++] = cs.HeaderText;
37 }
38 // 擷取資料
39 for(RowIndex =1;RowIndex< RowCount;RowIndex++)
40 {
41 for(colIndex=0;colIndex < colCount;colIndex++)
42 {
43 objData[RowIndex,colIndex] = this[RowIndex-1,colIndex];
44 }
45 Application.DoEvents();
46 }
47 // 寫入Excel
48 range = xlSheet.get_Range(xlApp.Cells[2,1],xlApp.Cells[RowCount,colCount]);
49 range.Value2 = objData;
50
51 // 儲存
52 try
53 {
54 xlBook.Saved = true;
55 xlBook.SaveCopyAs("D://Fly" + DateTime.Now.ToString("yyyyMMdd") + ".xls");
56 }
57 catch
58 {
59 MessageBox.Show("儲存出錯,請檢查!");
60 return false;
61 }
62 finally
63 {
64 xlApp.Quit();
65 GC.Collect();
66 }
67 return true;
68 }
開發環境:
VS.Net 2003
改進後,效率提高N倍,8000條資料大約需要2秒。
**************************************