DataTable数据存入指定路径Excel文件(套用Excel模板)
如题,此方法将DataTable的数据存入指定路径的Excel文件中,并套用现成的Excel模板的样式来显示数据,可以通过每个Sheet中指定写入的行数,来将数据写到不同的sheet中,类似数据分页的功能。
具体如下:
1 /// <summary> 2 /// 将DataTable数据写入Excel文件(套用模板并分页) 3 /// </summary> 4 /// <param name="dt">DataTable</param> 5 /// <param name="rows">每个WorkSheet写入多少行数据</param> 6 /// <param name="top">行索引</param> 7 /// <param name="left">列索引</param> 8 /// <param name="sheetPrefixName">WorkSheet前缀名,比如:前缀名为“Sheet”,那么WorkSheet名称依次为“Sheet-,Sheet-”</param> 9 public void DataTableToExcel(DataTable dt, int rows, int top, int left, string sheetPrefixName, Label lb) 10 { 11 int rowCount = dt.Rows.Count; //源DataTable行数 12 int colCount = dt.Columns.Count; //源DataTable列数 13 int sheetCount = this.GetSheetCount(rowCount, rows); //WorkSheet个数 14 DateTime beforeTime; 15 DateTime afterTime; 16 17 if (sheetPrefixName == null || sheetPrefixName.Trim() == "") 18 sheetPrefixName = "Sheet"; 19 20 //创建一个Application对象并使其可见 21 beforeTime = DateTime.Now; 22 Excel.Application app = new Excel.Application(); 23 app.Visible = false; 24 afterTime = DateTime.Now; 25 26 //打开模板文件,得到WorkBook对象 27 Excel.Workbook workBook = app.Workbooks.Open(templetFile, missing, missing, missing, missing, missing, 28 missing, missing, missing, missing, missing, missing, missing); 29 30 //得到WorkSheet对象 31 Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets.get_Item(1); 32 33 //复制sheetCount-个WorkSheet对象 34 for (int i = 1; i < sheetCount; i++) 35 { 36 ((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing, workBook.Worksheets[i]); 37 } 38 39 //将源DataTable数据写入Excel#region 将源DataTable数据写入Excel 40 for (int i = 1; i <= sheetCount; i++) 41 { 42 int startRow = (i - 1) * rows; //记录起始行索引 43 int endRow = i * rows; //记录结束行索引 44 45 //若是最后一个WorkSheet,那么记录结束行索引为源DataTable行数 46 if (i == sheetCount) 47 endRow = rowCount; 48 49 50 //获取要写入数据的WorkSheet对象,并重命名 51 Excel.Worksheet sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i); 52 sheet.Name = sheetPrefixName + "-" + i.ToString(); 53 54 //将dt中的数据写入WorkSheet 55 for (int j = 0; j < endRow - startRow; j++) 56 { 57 for (int k = 0; k < colCount; k++) 58 { 59 sheet.Cells[top + j, left + k] = dt.Rows[startRow + j][k].ToString(); 60 } 61 lb.Text = "Saving lines: " + sheet.Name + "+" + (1 + j) + "/" + (dt.Rows.Count); 62 } 63 } 64 65 //输出Excel文件并退出 66 try 67 { 68 workBook.SaveAs(outputFile, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive, missing, missing, missing, missing); 69 workBook.Close(null, null, null); 70 app.Workbooks.Close(); 71 app.Application.Quit(); 72 app.Quit(); 73 74 System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet); 75 System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook); 76 System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 77 78 workSheet = null; 79 workBook = null; 80 app = null; 81 82 GC.Collect(); 83 } 84 catch (Exception e) 85 { 86 throw e; 87 } 88 finally 89 { 90 Process[] myProcesses; 91 DateTime startTime; 92 myProcesses = Process.GetProcessesByName("Excel"); 93 94 //得不到Excel进程ID,暂时只能判断进程启动时间 95 foreach (Process myProcess in myProcesses) 96 { 97 startTime = myProcess.StartTime; 98 99 if (startTime > beforeTime && startTime < afterTime) 100 { 101 myProcess.Kill(); 102 } 103 } 104 } 105 106 }