之前在另外一篇博文里面介紹了使用NPOI的方式導入導出Excel
其實asp.net提供了相應的dll給我們操作Excel
1.引用Microsoft.Office.Interop.Excel.dll
通過這個dll也是可以導出Excel的,不過這種方式寫起來很麻煩,代碼參考如下

/// <summary> /// 使用Microsoft.Office.Interop.Excel導出 /// </summary> /// <param name="dt"></param> public static void DataTableToExcel(DataTable dt) { if (dt == null) return; Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); if (xlApp == null) { MessageBox.Show("無法創建Excel對象,可能您的電腦未安裝Excel"); return; } System.Windows.Forms.SaveFileDialog saveDia = new SaveFileDialog(); saveDia.Filter = "Excel|*.xlsx"; saveDia.Title = "導出為Excel文件"; saveDia.FileName = DateTime.Now.ToString("yyyyMMddHHmmss"); if (saveDia.ShowDialog() == System.Windows.Forms.DialogResult.OK && !string.Empty.Equals(saveDia.FileName)) { Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 Microsoft.Office.Interop.Excel.Range range = null; long totalCount = dt.Rows.Count; long rowRead = 0; float percent = 0; string fileName = saveDia.FileName; //寫入標題 for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]; range.Font.Bold = true;//粗體 range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//居中 //加邊框 range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null); } //寫入內容 for (int r = 0; r < dt.DefaultView.Count; r++) { for (int i = 0; i < dt.Columns.Count; i++) { worksheet.Cells[r + 2, i + 1] = dt.DefaultView[r][i]; range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[r + 2, i + 1]; range.Font.Size = 9;//字體大小 //加邊框 range.BorderAround(Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous, Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin, Microsoft.Office.Interop.Excel.XlColorIndex.xlColorIndexAutomatic, null); range.EntireColumn.AutoFit();//自動調整列寬 } rowRead++; percent = ((float)(100 * rowRead)) / totalCount; System.Windows.Forms.Application.DoEvents(); } range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideHorizontal].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin; if (dt.Columns.Count > 1) { range.Borders[Microsoft.Office.Interop.Excel.XlBordersIndex.xlInsideVertical].Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin; } try { workbook.Saved = true; workbook.SaveCopyAs(fileName); } catch (Exception ex) { MessageBox.Show("導出文件時出錯,文件可能正被打開!\n" + ex.Message); return; } workbooks.Close(); if (xlApp != null) { xlApp.Workbooks.Close(); xlApp.Quit(); int generation = System.GC.GetGeneration(xlApp); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); xlApp = null; System.GC.Collect(generation); } GC.Collect();//強行銷毀 #region 強行殺死最近打開的Excel進程 System.Diagnostics.Process[] excelProc = System.Diagnostics.Process.GetProcessesByName("EXCEL"); System.DateTime startTime = new DateTime(); int m, killId = 0; for (m = 0; m < excelProc.Length; m++) { if (startTime < excelProc[m].StartTime) { startTime = excelProc[m].StartTime; killId = m; } } if (excelProc[killId].HasExited == false) { excelProc[killId].Kill(); } #endregion } }
2.直接把內容通過SteamWriter字節流寫入到Excel
這種方式我在本地測試是支持xls的,但是xlsx方式會打不開文件,代碼參考如下

/// <summary> /// 使用SteamWriter導出 /// </summary> /// <param name="dt"></param> /// <param name="path"></param> public static void ExportDataTableToExcel(DataTable dt, string path) { KillSpecialExcel(); try { // 實例化流對象,以特定的編碼向流中寫入字符。 StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8); StringBuilder sb = new StringBuilder(); for (int k = 0; k < dt.Columns.Count; k++) { // 添加列名稱 sb.Append(dt.Columns[k].ColumnName.ToString() + "\t"); } sb.Append(Environment.NewLine); // 添加行數據 for (int i = 0; i < dt.Rows.Count; i++) { DataRow row = dt.Rows[i]; for (int j = 0; j < dt.Columns.Count; j++) { // 根據列數追加行數據 sb.Append(row[j].ToString() + "\t"); } sb.Append(Environment.NewLine); } sw.Write(sb.ToString()); sw.Flush(); sw.Close(); sw.Dispose(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { dt.Dispose(); } } /// <summary> /// 結束進程 /// </summary> private static void KillSpecialExcel() { foreach (System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL")) { if (!theProc.HasExited) { bool b = theProc.CloseMainWindow(); if (b == false) { theProc.Kill(); } theProc.Close(); } } }
以上兩種方式都可以,但是都不建議使用,通過NPOI這種第三方插件是最快的,也最方便