JXL (JavaExcelApi) 是純 Java 實現、無需 POI 重型依賴、體積極小(~300KB)的 Excel 讀寫庫,極適合 J2SE 桌面工具、報表導出、甚至 J2ME 端緩存數據導出(配合文件系統)。本文聚焦寫入流程,手把手教你生成規範的 .xls (BIFF8) 文件。
WritableWorkbook (文件) → WritableSheet (工作表) → WritableCell (單元格)
↑ ↑ ↑
Workbook.createWorkbook() createSheet(name, index) new Label/Number/DateTime(...)
(column, row),均從 0 開始。A1 = (0,0),B1 = (1,0),A2 = (0,1)。workbook.write() → workbook.close()(釋放內存/句柄)。jxl.write.Number(全限定名),避免與 java.lang.Number 衝突。import java.io.File;
import jxl.*;
import jxl.write.*;
public class CreateXLS {
public static void main(String[] args) {
WritableWorkbook wb = null;
try {
// 1. 創建可寫工作簿
wb = Workbook.createWorkbook(new File("output.xls"));
// 2. 創建工作表
WritableSheet sheet = wb.createSheet("第一頁", 0);
// 3. 寫入字符串 (Label)
Label label = new Label(0, 0, "Hello JXL");
sheet.addCell(label);
// 4. 寫入數字 (Number)
jxl.write.Number num = new jxl.write.Number(1, 0, 3.14159);
sheet.addCell(num);
// 5. 寫入日期 (需格式化)
WritableCellFormat dateFmt = new WritableCellFormat(
new DateFormat("yyyy-MM-dd HH:mm:ss"));
DateTime dt = new DateTime(0, 1, new java.util.Date(), dateFmt);
sheet.addCell(dt);
// 6. 合併儲存格 (A2:B2)
sheet.mergeCells(0, 1, 1, 1);
// 7. 設置列寬
sheet.setColumnView(0, 20); // 第 0 列寬 20 字符
// 8. 刷新並關閉
wb.write();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (wb != null) {
try { wb.close(); } catch (Exception ignore) {}
}
}
}
}
| 需求 | 實現要點 |
|---|---|
| 字體/顏色/對齊/邊框 | WritableFont + WritableCellFormat,sheet.addCell(new Label(c,r,"txt",fmt)) |
| 公式 | WritableCellFormula,如 new WritableCellFormula(0,2,"SUM(A1:B1)") |
| 圖片 | JXL 不支持寫入圖片,需遷移 Apache POI |
| 大數據量流式寫入 | JXL 全內存模型,>1萬行易 OOM;大數據請用 POI SXSSF |
WriteException: Cell already exists:同座標重複 addCell,檢查循環邏輯。IOException: Permission denied:文件被 Excel 打開佔用,關閉後重試。OutOfMemoryError:數據量過大,分批生成多文件或換 POI 流式 API。JXL 以極簡 API 實現 Excel 導出,「Workbook→Sheet→Cell」三步走,配合 WritableCellFormat 處理樣式,滿足 90% 報表導出需求。記住寫入後必須 write() 並 close(),否則文件損壞或 0 字節。若需 .xlsx、圖片、百萬行,請無痛升級 Apache POI。