miniUI ExcelExport導出JAVA實現


一、miniUI官方前台頁面代碼

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title> 導出Excel</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8" /><link href="../demo.css" rel="stylesheet" type="text/css" />

    
    <script src="../../scripts/boot.js" type="text/javascript"></script>
    
        
</head>
<body>
    <h1> 導出Excel</h1>      

    <div style="padding-bottom:5px;">
        
        <span>員工姓名:</span><input type="text" id="key"  />
        <input type="button" value="查找" onclick="search()"/>
        
        <input type="button" value="導出Excel" onclick="ExportExcel()" style="margin-left:50px;"/>
    </div>
    <div id="datagrid1" class="mini-datagrid" style="width:700px;height:280px;" 
        url="../data/AjaxService.jsp?method=SearchEmployees"  idField="id"
        sizeList="[5,10,20,50]" pageSize="10"
    >
        <div property="columns">
            <div type="indexcolumn" ></div>
            <div field="loginname" width="120" headerAlign="center" allowSort="true">員工帳號</div>    
            <div field="name" width="120" headerAlign="center" allowSort="true">姓名</div>                            
            <div field="gender" width="100" renderer="onGenderRenderer" align="center" headerAlign="center">性別</div>
            <div field="salary" width="100" allowSort="true">薪資</div>                                    
            <div field="age" width="100" allowSort="true">年齡</div>
            <div field="createtime" width="100" headerAlign="center" dateFormat="yyyy-MM-dd" allowSort="true">創建日期</div>                
        </div>
    </div>   
    
    <iframe id="exportIFrame" style="display:none;"></iframe>
    
    <!--導出Excel相關HTML-->
     <form id="excelForm"  action="JXLExample.jsp" method="post" target="excelIFrame">
        <input type="hidden" name="columns" id="excelData" />
    </form>
    <iframe id="excelIFrame" name="excelIFrame" style="display:none;"></iframe>



    <script type="text/javascript">
        mini.parse();
        
        var grid = mini.get("datagrid1");
        grid.load();
        
        //對"createtime"字段,進行降級排序
        grid.sortBy("createtime", "desc");

        function search() {
            var key = document.getElementById("key").value;
            grid.load({ key: key });
        }
        $("#key").bind("keydown", function (e) {
            if (e.keyCode == 13) {
                search();
            }
        });
        ///////////////////////////////////////////////////////
        var Genders = [{ id: 1, text: '' }, { id: 2, text: ''}];
        function onGenderRenderer(e) {
            for (var i = 0, l = Genders.length; i < l; i++) {
                var g = Genders[i];
                if (g.id == e.value) return g.text;
            }
            return "";
        }

        function ExportExcel() {
            var columns = grid.getBottomColumns();
            
            function getColumns(columns) {
                columns = columns.clone();
                for (var i = columns.length - 1; i >= 0; i--) {
                    var column = columns[i];
                    if (!column.field) {
                        columns.removeAt(i);
                    } else {
                        var c = { header: column.header, field: column.field };
                        columns[i] = c;
                    }
                }
                return columns;
            }
            
            var columns = getColumns(columns);
            var json = mini.encode(columns);                        
            document.getElementById("excelData").value = json;
            var excelForm = document.getElementById("excelForm");
            excelForm.submit();            

        }
    </script>

    <div class="description">
        <h3>Description</h3>
        
    </div>
</body>
</html>

 

這里主要與導出相關的代碼就是ExportExcel()這個JS方法,主要是將頁面上的表頭columns以json的形式通過excelForm 這個表單傳給后台。

JAVA這里跟官方頁面的代碼有所不同,官方頁面實現方式是.Net。

 

 <!--導出Excel相關HTML-->
     <form id="excelForm"  action="JXLExample.jsp" method="post" target="excelIFrame">
        <input type="hidden" name="columns" id="excelData" />
    </form>
    <iframe id="excelIFrame" name="excelIFrame" style="display:none;"></iframe>

 

這個form表單中的action填寫為自己對應的JSP頁面即可。

二、官方JAVA后台代碼

