實戰記錄:從 Oracle 表 TBYZB_FIELD_PRESSURE 讀取資料,套用現有 Excel 範本 (201512.xls),生成新檔案並保留原始格式,採用 SSH 架構與 Apache POI HSSF 實現。
TBYZB_FIELD_PRESSURED:/201512.xls (含表頭、樣式、公式)E:/{yyyy}{mm}.xls (不修改原範本)

public void insertIntoExcel(String yyyy, String mm) throws Exception {
// 1. 透過 DAO 取得資料 (SSH 架構)
List result = tyFieldPressDao.search(yyyy, mm);
// 2. 讀取範本工作簿
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream("D:/201512.xls"));
HSSFSheet sheet = workbook.getSheetAt(0); // 第一個工作表
// 3. 逐行填充資料 (從第 4 行開始,索引 3)
for (int i = 0; i < result.size(); i++) {
FieldPressEntity e = result.get(i);
HSSFRow row = sheet.getRow(3 + i); // 取得現有行 (保留樣式)
// 逐欄位寫入 (對應實體屬性 H17~H00 等)
// 欄位索引 1~28 對應 B~AC 欄
row.getCell(1).setCellValue(e.getH17());
row.getCell(2).setCellValue(e.getH18());
// ... 中間省略 ...
row.getCell(27).setCellValue(e.getDaily_min());
}
// 4. 輸出新檔案
FileOutputStream out = new FileOutputStream("E:/" + yyyy + mm + ".xls");
workbook.write(out);
out.close();
}
| 技術點 | 說明 |
|---|---|
| HSSFWorkbook | 處理 .xls (Excel 97-2003) 格式 |
| getRow / getCell | 取得現有行/儲存格,保留原樣式、公式、合併儲存格 |
| setCellValue | 僅更新儲存格值,不影響格式 |
| FileOutputStream | 寫入新檔案,原範本不變 |
| Entity 映射 | DAO 查詢結果封裝為 Entity,屬性對應欄位 |
XSSFWorkbook (OOXML 格式)SXSSFWorkbook (流式寫入,低記憶體)CellStyle + DataFormat 統一格式workbook.close() 與 out.close() (try-with-resources)Apache POI 官方指南:Excel 操作完整教學
核心優勢: 範本法將「版面設計」與「資料填充」分離,美工調整版面無需修改程式碼,維護性極佳。