ligerUI導出excel


首先是在線測試例子: http://vazumihost.vip1.kingidc.net/example/export.htm

截圖:


實現原理:

ligerui是基於jquery來搭建頁面,一個grid控件本質上是幾個table組合而成

如果可以將這個DOM的架構直接傳回後臺,自然可以輸出爲excel或者word或者pdf

爲何不在前臺Js實現html導出爲excel,因爲js來創建excel這玩意會碰到瀏覽器安全性問題,不實用

這個也貼一個方法,一個js搞定

  1. function method1() {//整個表格拷貝到EXCEL中     
  2.    //檢索瀏覽器    
  3.    if(navigator.userAgent.indexOf("MSIE")<0){    
  4.        alert('請用ie瀏覽器進行表格導出');    
  5.        return ;    
  6.    }    
  7.   
  8.    var tableid="maingrid";    
  9.    var curTbl = document.getElementById(tableid);     
  10.    var oXL = null;     
  11.    try {    
  12.        oXL = GetObject("""Excel.Application");    
  13.    }    
  14.    catch (E) {    
  15.        try {    
  16.            oXL = new ActiveXObject("Excel.Application");    
  17.        }    
  18.        catch (E2) {    
  19.            alert("Please confirm:\n1.Microsoft Excel has been installed.\n2.Internet Options=>Security=>Setting \"Enable unsafe ActiveX\"");    
  20.            return;    
  21.        }    
  22.    }    
  23.   
  24.    //創建AX對象excel     
  25.    var oWB = oXL.Workbooks.Add();     
  26.     //獲取workbook對象     
  27.    var oSheet = oWB.ActiveSheet;     
  28.            
  29.    //在此進行樣式控制    
  30.    oSheet.Rows(1+":"+1).RowHeight =20;//定義行高    
  31.    oSheet.Rows(2+":"+2).RowHeight =30;    
  32.   
  33.    oSheet.Rows(1).HorizontalAlignment=3;       
  34.   
  35.    var sel = document.body.createTextRange(); //激活當前sheet     
  36.    sel.moveToElementText(curTbl); //把表格中的內容移到TextRange中    
  37.    sel.select();  //全選TextRange中內容     
  38.    sel.execCommand("Copy"); //複製TextRange中內容     
  39.    oSheet.Paste(); //粘貼到活動的EXCEL中     
  40.    oXL.Visible = true//設置excel可見屬性    
  41.        
  42.    oSheet.Application.Quit();   //結束當前進程    
  43.   
  44.    window.opener=null;    
  45.    window.close();//關閉當前窗口    
  46.        
  47. }   
(這個方法,只可IE並且要允許不安全的activex運行,這也太危險了,這年頭...)


下面採用的導EXCEL方法,適合不翻頁的grid,而且無需再讀一次數據庫,

對於翻頁的grid來說,要導全部,當然後臺要再讀一次數據庫,這種導EXCEL方法baidu一大堆,這裏不重複


代碼:

grid.htm

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml" >  
  3. <head>  
  4.     <title></title>  
  5.     <link href="../lib/ligerUI/skins/Aqua/css/ligerui-all.css" rel="stylesheet" type="text/css" />  
  6.     <link href="../lib/ligerUI/skins/ligerui-icons.css" rel="stylesheet" type="text/css" />  
  7.     <script src="../lib/jquery/jquery-1.3.2.min.js" type="text/javascript"></script>  
  8.     <script src="../lib/ligerUI/js/plugins/ligerGrid.js" type="text/javascript"></script>  
  9.     <script src="../lib/ligerUI/js/plugins/ligerToolBar.js" type="text/javascript"></script>  
  10.     <script src="../lib/ligerUI/js/plugins/ligerDialog.js" type="text/javascript"></script>  
  11.     <script src="AllProductData.js" type="text/javascript"></script>   
  12.     <script type="text/javascript">  
  13.         $(function () {  
  14.           
  15.             $("#toptoolbar").ligerToolBar({ items: [  
  16.                                                         {text: '導出Excel',id:'excel',icon:'print',click:itemclick},  
  17.                                                         {text: '導出Word' ,id:'word',icon:'print',click:itemclick}                                                     
  18.                                                    ]  
  19.                                           });          
  20.            
  21.             $("#maingrid").ligerGrid({  
  22.                 columns: [  
  23.                     { display: '主鍵', name: 'ProductID', type: 'int', totalSummary:{type: 'count'}},  
  24.                     { display: '產品名', name: 'ProductName', align: 'left', width: 200 },  
  25.                     { display: '單價', name: 'UnitPrice', align: 'right', type:'float',totalSummary:{render: function (suminf, column, cell){return '<div>最大值:' + suminf.max + '</div>';},align: 'left'}},  
  26.                     { display: '倉庫數量', name: 'UnitsInStock', align: 'right', type: 'float',totalSummary:{type: 'sum'}}  
  27.                 ],   
  28.                 dataAction: 'local',  
  29.                 data: AllProductData, sortName: 'ProductID',  
  30.                 showTitle: false, totalRender: f_totalRender,  
  31.                 width: '100%', height: '100%',heightDiff:-10  
  32.             });  
  33.   
  34.             $("#pageloading").hide();  
  35.         });  
  36.           
  37.         function f_totalRender(data, currentPageData)  
  38.         {  
  39.             return "總倉庫數量:"+data.UnitsInStockTotal;   
  40.         }  
  41.                   
  42.         function itemclick(item)  
  43.         {     
  44.             grid = $("#maingrid").ligerGetGridManager();                  
  45.             if(item.id)  
  46.             {  
  47.                 switch (item.id)  
  48.                 {     
  49.                     case "excel":$.ligerDialog.open({url: "../service/print.aspx?exporttype=xls"});return;  
  50.                     case "word":$.ligerDialog.open({url: "../service/print.aspx?exporttype=doc"});return;  
  51.                 }     
  52.             }              
  53.         }                   
  54.     </script>  
  55. </head>  
  56. <body style="padding:0px; overflow:hidden; height:100%  ">  
  57.     <div id="toptoolbar"></div>   
  58.     <div id="maingrid" style="margin:0; padding:0"></div>   
  59.     <div style="display:none;"></div>   
  60. </body>  
  61. </html>  

導出頁面print.aspx
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="print.aspx.cs" Inherits="example" EnableEventValidation = "false" ValidateRequest="false" %>  
  2.   
  3. <html>  
  4. <head>  
  5.     <title></title>  
  6.     <link href="../lib/ligerUI/skins/aqua/css/ligerui-all.css" rel="stylesheet" type="text/css" />          
  7.     <script src="../lib/jquery/jquery-1.3.2.min.js" type="text/javascript"></script>  
  8.     <script src="../lib/ligerUI1.1.0/js/ligerui.min.js" type="text/javascript"></script>          
  9.     <script type="text/javascript">   
  10.         function GetQueryString(name)    
  11.         {    
  12.             var reg = new RegExp("(^|&)"+name+"=([^&]*)(&|$)");    
  13.             var rwindow.location.search.substr(1).match(reg);    
  14.             if (r!=null) return unescape(r[2]);return null;    
  15.         }      
  16.                  
  17.         function gethtml(g)  
  18.         {                                  
  19.            parent.$(".l-grid-header-table",g).attr("border","1");  
  20.            parent.$(".l-grid-body-table",g).attr("border","1");  
  21.              
  22.             $("#hf").val(  
  23.                         parent.$(".l-grid-header",g).html()+             //這裏把表頭撈出來  
  24.                         parent.$(".l-grid-body-inner",g).html()+         //表身,具體數據  
  25.                         parent.$(".l-panel-bar-total",g).html()+"<br/>"+ //這是全局彙總,1.1.0版本新添加的                         
  26.                         parent.$(".l-bar-text",g).html()                 //這是翻頁訊息         
  27.                         );  
  28.                           
  29.            parent.$(".l-grid-header-table",g).attr("border","0");  
  30.            parent.$(".l-grid-body-table",g).attr("border","0");                          
  31.          // parent.$(".l-grid-header-table",g).removeAttr("border");                
  32.          // parent.$(".l-grid-body-table",g).removeAttr("border");                                                  
  33.         }  
  34.           
  35.         function init()  
  36.         {  
  37.             if (GetQueryString("exporttype")=="xls")  
  38.             {  
  39.                 document.getElementById("btnxls").click();  
  40.             }      
  41.             else  
  42.             {  
  43.                 document.getElementById("btndoc").click();      
  44.             }  
  45.             setTimeout(function ()  
  46.             {  
  47.                 parent.$.ligerDialog.close();                 
  48.             }, 3000);                 
  49.         }  
  50.                                   
  51.     </script>  
  52. </head>  
  53. <body style="padding:20px" onload="init()">  
  54.     <form id="form1" runat="server">          
  55.     導出中...  
  56.     <div style="visibility:hidden">  
  57.     <asp:Button ID="btnxls" runat="server" Text="導出Excel" onclick="Button1_Click" OnClientClick="gethtml('#maingrid')"/>  
  58.     <asp:Button ID="btndoc" runat="server" Text="導出Word"  onclick="Button2_Click" OnClientClick="gethtml('#maingrid')"/>  
  59.     </div>  
  60.     <asp:HiddenField ID="hf" runat="server" />    
  61.     </form>  
  62. </body>  
  63. </html>  

print.aspx.cs
  1. using System;  
  2. using System.Collections;  
  3. using System.Configuration;  
  4. using System.Data;  
  5. using System.Web;  
  6. using System.Web.Security;  
  7. using System.Web.UI;  
  8. using System.Web.UI.HtmlControls;  
  9. using System.Web.UI.WebControls;  
  10. using System.Web.UI.WebControls.WebParts;  
  11.   
  12. namespace service  
  13. {  
  14.     public partial class print : System.Web.UI.Page  
  15.     {  
  16.         protected void Page_Load(object sender, EventArgs e)  
  17.         {  
  18.             if (!IsPostBack)  
  19.             {  
  20.             }  
  21.         }  
  22.   
  23.         void exportexcel()  
  24.         {  
  25.             Response.Clear();  
  26.             Response.Buffer = true;  
  27.             Response.Charset = "utf-8";  
  28.             Response.AppendHeader("Content-Disposition""attachment;filename=tmp.xls");  
  29.             Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");  
  30.               
  31.             Response.ContentType = "application/ms-excel";  
  32.             this.EnableViewState = false;  
  33.             System.IO.StringWriter oStringWriter = new System.IO.StringWriter();  
  34.             System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);  
  35.             oHtmlTextWriter.WriteLine(hf.Value);    
  36.             Response.Write(oStringWriter.ToString());              
  37.             Response.End();  
  38.         }  
  39.   
  40.         void exportword()  
  41.         {  
  42.             Response.Clear();  
  43.             Response.Buffer = true;  
  44.             Response.Charset = "utf-8";  
  45.             Response.AppendHeader("Content-Disposition""attachment;filename=tmp.doc");  
  46.             Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");  
  47.   
  48.             Response.ContentType = "application/ms-word";  
  49.             this.EnableViewState = false;  
  50.             System.IO.StringWriter oStringWriter = new System.IO.StringWriter();  
  51.             System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);  
  52.             oHtmlTextWriter.WriteLine(hf.Value);  
  53.             Response.Write(oStringWriter.ToString());  
  54.             Response.End();  
  55.         }  
  56.   
  57.         protected void Button1_Click(object sender, EventArgs e)  
  58.         {  
  59.             exportexcel();  
  60.         }  
  61.   
  62.         protected void Button2_Click(object sender, EventArgs e)  
  63.         {  
  64.             exportword();  
  65.         }  
  66.   
  67.     }  
  68. }  

代碼原理:在點導出按鈕的時候,彈一個print.aspx頁面,這個頁面把grid的html傳給自己一個叫hf的hidden裏面,然後後臺response輸出這個html


LINK:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章