目錄
ToggleJava操作Excel總覽
Java在自動化報表、資料匯入匯出、專案管理等領域,常需與Excel互動。主流解決方案為Apache POI,其支援.xls(Excel 97-2003)與.xlsx(Excel 2007及以上)格式,並能進行讀寫、格式設定、公式、圖片等多元操作。
POI適用於:
– 自動化產生專案進度報表
– 批次資料整理與轉換
– 系統與團隊協作工具(如Monday.com)整合,實現流程自動化
POI與其他Java Excel庫比較
| 工具 | 支援格式 | 特點與適用情境 | 授權 | 
|---|---|---|---|
| Apache POI | .xls, .xlsx | 功能最完整,社群活躍,適合多數應用 | Apache-2.0 | 
| JExcelAPI | .xls | 較輕量,僅支援舊格式,功能有限 | LGPL | 
| EasyExcel | .xlsx | 針對大量資料效能優化,API簡潔 | Apache-2.0 | 
建議: 一般專案選用POI最為靈活,若需處理大量資料可評估EasyExcel。
授權與商用注意事項
Apache POI採Apache-2.0授權,商用無須付費,但需保留授權聲明。若專案有特殊合規需求,建議再次確認授權條款。
開發環境與POI安裝
POI模組說明與選擇
- poi:基本功能,支援.xls
- poi-ooxml:支援.xlsx
- poi-ooxml-schemas:進階格式
- ooxml-schemas:處理複雜XML結構
安裝方式
Maven:
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>5.2.3</version>
</dependency>
Gradle:
implementation 'org.apache.poi:poi-ooxml:5.2.3'
手動安裝:
可至Apache POI官方網站下載JAR包,加入專案。
建議: 優先選用最新穩定版,確保安全與新功能。
讀取Excel檔案
3.1 基本讀取(Workbook/Sheet/Row/Cell)
以下範例展示如何讀取Excel檔案的第一個Sheet與所有儲存格:
FileInputStream fis = new FileInputStream("檔案路徑.xlsx");
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
    for (Cell cell : row) {
        System.out.print(cell.toString() + "\t");
    }
    System.out.println();
}
workbook.close();
fis.close();
3.2 處理不同型別儲存格
Excel儲存格型別多元,常見有文字、數字、日期、布林、空值。正確判斷型別可避免錯誤:
for (Row row : sheet) {
    for (Cell cell : row) {
        switch (cell.getCellType()) {
            case STRING:
                System.out.println(cell.getStringCellValue());
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    System.out.println(cell.getDateCellValue());
                } else {
                    System.out.println(cell.getNumericCellValue());
                }
                break;
            case BOOLEAN:
                System.out.println(cell.getBooleanCellValue());
                break;
            case BLANK:
                System.out.println("(空值)");
                break;
            default:
                System.out.println("未知型別");
        }
    }
}
常見錯誤:
– 直接以getStringCellValue()讀取數字或日期會拋出例外。
– 日期需用DateUtil.isCellDateFormatted(cell)判斷。
3.3 讀取多Sheet、批次讀取
若需處理多個工作表,可遍歷所有Sheet:
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
    Sheet sheet = workbook.getSheetAt(i);
    // 依需求處理每個Sheet
}
產業應用情境:
專案管理時,常將不同部門進度分Sheet儲存,批次讀取可自動彙總進度。
寫入與建立Excel檔案
4.1 基本寫入(建立Workbook/Sheet/Row/Cell)
建立新Excel檔案並寫入資料:
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("專案進度");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("任務名稱");
FileOutputStream fos = new FileOutputStream("output.xlsx");
workbook.write(fos);
fos.close();
workbook.close();
4.2 批次寫入、覆寫檔案
大量資料建議分批寫入,避免記憶體溢位。可參考下列方式:
for (int i = 0; i < 10000; i++) {
    Row row = sheet.createRow(i);
    row.createCell(0).setCellValue("任務" + i);
}
注意:
– 若需覆寫檔案,請確認檔案未被其他程式占用。
– 寫入後務必close()資源。
4.3 設定儲存格格式(顏色、字型、邊框、合併儲存格、資料驗證)
設定格式:
CellStyle style = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
font.setColor(IndexedColors.BLUE.getIndex());
style.setFont(font);
cell.setCellStyle(style);
合併儲存格:
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
資料驗證(下拉選單):
DataValidationHelper helper = sheet.getDataValidationHelper();
DataValidationConstraint constraint = helper.createExplicitListConstraint(new String[]{"進行中", "已完成"});
CellRangeAddressList addressList = new CellRangeAddressList(1, 100, 1, 1);
DataValidation validation = helper.createValidation(constraint, addressList);
sheet.addValidationData(validation);
4.4 插入公式、圖片
插入公式:
Cell formulaCell = row.createCell(2);
formulaCell.setCellFormula("A2+B2");
插入圖片:
InputStream is = new FileInputStream("logo.png");
byte[] bytes = IOUtils.toByteArray(is);
int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
is.close();
CreationHelper helper = workbook.getCreationHelper();
Drawing<?> drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = helper.createClientAnchor();
anchor.setCol1(0);
anchor.setRow1(1);
Picture pict = drawing.createPicture(anchor, pictureIdx);
pict.resize();
實務案例:
自動產生含公司Logo與公式的專案進度報表,提升專業形象與效率。
進階應用與實務案例
5.1 自動化報表產生
專案經理可透過Java程式自動彙整各部門進度,產生格式統一、含公式與條件格式的Excel報表,減少人工彙整錯誤。
5.2 批次資料匯入/匯出
如人資部門批次匯入員工資料,或IT部門批次匯出系統日誌,皆可利用POI自動化處理,提升效率與準確性。
5.3 整合團隊協作工具
將Excel自動產生的任務清單,匯入Monday.com或ClickUp等協作平台,實現任務分派、進度追蹤自動化,減少重複輸入,提升團隊協作效率。
常見錯誤與效能優化
常見錯誤
| 問題描述 | 原因與解法 | 
|---|---|
| 中文亂碼 | 未正確設定檔案編碼,建議使用UTF-8 | 
| 檔案損毀 | 未正確關閉workbook/stream,務必close() | 
| 記憶體溢位 | 大量資料建議使用SXSSFWorkbook(POI提供的流式寫入) | 
| 型別錯誤 | 讀取前應判斷cell型別,避免強制轉型 | 
效能優化建議
- 批次處理大量資料時,建議使用SXSSFWorkbook(支援流式寫入,減少記憶體占用)。
- 讀取大檔案時,僅載入必要Sheet或區塊。
- 釋放資源,避免檔案描述符耗盡。
產業實例:
金融業每日自動產生萬筆交易報表,採用SXSSFWorkbook有效避免記憶體溢位。
FAQ:Java操作Excel常見問題
如何處理Excel中的中文與特殊字元?
請確保Java程式與Excel檔案皆採用UTF-8編碼,並於寫入時避免手動轉碼。
如何正確處理日期格式?
判斷儲存格型別後,若為日期型,建議用DateUtil.isCellDateFormatted(cell)判斷,並可自訂格式化輸出。
如何避免大檔案導致記憶體溢位?
建議使用SXSSFWorkbook進行流式寫入,或分批讀寫。
如何處理空值或缺漏資料?
讀取前先判斷cell == null或cell.getCellType() == CellType.BLANK,避免NullPointerException。
POI支援哪些Excel版本?
POI支援.xls(Excel 97-2003)與.xlsx(Excel 2007及以上),建議優先使用.xlsx以獲得完整功能。
結論與工具推薦
Java結合Apache POI能高效處理Excel各類需求,無論是自動化報表、批次資料處理,還是與團隊協作平台整合,皆可大幅提升專案效率。若需進一步優化團隊流程,建議結合Monday.com等現代專案協作工具,實現資料自動同步、任務追蹤與進度視覺化,讓專案管理更上一層樓。
 
					 
					 
					