JXLExample.jsp文件
<%@page import="java.io.OutputStream"%>
<%@page import="jxl.Workbook"%>
<%@page import="jxl.write.Label"%>
<%@page import="jxl.write.WritableSheet"%>
<%@page import="jxl.write.WritableWorkbook"%>
<%@page import="javax.print.attribute.standard.Finishings"%><%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*,Test.*,java.lang.reflect.*"%>
<%         
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");    
    
    excelWrite(request, response);
    
%>
<%!

public HashMap SearchEmployees(HttpServletRequest request, HttpServletResponse response) throws Exception
{     
    //查詢條件
    String key = request.getParameter("key");
    //字段排序
    String sortField = request.getParameter("sortField");
    String sortOrder = request.getParameter("sortOrder");
    HashMap result = new Test.TestDB().SearchEmployees(key, 0, 10000, sortField, sortOrder);
    return result;
}

public void excelWrite(HttpServletRequest request, HttpServletResponse response) throws Exception
{    
    OutputStream out=response.getOutputStream();
    String fname = "grid";
    response.reset();//清空輸出流
    
    response.setCharacterEncoding("UTF-8");//設置相應內容的編碼格式
    fname = java.net.URLEncoder.encode(fname,"UTF-8");
    response.setHeader("Content-Disposition","attachment;filename="+new String(fname.getBytes("UTF-8"),"GBK")+".xls");
    response.setContentType("application/ms-excel");//定義輸出類型
    String json = request.getParameter("columns");
    ArrayList rows = (ArrayList)Test.JSON.Decode(json);
    HashMap data = SearchEmployees(request, response);//需要的數據
       try {     
            // 獲得開始時間     
           // long start = System.currentTimeMillis();             
            // 創建Excel工作薄     
            WritableWorkbook workbook = Workbook.createWorkbook(out);      
           // 添加第一個工作表並設置第一個Sheet的名字     
          WritableSheet sheet = workbook.createSheet("grid1", 0);     
            Label label;  
          //寫出列名
            for(int i=0;i<rows.size();i++){      
                HashMap hm = (HashMap)rows.get(i);
                Iterator iterator = hm.keySet().iterator();                
                label = new Label(i,0,hm.get("header").toString());
                sheet.addCell(label);     
           }   
          //寫出數據
            ArrayList list = (ArrayList)data.get("data");  
                for (int i = 1; i < list.size(); i++) {
                    HashMap hm1 = (HashMap)list.get(i);
                    for (int k = 1; k < hm1.size(); k++) {
                        for(int j=0;j<rows.size();j++){     
                            HashMap hm = (HashMap)rows.get(j);
                            String key =hm.get("field").toString();
                            String value=String.valueOf(hm1.get(key));
                            label = new Label(j,i,value);
                            sheet.addCell(label); 
                        }
                    }    
                }       
                
          // 寫入數據     
                workbook.write();     
           // 關閉文件     
                workbook.close();  
                out.close();
          // long end = System.currentTimeMillis();     
          //System.out.println("----完成該操作共用的時間是:"+(end-start)/1000);     
       } catch (Exception e) {     
          // System.out.println("---出現異常---");     
           e.printStackTrace();     
       }     
}

%> 

這里最主要需要修改的代碼就是

ArrayList rows = (ArrayList)Test.JSON.Decode(json);

這里是對前台傳過來的表頭的json字符串轉化為list列表。

前台傳遞過來的JSON字符串如下:

