JSP將資料匯出成Excel直接下載 by JExcelApi (jxl)
這篇文章小蛙要記錄如何在JSP中使用JExcelApi(jxl)操作Excel並且提供下載的功能,例如查詢完的列表讓使用者可以直接下載存成Excel。小蛙原本寫了一種透過File的方法產生,不過缺點就是時間久了會有很多廢棄的檔案(因為每次下載都會存成一個xls),必須透過crontab或是手動定期清理。之後在Jsp利用jxl匯出資料至Excel並下載 @ Ken™ KM看到更好的方法,可以動態產生並且直接提供下載,也就不會有上述的問題了。
Java + Excel = JXL小蛙在這篇文章中記錄了在Java中如何透過jxl讀取Excel檔案,這篇文章則是記錄如何寫入Excel檔案。會出現這篇文章完全是一個意外,原本這個工作是由另一位同事負責,結果那位同事連續請假兩天,而恰好小蛙是他的組長,另一個原因是,晚上快六點的時候,小蛙的組長才跟小蛙說隔天中午前要處理好,下午對方要做驗收的動作,所以小蛙只好回到家繼續趕工。累了,不囉嗦直接進正題,老規矩只記錄用到的部份,對jxl有興趣的網友們,請見諒,可能要自行查找jxl document喔!
操作寫入Excel檔案(不含直接下載)
這邊必須先有一個 WritableWorkbook 物件公我們操作(讀取的時候我們使用的是 Workbook 物件),接著是 WritableSheet(讀取的時候是 Sheet),建立完 WritableWorkbook 及 WritableSheet 之後就開始一個 cell 一個 cell 塞資料,這邊小蛙只有用到字串類型的文字,所以只採用 Label 即可。
<%@ page language="java" contentType="text/html; charset=utf-8" %> <%@ page import="java.util.*" %> <%@ page import="java.io.*" %> <%@ page import="java.text.*" %> <%@ page import="jxl.*" %> <%@ page import="jxl.write.*" %> <%@ page import="jxl.write.biff.RowsExceededException" %> <%! // 參考資料 http://www.blogjava.net/chenlb/archive/2007/10/29/156613.html private void putRow(WritableSheet ws, int rowNum, ArrayList cells) throws RowsExceededException, WriteException { for(int j=0; j < cells.size(); j++) { // 建立每個cell物件,這邊只用了Label Label cell = new Label(j, rowNum, ""+cells.get(j)); // 塞入Cell中 ws.addCell(cell); } } %> <% File f = null; try{ // 只是用來產生檔名 long sysTime = System.currentTimeMillis(); java.util.Date date = new java.util.Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String dateString = sdf.format(date) + sysTime + ".xls"; String path = application.getRealPath(""); f = new File(path + "/upload/" + dateString); if(!f.exists()){ // 建立excel檔案(空檔案,供jxl操作) f.createNewFile(); } WritableWorkbook workbook = Workbook.createWorkbook(f); WritableSheet sheet = workbook.createSheet("Sheet1", 0); int rowNum = 0; // ... 資料庫讀取部份略過 ... while(rs.next()){ // 建立一個ArrayList儲存每個Record的資料 ArrayList list = new ArrayList(); list.add(rs.getString("name"); ... // 實際塞資料 putRow(sheet, rowNum, list); // 用來控制行數 rowNum++; } // 這兩行一定不能少,不然寫的資料會消失 workbook.write(); workbook.close(); }catch(Exception e){ out.print(e); } %>
- 操作寫入Excel並直接下載
這邊是透過將Excel直接輸出到OutputStream,再透過response.setHeader達到下載的目的,直接看code。
<%@ page language="java" contentType="text/html; charset=utf-8" %> <%@ page import="java.util.*" %> <%@ page import="java.io.*" %> <%@ page import="jxl.*" %> <%@ page import="jxl.write.*" %> <%@ page import="jxl.write.biff.RowsExceededException" %> <%! private void putRow(WritableSheet ws, int rowNum, ArrayList cells) throws RowsExceededException, WriteException { for(int j=0; j<cells.size(); j++) { Label cell = new Label(j, rowNum, ""+cells.get(j)); ws.addCell(cell); } } %> <% try{ // 直接下載最重要的兩行 response.reset(); response.setHeader("Content-disposition","attachment; filename=fileName.xls"); OutputStream os = response.getOutputStream(); WritableWorkbook workbook = Workbook.createWorkbook(os); WritableSheet sheet = workbook.createSheet("Sheet1", 0); // ... 資料庫操作省略 ... int rowNum = 0; while(rs.next()){ ArrayList list = new ArrayList(); list.add(rs.getString("name")); .... putRow(sheet, rowNum, list); rowNum++; } workbook.write(); workbook.close(); os.flush(); os.close(); }catch(Exception e){ out.print(e); } %>
Excel 相關文章: