Web 應用常需匯出/匯入 Excel。單純產生 CSV 僅能讓瀏覽器呼叫 Excel 顯示,無法真正操作檔案。開源專案 Java Excel API (JXL) 以純 Java 實現讀取、建立、修改 Excel 97/2000 格式,跨平台、可在 JSP/Servlet 中直接呼叫。本文完整示範三大核心場景。
Workbook:工作簿(唯一入口)Sheet:工作表Cell:儲存格(Label 文字、Number 數值、DateTime 日期、Boolean 布林)WritableWorkbook/WritableSheet/WritableCell:可寫入版本// 1. 建立唯讀 Workbook
InputStream is = new FileInputStream("source.xls");
Workbook rwb = Workbook.getWorkbook(is);
// 2. 取得 Sheet(索引從 0 起)
Sheet rs = rwb.getSheet(0);
// 3. 讀取 Cell
Cell c00 = rs.getCell(0, 0); // (col, row)
String val = c00.getContents(); // 任何型別轉字串
// 4. 型別判斷與強轉取精確值
if (c00.getType() == CellType.LABEL) {
LabelCell lc = (LabelCell) c00;
String text = lc.getString();
} else if (c00.getType() == CellType.NUMBER) {
NumberCell nc = (NumberCell) c00;
double num = nc.getValue();
} else if (c00.getType() == CellType.DATE) {
DateCell dc = (DateCell) c00;
Date date = dc.getDate();
}
// 5. 釋放資源
rwb.close();
// 1. 建立可寫入 Workbook(工廠方法,不可 new)
WritableWorkbook wwb = Workbook.createWorkbook(new File("target.xls"));
// 或寫入 OutputStream:Workbook.createWorkbook(os)
// 2. 建立 Sheet(名稱, 索引)
WritableSheet ws = wwb.createSheet("Test Sheet", 0);
// 3. 新增儲存格(位置在建構子指定,不可變更)
// 文字
ws.addCell(new Label(0, 0, "一般文字"));
// 帶字型格式
WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableCellFormat wcf = new WritableCellFormat(wf);
ws.addCell(new Label(1, 0, "粗體斜體", wcf));
// 紅色字體
WritableFont redFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED);
ws.addCell(new Label(2, 0, "紅字", new WritableCellFormat(redFont)));
// 數值 + 格式
NumberFormat nf = new NumberFormat("#.##");
ws.addCell(new Number(0, 1, 3.1415926, new WritableCellFormat(nf)));
// 日期 + 格式
DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");
ws.addCell(new DateTime(0, 2, new Date(), new WritableCellFormat(df)));
// 4. 寫入磁碟並關閉(順序不可顛倒!)
wwb.write();
wwb.close();
// 1. 讀取原檔
Workbook rwb = Workbook.getWorkbook(new File("source.xls"));
// 2. 以原檔建立可寫入副本
WritableWorkbook wwb = Workbook.createWorkbook(new File("target.xls"), rwb);
WritableSheet ws = wwb.getSheet(0);
// 3. 取得可寫入 Cell 並修改
WritableCell wc = ws.getWritableCell(0, 0);
if (wc.getType() == CellType.LABEL) {
((Label) wc).setString("已修改內容");
}
// 4. 亦可新增新 Cell
ws.addCell(new Label(5, 5, "新增欄位"));
// 5. 寫入並關閉兩個 Workbook
wwb.write();
wwb.close();
rwb.close();
| 類別 | 方法 | 說明 |
|---|---|---|
| Workbook | getNumberOfSheets() | 工作表數量 |
| Workbook | getSheets() | 所有 Sheet 陣列 |
| Sheet | getName() | Sheet 名稱 |
| Sheet | getColumns()/getRows() | 總欄/列數 |
| Sheet | getColumn(i)/getRow(i) | 取得整欄/列 Cell 陣列 |
| Sheet | getCell(col, row) | 取得指定 Cell |
JXL 僅支援 Excel 97 (.xls)。需支援 .xlsx (OOXML) 請改用 Apache POI,功能更強大、社群更活躍。文末附 POI 建立 50x50 矩陣範例。