jqgrid mvc 導出excel


 

  這段時間由於項目需要,需有個共通的導出功能,剛開始通過網上查看資料采用了 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;
        }

 

 

  

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM