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&lt;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 相關文章:

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

    這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料