程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java 導出Excel的各種嘗試

Java 導出Excel的各種嘗試

編輯:關於JAVA

Java 導出Excel的各種嘗試。本站提示廣大學習愛好者:(Java 導出Excel的各種嘗試)文章只能為提供參考,不一定能成為您想要的結果。以下是Java 導出Excel的各種嘗試正文


  最近的一個項目比擬忙,不斷沒時間過去跟新博客。明天過去分享一下在此項目中遇到的一個小問題:導出Excel;置信導出Excel這個功用是特別罕見的,也有很多的方式。好了,不多說了,直接說說自己遇到的各種坑,我後台用的是poi導出。

  首先,說一下需求,想要的後果就是:“契合導出條件時,正常導出,並彈出提示框讓用戶選下載地址,不契合導出條件時,提示用戶不能導出,還要在用戶導出的同時將導出按鈕禁用,當導出成功後,再將導出按鈕放開“

  (我首先會將我做的全進程的思緒和所遇到的問題和處理辦法說一下,干貨會在上面貼出來)

    1、由於我們整個框架習氣用異步懇求,所以一開端我運用ajax異步懇求導出Excel,後果發現導出不了,後台順序也跑完了,日志也記載了,,就是沒有呈現excel,更別說提示框了,網上查了很多,都說是由於ajax和後台交流用的是字符流,閱讀器是不會辨認你讓他下載的,所以此路不通。(也有小同伴說用ajax同步,也試了,不行。又填上了一個坑。。。。)

  2、然後就預備用form表單submit提交導出,試了一下,發現可以啊,很快樂,但是問題又來了,form表單提交後頁面其實刷新了,假如不契合導出條件我該怎樣提示用戶呢?新跳轉一個頁面嗎?覺得這樣不太適宜,由於用戶辛辛勞苦輸出了半天的條件,然後等了半天後台校驗(觸及到大數據量),後果等來的是跑到另一個頁面跟你說不能導出,假如是我我會解體的,等了半天不說,奶奶個腿,我輸出半天的查詢條件還得重新輸出,這個不能忍。。好吧,這種辦法不行,然後試著從後台往jsp頁面寫腳本,但是也發現基本不執行,也就疑惑了,最後,網上有一位小同伴說用一個iframe的隱藏域,假如不契合條件的話,再用流的方式將問題寫回來,最終問題處理了(代碼將會一致貼在上面)。

  3、這樣覺得很完滿了,但是問題還沒有完全處理,還有一個禁用按鈕的問題,這個問題想想很復雜,用戶點擊導出時將按鈕禁用,導出完成後傳回來一個標志,然後再將按鈕放開,但是問題來了,這個標志怎樣穿回來?一開端我想當然的想和錯誤提示一樣的結局方案,發現不行由於,我導出Excel曾經將response流給用掉了,我不能夠在用流的方式將標志寫回來了。這樣就會招致我放不勸導出按鈕,那老板就不贊同了,加班加點的找辦法。終於,讓我找到了一個處理思緒,用cookie來做。詳細思緒就是:用戶點擊導出後,禁用按鈕,然後js寫個定時器輪訓找cookie,在將文件流寫出後,我會放一個cookie在閱讀器中,那麼此時js就能找到這個cookie了,找到後,首先將定時器給干掉,再將cookie給干掉(有點過河拆橋的覺得,哈哈),然後將導出按鈕給放開。

  (雖然問題處理了,但是cookie和定時器輪訓還是有一點不靠譜,希望大家有更好的處理辦法,請大家不吝賜教,謝謝!!!)

  前台代碼:

<button class="btn btn-sm btn-success" type="submit" id="detailEp" onclick="return exportCheck(true);" forbid="yes">
	<i class="icon-arrow-right bigger-110"></i> 導出
</button>

