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