首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Excel 模板導出實戰:基於 Apache POI 將數據寫入帶樣式的模板

     編輯:程式設計綜合問答

需求場景

已有帶複雜樣式(合併儲存格、邊框、字體、背景色)的 Excel 模板(5 行表頭),需將查詢出的數據追加寫入模板,保持原有格式不變,最後供下載。

技術選型:Apache POI (HSSF/XSSF)

POI 支援讀取現有工作簿、操作儲存格樣式、寫入數據,是 Java 操作 Excel 的標準庫。

核心步驟與代碼範例

1. 讀取模板文件

InputStream inp = getClass().getResourceAsStream("/template/project_template.xls");
Workbook workbook = WorkbookFactory.create(inp); // 自動識別 .xls/.xlsx
Sheet sheet = workbook.getSheetAt(0);

2. 定義樣式復用策略

從模板現有儲存格獲取樣式,避免重複創建:

CellStyle dataStyle = sheet.getRow(5).getCell(0).getCellStyle(); // 假設第6行是數據起始行的樣式參考

3. 寫入數據(保留原有行,向下插入或覆蓋)

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);
    // ... 其他欄位同理
}

4. 輸出至瀏覽器下載

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 或手動複製屬性。
  • 大數據量:超過幾萬行建議使用 SXSSF (流式寫入) 避免 OOM,但 SXSSF 不支援讀取現有模板,需先用 XSSF 讀取模板再轉換,或改用模板引擎(如 JXLS)。
  • 日期/數字格式:使用 DataFormat 設定儲存格格式,確保 Excel 正確識別類型。

進階方案:JXLS 模板引擎

若邏輯極其複雜(動態列、巢狀列表、條件顯示),推薦使用 JXLS,在 Excel 模板中直接寫入 ${var}、jx:forEach 等指令,Java 端只需傳入 Bean 集合,引擎自動渲染,極大降低代碼量。

總結

基於 POI 的模板導出核心在於「讀取模板 → 復用樣式 → 寫入數據 → 流式輸出」。掌握儲存格樣式複製與行索引控制,即可高品質滿足大多數業務導出需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved