這篇文章小蛙要記錄如何在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);
}
%>

相關文章

網頁壓縮亂碼 – Lighttpd gzip php, js, css, html, plain

蛙齋速度慢的原因雖然有很大部份是在VPS的速度,在沒有經費可以提高VPS花費的情況下,只好從網站的優化開始做起,小蛙在
2011-12-29 23:59:46
hans

1

Conversion to Dalvik format failed with error 1

(2015-01-05 更新) 最近小蛙想把照照明星臉的bug都修一修,結果在更新FacebookSDK的時候發生了「Conversion to Dalvik format failed with error 1」這種搞不清楚發生什麼事情的
2012-01-04 18:00:50
hans

1

Google AdMob for Android

這幾天小蛙搞Android Ads花了不少時間,這篇文章紀錄一下Google AdMob如何在Android App中加入廣告。之後會把AdWhirl + Vpon, KuAD, AdMob ... 操作的流程也陸續記錄下來。
2012-01-06 19:08:03
hans

1

Firefox搜尋列使用Google Search

2012-01-06 22:02:27
hans

1

AdWhirl with AdMob by Google

AdWhirl是一套廣告輪播平台,開發者如果同時有許多廣告商,例如:AdMob, Vpon, KuAD …等等,就可以透過AdWhi
2012-01-07 13:59:22
hans

1

WinRAR解壓縮亂碼

有時候下載回來的壓縮檔解壓縮的時候發生「檔案名稱、目錄名稱或磁碟區標籤語法錯誤。」,像小蛙最近在試kuAD的時候就是這樣,這篇紀錄一下怎麼處理這個錯誤。
2012-01-07 15:19:05
hans

1

Eclipse匯入專案

這篇記錄Eclipse基礎操作,在網路上常常可以直接下載到eclipse整個專案,就可以套過這個方法直接把整個專案匯入到Eclipse中。

2012-01-07 15:47:18
hans

1

Google AdWhirl with kuAD

(2012-04-06 更新)接續上一篇,小蛙繼續記錄使用Google AdWhirl銜接kuAD,kuAD是由kuSOGI
2012-01-07 16:21:10
hans

1

照照明星臉問題回報區

(2012-01-25更新)感謝各位的支持,照照明星臉現在已經到了1.7.6.2版了。不知道怎麼下載及使用照照明星臉?請參考:
2012-01-08 00:03:58
hans

1

Google AdWhirl with Vpon

(2012-07-20 更新)前面幾篇小蛙陸續介紹了Google AdWhirl串接kuAD, AdMob,以及單獨使用AdMob(單獨使用Vpon或kuAD只要直接下載匯入範例就可以囉!),今天要來記錄
2012-01-08 20:21:03
hans

1




 回覆

你可以使用以下語法 HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

(required)

(required)

   
© 2012 蛙齋 Suffusion theme by Sayontan Sinha