一、需求
遇到這樣一個需求,主管要對多個客服的工作質量審核,要求審核完成后,對應的客服的好中差評的審核結果對應到一個表格的不同sheet單元表中。

二、思路
先聲明一個DataSet,把每個客服的DataTable通過DataSet的Add方法來添加進來,並且把每個表的名字命名為客服的名字(通過TableName方法實現),然后通過遍歷DataSet的每個表以及每個表的行列來添加到Excel里面,在把數據保存到服務器上,然后把Exce文件下載下來,最后刪除Excel文件。
三、准備
運用到一個dll,在設計導出類之前,先引入dll(我會把dll 共享一下,注意其版本,我用的是10.0),下載地址:
http://files.cnblogs.com/lzhp/microsoft.office.interop.excel%E5%90%84%E4%B8%AA%E7%89%88%E6%9C%AC.7z
,以及命名空間:
using System.IO; using Microsoft.Office.Interop.Excel; using System.Reflection;
四、主要代碼
只要列出導出Excel的方法
#region Excel導出多個客服,不同的客服在不同的sheet里 public static void ToManySheetExcel(DataSet ds, string strExcelFileName, System.Web.UI.Page page) { Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); string path = ""; if (excel == null) { MessageBox.Show("無法創建Excel對象,可能您的機子未安裝Excel"); return; } try { excel.Visible = false; //設置禁止彈出保存和覆蓋的詢問提示框 excel.DisplayAlerts = false; excel.AlertBeforeOverwriting = true; //增加一個工作簿 Workbook book = excel.Workbooks.Add(true); //添加工作表 其中ds.Tables.Count.ToString()為要創建的sheet的個數 Worksheet sheets = (Microsoft.Office.Interop.Excel.Worksheet) book.Worksheets.Add(Missing.Value, Missing.Value, Convert.ToInt32(ds.Tables.Count.ToString()), Microsoft.Office.Interop.Excel.XlSheetType.xlWorksheet); //開始遍歷ds中的各個dataTable for (int i = 0; i < ds.Tables.Count; i++) { System.Data.DataTable table = ds.Tables[i]; //HttpContext.Current.Response.Write(ds.Tables[0].Rows[0][0].ToString() + "<p/>"); //獲取一個工作表 Worksheet sheet = book.Worksheets[i + 1] as Worksheet; int rowIndex = 1; int colIndex = 0; //為各個sheet添加列名 foreach (DataColumn col in table.Columns) { colIndex++; sheet.Cells[1, colIndex] = col.ColumnName; } //開始添加數據 foreach (DataRow row in table.Rows) { rowIndex++; colIndex = 0; foreach (DataColumn col in table.Columns) { colIndex++; //控制excel格式 String typeName = row[col.ColumnName].GetType().ToString(); sheet.Cells[rowIndex, colIndex] = typeCheckAdd(row[col.ColumnName].ToString(), typeName); } } //將各個sheet的名字改為datatable.TableName sheet.Name =ds.Tables[i].TableName.ToString(); } //刪除多余Sheet for (int g = 1; g <= book.Worksheets.Count; g++) { Worksheet sheet = book.Worksheets[g] as Worksheet; if (Convert.ToInt32(sheet.Name.Length.ToString())>5&&sheet.Name.Substring(0, 5) == "Sheet") { sheet.Delete(); g--; } } path = page.Server.MapPath("../") + @"9_Tool/" + strExcelFileName + ".xls"; //book.Save(); book.SaveAs(path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); book.Close();// 注意關閉,如果不關閉,執行的時間會出現 另一個進程在使用此文件 excel.Quit(); excel = null; GC.Collect(); //准備把文件轉化成二進制文件下載下來並刪除服務器上的那個Excel文件 FileStream fs = new FileStream(path, FileMode.Open); byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length); fs.Close(); File.Delete(path); page.Response.ContentType = "application/octet-stream"; //通知瀏覽器下載文件而不是打開 page.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(DateTime.Now.ToString("yyyyMMddHHmmssffff") + "客服審評表.xls")); page.Response.BinaryWrite(bytes); page.Response.Flush(); page.Response.End(); } catch (Exception e) { MessageBox.Show(e.Message); } } #region 用來處理excel的異常顯示,有必要的話可以可以添加 public static String typeCheckAdd(String cellContent, String strType) { String cellContentAdd; switch (strType) { case "System.Int64": cellContentAdd = "'" + cellContent; break; case "System.DateTime": cellContentAdd = (Convert.ToDateTime(cellContent)).ToString("MM-dd"); break; default: cellContentAdd = cellContent; break; } return cellContentAdd; } #endregion
五、總結
對於導出Excel,本方法還是比較慢的,還有下載時間,只能對於比較小的文件來使用,還有一種方法是操作Xml,具體實現方法可以先在網上搜索一下,有時間補上。
希望本文能給你帶來幫助,謝謝閱讀,歡迎大家指正。