[{\"header\":\"\\n\\t\\t\\t\\t\\t\\t內容\\n\\t\\t\\t\\t\\t\",\"field\":\"FYXMC\"},{\"header\":\"\\n\\t\\t\\t\\t\\t\\t上一年度實際開支(元)\\n\\t\\t\\t\\t\\t\",\"field\":\"ZFY\"},{\"header\":\"\\n\\t\\t\\t\\t\\t\\t本年度預算(元)\\n\\t\\t\\t\\t\\t\",\"field\":\"ZFY\"},{\"header\":\"\\n\\t\\t\\t\\t\\t\\t內容說明\\n\\t\\t\\t\\t\\t\",\"field\":\"SM\"}]

JAVAminiUI試用版的文件結構如下:(JSONTEST.JAVA這個文件是我加的測試文件)

Test.JSON.Decode()這個方法需要用到StringUtil.java和DateTransformer.java,將相關的三個文件都考到自己miniUI  web項目下即可使用Test.JSON.Decode()這個方法。

public HashMap SearchEmployees(HttpServletRequest request, HttpServletResponse response) throws Exception
{   
  。。。。。。 }
HashMap data = SearchEmployees(request, response);

以上這兩行代碼就是從自己的項目取數據並且做拼接。miniUI只是前段框架,所以excel導出還是需要經過后台取數。

只要取出的數據符合List<HashMap>的數據結構形式,就可以直接使用剩余其他代碼,SearchEmployees方法相關的代碼都可以不要。List<HashMap>的Map里存放的是一列數據的哈希集合。

三、本人的取數方法

 
         

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

 
         

import javax.sql.RowSet;

 
         

import com.bl.platform.tools.json.JSONArray;
import com.bl.platform.tools.json.JSONException;
import com.bl.platform.tools.json.JSONObject;
import com.sdjxd.pms.platform.data.DbOper;


public
class bmfy_zb { public static String nd = ""; public static String btxbm = ""; public static String txbm = ""; public static String nr = ""; public static String isLD = ""; /** * * @param ysbh 預算編號 * @param btxbm 被填寫部門 * @param txbm 填寫部門 * @return JSON對象數組 */ public static JSONArray deptJSON_Array(String nd,String btxbm,String txbm,String nr,String isLD){ JSONArray rows = new JSONArray(); String flownodeid = "0";//2為歸檔,0為開始,由於數據有限,先用起始階段的數據進行測試 String txbmsql = ""; String fyzgbmsql = ""; if("2".equals(isLD)){//如果是領導 txbmsql = ""; fyzgbmsql = ""; }else if("1".equals(isLD)){//如果是主管部門 txbmsql = " AND TXBM = '"+txbm+"' "; fyzgbmsql = "AND FYZGBMMC = '"+txbm+"' "; }else if("3".equals(isLD)){//如果是普通部門 txbmsql = ""; fyzgbmsql = ""; } String sql1 = "SELECT FYXID, FFXID, ZFY, FYXMC, SM FROM (SELECT SUM(YSFY) AS ZFY, FYXMC FROM (SELECT F.* FROM (SELECT E.* FROM (SELECT MAX(NODEINSTANCEID) AS NODEINSTANCEID, FLOWINSTANCEID FROM (SELECT * FROM JXD7_WF_NODEINSTANCE WHERE FLOWID = 'B1E7FA2F-E857-4135-8009-47C3159FC9AE' ) GROUP BY FLOWINSTANCEID ) D LEFT JOIN JXD7_WF_NODEINSTANCE E ON D.FLOWINSTANCEID = E.FLOWINSTANCEID WHERE D.NODEINSTANCEID = E.NODEINSTANCEID AND E.FLOWNODEID = '"+flownodeid+"' ) A LEFT JOIN JXD7_WF_FORMINSTANCE B ON A.FLOWINSTANCEID = B.FLOWINSTANCEID LEFT JOIN BL_T_CB_NDBMFYYSBZB C ON B.FORMINSTANCEID = C.FORMINSTANCEID LEFT JOIN BL_T_CB_NDBMFYYSZXB F ON C.YSBH = F.YSBH WHERE 1 = 1 AND BTXBM = '" + btxbm +"'" + txbmsql +" AND C.YSND = '"+nd+"' ) GROUP BY FYXMC ) G LEFT JOIN BL_T_CB_GSCMFYXB H ON G.FYXMC = H.FYXNR WHERE 1=1 "+fyzgbmsql; String sql2 = " UNION SELECT FYXID, FFXID, ZFY, FYXMC, SM FROM BL_T_CB_GGFYXB H LEFT JOIN (SELECT SUM(YSFY) AS ZFY, FYXMC FROM (SELECT F.* FROM (SELECT E.* FROM (SELECT MAX(NODEINSTANCEID) AS NODEINSTANCEID, FLOWINSTANCEID FROM (SELECT * FROM JXD7_WF_NODEINSTANCE WHERE FLOWID = 'B1E7FA2F-E857-4135-8009-47C3159FC9AE' ) GROUP BY FLOWINSTANCEID ) D LEFT JOIN JXD7_WF_NODEINSTANCE E ON D.FLOWINSTANCEID = E.FLOWINSTANCEID WHERE D.NODEINSTANCEID = E.NODEINSTANCEID AND E.FLOWNODEID = '"+flownodeid+"' ) A LEFT JOIN JXD7_WF_FORMINSTANCE B ON A.FLOWINSTANCEID = B.FLOWINSTANCEID LEFT JOIN BL_T_CB_NDBMFYYSBZB C ON B.FORMINSTANCEID = C.FORMINSTANCEID LEFT JOIN BL_T_CB_NDBMFYYSZXB F ON C.YSBH = F.YSBH WHERE 1 = 1 AND BTXBM = '"+btxbm +"'"+ txbmsql+" AND C.YSND = '"+nd+"' ) GROUP BY FYXMC ORDER BY FYXMC ) G ON G.FYXMC = H.FYXNR "; String sql = ""; if(!"".equals(nr)){ sql1 += " AND FYXMC LIKE '%"+nr+"%'"; sql2 += " AND FYXMC LIKE '%"+nr+"%'"; } if("公司層面費用".equals(btxbm)){ sql = sql1 + " ORDER BY FYXMC "; }else{ sql = "SELECT * FROM (" +sql1 + sql2 + ") ORDER BY FYXMC "; } sql = "SELECT * FROM (" + sql + ") WHERE FYXID IS NOT NULL";//過濾無效數據 if(btxbm==""){ return rows; } try { RowSet rs = DbOper.executeQuery(sql); while(rs.next()){ JSONObject row = new JSONObject(); for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) { try { row.put(rs.getMetaData().getColumnName(i).toUpperCase(), rs.getObject(i)); } catch (JSONException e) { e.printStackTrace(); } } rows.put(row); } } catch (SQLException e) { e.printStackTrace(); } return rows; } /** * 返回JSON字符串 * @param nd * @param btxbm * @param txbm * @param nr * @param isLD * @return */ public static String deptJSON(String nd1,String btxbm1,String txbm1,String nr1,String isLD1){ nd = nd1;//保存查詢條件 btxbm = btxbm1; txbm = txbm1; nr = nr1; isLD = isLD1; return deptJSON_Array(nd1,btxbm1,txbm1,nr1,isLD1).toString(); } /** * 將json對象解析成Map對象 <li> * json格式:{"name":"admin","retries":"3fff","testname" * :"ddd","testretries":"fffffffff"} */ private static HashMap<String, String> JSONOBJECTtoHashMap(JSONObject object) { HashMap<String, String> data = new HashMap<String, String>(); // 將json字符串轉換成jsonObject JSONObject jsonObject = object; Iterator<String> it = jsonObject.keys(); // 遍歷jsonObject數據,添加到Map對象 try { while (it.hasNext()) { String key = it.next(); String value = jsonObject.getString(key); data.put(key, value); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return data; } /** * 將查詢結果轉化成ListMap供導出EXCEL使用 * @return */ public static List<HashMap> toListMap(){ List<HashMap> list = new ArrayList<HashMap>(); JSONArray rows = deptJSON_Array(nd,btxbm,txbm,nr,isLD); try { for(int i=0;i<rows.length();i++){ HashMap<String, String> map = JSONOBJECTtoHashMap((JSONObject) rows.get(i)); list.add(map); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } }

將deptJSON_Array和deptJSON分開是因為,在網上沒有找到json字符串轉化為json對象的包,所以就拆開來,導出的時候使用deptJSON_Array方法可以根據保存的查詢條件重新查詢,直接輸出JSON對象,然后使用JSONOBJECTtoHashMap方法轉成hashMap。

之后就符合一列數據一個Map這個數據結構,然后用toListMap方法加到List中即可。

相應的JXLEXAMPLE.JSP中相關代碼要改一下:

ArrayList list = (ArrayList)data.get("data"); 

改成

List<HashMap> list = bmfy_zb.toListMap();

以下下代碼可以刪除

public HashMap SearchEmployees(HttpServletRequest request, HttpServletResponse response) throws Exception
{   
  。。。。。。
}
HashMap data = SearchEmployees(request, response);

 導出結果如下:

 

四、結語

由於涉及到的東西有點雜,怕忘記了所以做以上記錄。

轉載請注明出處:http://www.cnblogs.com/CryOnMyShoulder/p/7760029.html

 


免責聲明!

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



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