这段时间由于项目需要,需有个共通的导出功能,刚开始通过网上查看资料采用了 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; }