項目中需要將DataTable導(dǎo)出到Excel文件,。 到網(wǎng)上查了查相關(guān)的資料,, 決定采用托管Excel 來實現(xiàn), 很快就完成了,。 正在得意中, 突然發(fā)現(xiàn)Excel進程無法釋放,。 于是深入網(wǎng)絡(luò)查找答案,一會兒讓我找到了一個killExcelProcess() 的方法 它通過調(diào)用Win32 API 在Excel 退出 之后強行殺掉Excel.exe進程,。 在本機測試無誤, 但是一放到服務(wù)器上 ,, 就出現(xiàn)權(quán)限問題,。 只好想別的辦法了。 拜讀網(wǎng)上達人的帖子,一個一個 的試驗,, 花了半天的時間總算搞定,。 下面是我的代碼。 注意看我的注釋,。 public static bool ExportToExcel(DataTable table, string excelName, int[] columnIndexs, string[] columnHeads)
{ #region 將方法中用到的所有Excel變量聲明在方法最開始,,以便最后統(tǒng)一回收。 Excel.ApplicationClass oExcel = new Excel.ApplicationClass(); Excel.Workbook obook = null; Excel.Worksheet oSheet = null; Excel.Range range = null; #endregion try { obook = oExcel.Workbooks.Add(""); oSheet = (Excel.Worksheet)obook.Worksheets[1]; int rCount, cCount; rCount = table.Rows.Count; cCount = table.Columns.Count; object obj = System.Reflection.Missing.Value; if (cCount < columnIndexs.Length || cCount < columnHeads.Length) { throw new ArgumentOutOfRangeException("columnIndexs 與 columnHeads 長度必須一致,。"); } for (int i = 1; i <= columnIndexs.Length; i++) { //Excel.Range = (Excel.Range)oSheet.Columns.get_Item(i, obj); range = (Excel.Range)oSheet.Columns.get_Item(i, obj); range.NumberFormatLocal = "@"; } for (int c = 0; c < columnIndexs.Length; c++) { oSheet.Cells[1, c + 1] = columnHeads[c]; for (int r = 1; r <= rCount; r++) { oSheet.Cells[r + 1, c + 1] = table.Rows[r - 1][columnIndexs[c]].ToString(); } } obook.SaveCopyAs(excelName); //必須調(diào)用 obook.Close(),, 否則無法釋放進程。 obook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value); return true; } catch (Exception ex) { throw ex; } finally { // 調(diào)用System.Runtime.InteropServices.Marshal.ReleaseComObject(object) 方法釋放方法中 //用到的所有的Excel 變量,, 記住是所有的,。 比如說此方法中的range 對象, 就容易被遺忘,。 ystem.Runtime.InteropServices.Marshal.ReleaseComObject(range); System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(obook); // 很多文章上都說必須調(diào)用此方法,, 但是我試過沒有調(diào)用oExcel.Quit() 的情況, 進程也能安全退出,, //還是保留著吧,。 oExcel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel); // 垃圾回收是必須的。 測試如果不執(zhí)行垃圾回收,, 無法關(guān)閉Excel 進程,。 GC.Collect(); } } |
|
來自: mybook564 > 《編程開發(fā)》