web專案-Excel檔案匯出
阿新 • • 發佈:2018-12-31
跳坑留下的傷疤都是我們程式設計師最好的勳章。
檔案匯出是在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表單。
總結不好,請多多包涵!如有更好的見解,願洗耳恭聽!