<script> $(function() { var timer = ""; }); //點擊導出按鈕時禁用導出按鈕 $("#myForm").submit(function() { $("button[type=submit]",this).attr("disabled","disabled"); //提交導出後定時去檢查有沒有導出成功 timer = setInterval(refrashPg,1000); }) //導出成功後會放勸導出按鈕的禁用 function refrashPg() { if (getCk() =="1") { clearInterval(timer); $("#detailEp").removeAttr("disabled"); } delCk(); } //js獲取到cookie function getCk() { debugger var ck = document.cookie.split(";"); var ckname = ""; for (var i = 0;i<ck.length;i++) { var arr = ck[i].split("="); if (arr[0] =="updtstatus") { ckname = arr[1]; break; } } return ckname; } //js刪除掉cookie function delCk() { var exp = new Date(); var name = "updtstatus"; exp.setTime(exp.getTime()-1000); var cval = getCk(); document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString(); } }
</script>

  後台導出代碼就是普通的Java POI代碼:

 1 public void buildExcelDocument(Map<String, Object> obj,String fileName,String type, 
 2              HttpServletRequest request, HttpServletResponse response)  
 3             throws Exception {  
 4         HSSFWorkbook workbook = new HSSFWorkbook();  
 5         if ("1".equals(type)) {
 6             List<Map<String, Object>> contentList =  (List<Map<String, Object>>) obj.get("content");  
 7             HSSFSheet sheet = workbook.createSheet("sheet1");//創立Excel的版本是2003-2007(xls) 假如需求2010的話,用 XSSFSheet   
 8             Map<String,String>  titleList = (Map<String, String>) obj.get("title");
 9             //表頭的key 對應內容listMap中的map的key
10             List<String> mkey = new ArrayList<String>();
11             //表頭的value 表頭
12             List<String> mvalue = new ArrayList<String>();
13             Iterator<Entry<String, String>> it = titleList.entrySet().iterator();
14             while(it.hasNext()){
15                 @SuppressWarnings("rawtypes")
16                 java.util.Map.Entry entry = (java.util.Map.Entry)it.next();
17                 mkey.add((String) entry.getKey());
18                 mvalue.add((String) entry.getValue());
19             }
20             sheet.setDefaultColumnWidth((short) 12);    
21             HSSFCell cell = null;  
22             for (int i = 0;i<mvalue.size();i++) {
23                 cell = getCell(sheet, 0, i);
24                 setText(cell, mvalue.get(i));
25             }
26             
27             for (short i = 0; i < contentList.size(); i++) {    
28                 HSSFRow sheetRow = sheet.createRow(i+1);   
29                 Map<String, Object> entity = contentList.get(i);  
30                 for (int j = 0;j< mkey.size();j++) {
31                         if (entity.get(mkey.get(j)) instanceof String) {
32                             sheetRow.createCell(j).setCellValue((String)entity.get(mkey.get(j)));
33                         } else if (entity.get(mkey.get(j)) instanceof Double) {
34                             sheetRow.createCell(j).setCellValue((Double)entity.get(mkey.get(j)));
35                         } else if (entity.get(mkey.get(j)) instanceof Date){
36                             String date = (entity.get(mkey.get(j))).toString();
37                             sheetRow.createCell(j).setCellValue(date.substring(0, 10));
38                         } else if (entity.get(mkey.get(j)) instanceof BigDecimal){
39                             sheetRow.createCell(j).setCellValue((entity.get(mkey.get(j))).toString());
40                         }
41                     }
42                 }
43             }
44         } else if ("2".equals(type)) {
45             List<String[]> contentList =  (List<String[]>) obj.get("content");  
46             HSSFSheet sheet = workbook.createSheet("sheet1");    
47             String[]  titleList = (String[]) obj.get("title");
48             HSSFCell cell = null;  
49             for (int i = 0;i<titleList.length;i++) {
50                 cell = getCell(sheet, 0, i);
51                 setText(cell, titleList[i]);
52             }
53             for (short i = 0; i < contentList.size(); i++) {    
54                 HSSFRow sheetRow = sheet.createRow(i+1); 
55                 String[] detail = contentList.get(i);
56                 for (int j = 0;j< detail.length;j++) {
57                     sheetRow.createCell(j).setCellValue((String)contentList.get(i)[j]);
58                 }
59             }
60         }
61         
62        //設置下載時客戶端Excel的稱號     
63         String filename = fileName + ".xls";  
64       //處置中文文件名  
65         filename = Chineseutil.encodeFilename(filename, request);  
66         response.setContentType("application/Vnd.ms-excel;charset=UTF-8");     
67         response.setHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes("gb2312"), "iso8859-1"));     
68         OutputStream ouputStream = response.getOutputStream();
69         workbook.write(ouputStream);     
70         
71         //導出數據後將信息存入cookie
72      Cookie status = new Cookie("updtstatus", "1");
73       status.setMaxAge(3600);//設置cookie存活時間1個小時
74       response.addCookie(status);
75         
76         ouputStream.flush();     
77         ouputStream.close();  
78     }
View Code

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved