已有帶複雜樣式(合併儲存格、邊框、字體、背景色)的 Excel 模板(5 行表頭),需將查詢出的數據追加寫入模板,保持原有格式不變,最後供下載。
POI 支援讀取現有工作簿、操作儲存格樣式、寫入數據,是 Java 操作 Excel 的標準庫。
InputStream inp = getClass().getResourceAsStream("/template/project_template.xls");
Workbook workbook = WorkbookFactory.create(inp); // 自動識別 .xls/.xlsx
Sheet sheet = workbook.getSheetAt(0);
從模板現有儲存格獲取樣式,避免重複創建:
CellStyle dataStyle = sheet.getRow(5).getCell(0).getCellStyle(); // 假設第6行是數據起始行的樣式參考
List<Project> list = exampleService.queryForList();
int startRow = 5; // 模板表頭佔 0-4 行,數據從第 5 行(索引 5)開始
for (int i = 0; i < list.size(); i++) {
Row row = sheet.createRow(startRow + i); // 或 getRow 若模板已預留空行
Project p = list.get(i);
Cell cell = row.createCell(0); cell.setCellValue(p.getProjectName()); cell.setCellStyle(dataStyle);
cell = row.createCell(1); cell.setCellValue(p.getProjectNo()); cell.setCellStyle(dataStyle);
// ... 其他欄位同理
}
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=project_export.xls");
response.setContentType("application/vnd.ms-excel");
try (OutputStream os = response.getOutputStream()) {
workbook.write(os);
}
CellUtil.copyCell 或手動複製屬性。DataFormat 設定儲存格格式,確保 Excel 正確識別類型。若邏輯極其複雜(動態列、巢狀列表、條件顯示),推薦使用 JXLS,在 Excel 模板中直接寫入 ${var}、jx:forEach 等指令,Java 端只需傳入 Bean 集合,引擎自動渲染,極大降低代碼量。
基於 POI 的模板導出核心在於「讀取模板 → 復用樣式 → 寫入數據 → 流式輸出」。掌握儲存格樣式複製與行索引控制,即可高品質滿足大多數業務導出需求。