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

 

 

  

 

 

 

 

 

posted on 2013-03-28 18:07  小邹1018  阅读(3397)  评论(0编辑  收藏  举报