這段時間由於項目需要,需有個共通的導出功能,剛開始通過網上查看資料采用了 jqgrid 中很普遍的導出方式,這里就不說了,感興趣的可以看看http://blog.csdn.net/fover717/article/details/8178346(jqgrid 表格數據導出),因為自己是初次接觸jqgrid 項目,就采用了這種導出方式,經測試發現確實存在 只能在IE 系列的瀏覽器上才行;
於是就試着看在前台能直接改動該方法,發現思路無法進行,接着就想通過ajax調用后台方法進行導出 (而這也是這幾天一直走不通的敗筆),剛開始考慮最笨的方法:就是通過調用excel控件 的方法,試着將結果生成的excel方法存儲在自己定死了的路徑下面;實現這一步后,就想能不能將存儲路徑改為人為選擇的路徑,這網上方法很多,但大部分都是將服務端查詢出的數據 通過 dataset 、datagrid、GridView,datatable 等方式進行轉換成 xml、html 后下載,而我也試了很多種 基本上都通過了,卻沒提供 下載的提示;
最后發現是 不能用ajax做下載,用location.href=xxx等 類似操作就你能實現;
總結:1. 導出已實現:注意 不能用ajax做下載,用location.href=xxx就行了; 2.導出具體實現方法很多,但合適的才是最好的:此采用了 將數據轉換為DataTable 后轉換為html流 進行導出,可設置列字段類型;詳細見面代碼; 3.mvc 中 可以用 @Html.ActionLink("導出數據", "ExportData") 調用導出函數ExportData(); 4.控制 文件名包含中文防止亂碼的方法: System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); 5.導出excel 大概流程: a.從數據庫獲取相關數據; b.生成相應的 html 數據流(個人欣賞html數據流)或在服務端生成excel文件; c.數據流傳遞到客戶端提供下載;6.思路是關鍵,平時的積累很重要啊。
System.Data.DataTable dt = new System.Data.DataTable(); dt.Columns.Add("訂單號"); dt.Columns.Add("派車時間"); dt.Columns.Add("起始地"); dt.Columns.Add("目的地"); dt.Columns.Add("產品編碼"); dt.Columns.Add("產品名稱"); dt.Columns.Add("責任人"); dt.Columns.Add("預計車次"); dt.Columns.Add("車牌號"); dt.Columns.Add("任務車次"); dt.Columns.Add("運輸車次"); dt.Columns.Add("完成率"); foreach (var item in list) { DataRow dr = dt.NewRow(); dr["訂單號"] = item.訂單號; dr["派車時間"] = item.派車時間; dr["起始地"] = item.起始地; dr["目的地"] = item.目的地; dr["產品編碼"] = item.產品編碼; dr["產品名稱"] = item.產品名稱; dr["責任人"] = item.責任人; dr["預計車次"] = item.預計車次; dr["車牌號"] = item.車牌號; dr["任務車次"] = item.任務車次; dr["運輸車次"] = item.運輸車次; dr["完成率"] = item.完成率; dt.Rows.Add(dr); } //設置導出列類型 StringBuilder content = new StringBuilder(); int i = 0; int cl = dt.Columns.Count; foreach (DataRow row in dt.Rows) { for (i = 0; i < cl; i++) { //頭加tr if (i == 0) content.Append("<tr align='center' >"); object obj = row[dt.Columns[i].Caption]; Type type = obj.GetType(); if (dt.Columns[i].Caption == "訂單號") { content.AppendFormat("<td style='vnd.ms-excel.numberformat:@'>{0}</td>", obj); } else { content.AppendFormat("<td>{0}</td>", obj); } //尾加/tr if (i == cl - 1) content.Append("</tr>"); } } ExportHelper.StreamExport(strFileName, dt, content.ToString());
//DataTable 轉換為html 導出 public static bool StreamExport(string fileName, System.Data.DataTable dt, string strtd) { if (fileName == string.Empty) { return false; } StringBuilder content = new StringBuilder(); int i = 0; int cl = dt.Columns.Count; content.Append("<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>"); content.Append("<head><title></title><meta http-equiv='Content-Type' content=\"text/html; charset=gb2312\">"); //注意:[if gte mso 9]到[endif]之間的代碼,用於顯示Excel的網格線,若不想顯示Excel的網格線,可以去掉此代碼 content.Append("<!--[if gte mso 9]>"); content.Append("<xml>"); content.Append(" <x:ExcelWorkbook>"); content.Append(" <x:ExcelWorksheets>"); content.Append(" <x:ExcelWorksheet>"); content.Append(" <x:Name>" + fileName + "</x:Name>"); content.Append(" <x:WorksheetOptions>"); content.Append(" <x:Print>"); content.Append(" <x:ValidPrinterInfo />"); content.Append(" </x:Print>"); content.Append(" </x:WorksheetOptions>"); content.Append(" </x:ExcelWorksheet>"); content.Append(" </x:ExcelWorksheets>"); content.Append("</x:ExcelWorkbook>"); content.Append("</xml>"); content.Append("<![endif]-->"); content.Append("</head><body><table> "); //標題 content.Append("<tr align='center'><td colspan='" + dt.Columns.Count + "'><strong>" + fileName + "</strong></td></tr>"); //content.Append("<tr align='center'></tr>"); content.Append("<tr align='center'> <td colspan='" + dt.Columns.Count + "'>"); content.Append("<table border='1' >"); content.Append("<tr align='center' >"); for (i = 0; i < cl; i++) { content.Append("<td>" + dt.Columns[i].Caption.ToString() + "</td>"); } content.Append("</tr>"); content.Append(strtd); content.Append("</table></td></tr>"); content.Append("</table></body></html>"); content.Replace(" ", ""); System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.Buffer = true; System.Web.HttpContext.Current.Response.ContentType = "application/ms-excel"; //System.Web.HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; System.Web.HttpContext.Current.Response.Charset = "GB2312"; System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); fileName = System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8); System.Web.HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); System.Web.HttpContext.Current.Response.Write(content.ToString()); System.Web.HttpContext.Current.Response.End(); return true; }
