1. 程式人生 > >web專案-Excel檔案匯出

web專案-Excel檔案匯出

跳坑留下的傷疤都是我們程式設計師最好的勳章。

檔案匯出是在web專案中常用的功能之一。在這裡我也談一下本人的拙見。

此次我遇到的是從easyUI框架中查詢資料的匯出,當然,不管框架怎麼變,萬變不離其宗,匯出功能學懂一個就差不多夠用了。

這裡我的前臺查詢條件是name和age。先查詢,前臺看到資訊後,才可以匯出。

按照我找部落格的習慣,直接上程式碼。

後臺匯出方法:

/*
     * 匯出檔案方法
    */
    @SuppressWarnings("unchecked")
	@RequestMapping(value = "/getfile.do")
    public @ResponseBody void getfile (HttpServletRequest request,HttpServletResponse response) throws IOException {
        String data1= request.getParameter("data");
        
        List<String> userIdList = JSON.parseArray(data1, String.class);
        List<SPSSUserIdTemporaryTable> UserIdlist = new ArrayList<SPSSUserIdTemporaryTable>();
    	
    	spssCustomerService.createUserIdTemporaryTable(UserIdlist);
        String Name=request.getName("Name");
        String Age=request.getAge("Age");
	//呼叫查詢方法,拿到資料。(可以封裝前臺使用的查詢方法,共用一個,防止頁面顯示和匯出資料不一致)
 List<CustomerEnterpriseData> dataList = selectEnterprise(Name,Age);

   	try {
            //List dataList = dao.getData(bean);
            String[] sheet = new String[2];
            sheet[0] = "個人資訊表";   //工作區名稱
            sheet[1] = "個人資訊統計表";  //標題名稱
            //欄位自己根據資料長度實際情況設定
            //設定欄位及欄位寬度(型別暫定為2,以後可擴充套件)
		//設定列名、列寬
            String[][] field = new String[][]{
                    {"維度", "車險數量"}
                    ,{"5000", "5000"}};
            List<List> datas = new ArrayList();
            //為了通用性,不能直接設定物件,所以內嵌List集合
            for(CustomerEnterpriseData b : dataList){
                List contents = new ArrayList();//儲存物件屬性資料
                contents.add(b.getName());
                contents.add(b.getAge());
                
                datas.add(contents);//新增到資料集合裡
            }
            PoiBuildExcel pbe = new PoiBuildExcel(sheet, field, datas);
            HSSFWorkbook workbook = pbe.exportExcel();
            response.reset();
            response.setCharacterEncoding("utf-8");
            response.setCharacterEncoding("utf-8");
            String disposition = "attachment;filename="+java.net.URLEncoder.encode("person.xls", "UTF-8");
            response.setHeader("Content-Disposition", disposition);// 設定輸出檔案頭
            response.setContentType("application/msexcel"); // 設定輸出型別
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            workbook.write(baos);
            baos.flush();
            byte[] aa = baos.toByteArray();
            InputStream is = new ByteArrayInputStream(aa, 0, aa.length);
            // 得到響應物件的輸出流,用於向客戶端輸出二進位制資料
            ServletOutputStream sos = response.getOutputStream();
            byte[] data = new byte[2048];
            int len = 0;
            while ((len = is.read(data)) > 0) {
                sos.write(data, 0, len);
            }
            is.close();
            sos.close();
            baos.close();


        } catch (Exception e) {
            e.printStackTrace();
           
        }

前端jsp程式碼:
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-export" onclick="export_exl()" >匯出</a>
    	 <form  id="fm_excel_export"  method="post" >
            <input type = "hidden" id = "hd_excel_data"  name = "data" >
            <input type = "hidden" id = "Name1"  name = "Name" >
            <input type = "hidden" id = "Age1"  name = "Age" >
           
          </form>

前端匯出按鈕觸發的方法:
function export_exl(){
    var data = JSON.stringify($('#dg').datagrid('getRows'));

    var Name=$("#Name").combobox("getValue");
    var Age=$("#Age").combobox("getValue");
   
    var userIdListJson = [];
    $($("#cc").combotree("tree").tree("getChecked")).each(function(i,n){
        if ($(this).tree('isLeaf', n.target)) {
            userIdListJson.push(n.id);
        }
    })
    if (userIdListJson.length === 0){
        var userId = $("#userId").val();
        userIdListJson.push("a");
    }
    
    userIdListJson = JSON.stringify(userIdListJson);
    if(data.length>2){
        $('#hd_excel_data') .val(userIdListJson) ;
        $("#Name1").val(Name);
        $("#Age1").val(Age);
        $('#fm_excel_export').form({
            url:"../spss/getfile.do",
            onSubmit: function(){
            },
            success:function(data){
            }
        });
        $('#fm_excel_export').submit();
        return;
    }else{
        alert("請先進行查詢操作!");
        return;
    }

}
可能程式碼有些地方比較多餘,是因為有些程式碼的私密性,從而進行了一定程度的修改,忘大家見諒。
這裡面原始碼對操作做了很多的判斷等等,希望大家看的時候多理解一下。
我在這裡遇到的問題是:
1、第一次是採用前臺傳遞json串給後臺進行解析,然後寫入Excel表文件,但是後來發現當前臺數據量大的時候,就會出現錯誤,因此才會封裝呼叫前臺的查詢方法,直接從資料庫拿取資料。

2、from表單提交不會重新整理。剛開始沒有手動寫入,所以在form表單提交一次後,就算是我改變了查詢條件,匯出來的資料也不會再改變,所以迫於無奈選擇了將查詢條件手動寫入form表單。

總結不好,請多多包涵!如有更好的見解,願洗耳恭聽!