Java 讀取 Excel 文件全攻略:Apache POI 入門、實作與常見問題解析

本教學全面介紹如何用 Java 透過 Apache POI 讀取 Excel 文件,從安裝依賴、格式差異、完整程式範例,到型別判斷、常見錯誤與進階應用,並針對專案管理、資料匯入等實務場景給予具體建議,幫助你高效處理 Excel 資料。

Notion 新創專屬 3 個月免費福利| 官方合作夥伴限定

經本站專屬連結申請,即享 3 個月 Notion Plus + AI 無限免費 (市價 $6,000 美元)! 務必保留推薦碼 venturer ,否則不符資格。 全程免費,無需信用卡。需用公司 Email 與有效公司網站。
免費使用

200+模板自動化工作流程

從數據到成果,只需一步 — 用Monday代替Excel,效率倍增!
免費使用

AI智能團隊協作

AI驅動的ClickUp超越Excel,讓工作更精準快速!
免費使用
[activecampaign form=1 css=1]

Java 讀取 Excel 文件概述

在現代專案管理與企業日常作業中,Excel 文件常用於資料彙整、報表、任務追蹤與數據交換。自動化讀取 Excel 可大幅提升效率,減少人為錯誤。Java 生態圈中,Apache POI 是最主流的 Office 文件處理庫,支援 XLS(Excel 97-2003)與 XLSX(Excel 2007 以後)格式。

Apache POI 簡介與適用情境

  • 優點:免費開源、功能完整、支援多種 Office 格式、社群活躍。
  • 適用場合:自動匯入/匯出報表、資料庫批次導入、批量資料轉換、專案管理工具資料同步。
  • 常見應用:將 Excel 任務清單匯入專案管理系統、批次更新人員工時、資料審核自動化。
  • 與其他庫比較
  • JExcelAPI:僅支援舊版 XLS,功能較簡單。
  • EasyExcel:適合大檔案批次處理,API 較簡潔,但功能彈性略低。
  • POI:功能最完整,適合多數企業應用。

準備工作與環境設定

在開始撰寫程式前,需先安裝 Apache POI。根據專案管理方式,提供三種主流安裝方式:

1. Maven 依賴設定

pom.xml 加入以下依賴(建議選用官方穩定版本):

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>5.2.3</version>
</dependency>

2. Gradle 設定

implementation 'org.apache.poi:poi-ooxml:5.2.3'

3. 直接下載 JAR

前往 Apache POI 官方網站 下載對應 JAR 檔,並加入專案 classpath。

POI 版本選擇建議

  • XLSX(新格式):需 poi-ooxml
  • XLS(舊格式):需 poi
  • 若需同時支援兩種格式,建議都加入。

Java 讀取 Excel 實作教學

以下將以實際範例,說明如何用 Java 讀取 Excel(XLS、XLSX)文件,並解析各種資料型別。

讀取 XLSX 與 XLS 格式

Apache POI 提供 XSSFWorkbook(XLSX)與 HSSFWorkbook(XLS)兩種物件。建議根據副檔名自動判斷格式:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.*;

public class ExcelReader {
    public static void main(String[] args) {
        String filePath = "data.xlsx"; // 可改為 data.xls
        try (InputStream inp = new FileInputStream(filePath);
             Workbook workbook = createWorkbook(inp, filePath)) {

            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                Sheet sheet = workbook.getSheetAt(i);
                System.out.println("Sheet: " + sheet.getSheetName());
                for (Row row : sheet) {
                    for (Cell cell : row) {
                        System.out.print(getCellValue(cell) + "\t");
                    }
                    System.out.println();
                }
            }
        } catch (IOException e) {
            System.err.println("讀取 Excel 發生錯誤:" + e.getMessage());
        }
    }

    // 根據副檔名自動選擇 Workbook 類型
    private static Workbook createWorkbook(InputStream inp, String filePath) throws IOException {
        if (filePath.endsWith(".xlsx")) {
            return new XSSFWorkbook(inp);
        } else if (filePath.endsWith(".xls")) {
            return new HSSFWorkbook(inp);
        } else {
            throw new IllegalArgumentException("不支援的檔案格式:" + filePath);
        }
    }

    // 取得儲存格內容,型別判斷見下節
    private static String getCellValue(Cell cell) {
        switch (cell.getCellType()) {
            case STRING: return cell.getStringCellValue();
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    return cell.getDateCellValue().toString();
                } else {
                    return String.valueOf(cell.getNumericCellValue());
                }
            case BOOLEAN: return String.valueOf(cell.getBooleanCellValue());
            case FORMULA: return cell.getCellFormula();
            case BLANK: return "";
            default: return "未知型別";
        }
    }
}

真實案例應用

  • 專案管理:自動讀取 Excel 任務表,批次導入至 Monday.com、ClickUp 等協作平台。
  • 資料庫匯入:將 Excel 員工資料批次寫入資料庫,減少人工操作。

讀取不同型別資料

Excel 儲存格可能包含文字、數字、日期、布林、公式或空值。正確判斷型別,有助於資料正確解析與後續處理。

型別判斷方式處理建議
文字CellType.STRING直接取值
數字CellType.NUMERIC判斷是否為日期
日期DateUtil.isCellDateFormatted(cell)轉為 Date 物件或格式化字串
布林CellType.BOOLEAN取布林值
公式CellType.FORMULA取公式字串或計算結果
空值CellType.BLANK處理為空字串或預設值

常見錯誤

  • 日期欄位未正確格式化,導致讀出為數字。
  • 公式欄位未計算,僅取得公式字串。

常見錯誤與例外處理

常見錯誤訊息與解決方法

錯誤訊息可能原因解決方法
java.io.FileNotFoundException檔案路徑錯誤或不存在檢查路徑、權限
org.apache.poi.poifs.filesystem.OfficeXmlFileException檔案格式與類型不符檢查副檔名與 Workbook 類型
記憶體溢位(OutOfMemoryError)檔案過大、未釋放資源增加 JVM 記憶體、用 SXSSF 處理
讀取日期顯示為數字未判斷日期格式使用 DateUtil.isCellDateFormatted

資源釋放建議

  • 儘量使用 try-with-resources,自動關閉 InputStream 與 Workbook。
  • 讀取大檔案時,考慮分批處理或使用 POI 的 SXSSFWorkbook(僅支援 XLSX)。

進階應用與實務案例

只讀特定 Sheet

Sheet sheet = workbook.getSheet("任務清單");
if (sheet != null) {
    // 處理該 Sheet 資料
}

篩選資料與資料轉換

  • 只處理符合條件的行(如狀態為「進行中」的任務)。
  • 轉換 Excel 資料為物件,批次匯入資料庫或 API。

處理大檔案效能建議

  • 使用 SXSSFWorkbook 進行串流讀寫,減少記憶體消耗。
  • 逐行處理,避免一次載入全部資料。

產業應用情境

  • 人資管理:批次匯入員工出勤紀錄。
  • 財務報表:自動解析 Excel 財報,生成可視化圖表。
  • 專案協作:將 Excel 任務表同步至 Monday.com、ClickUp,提升團隊協作效率。

FAQ:Java 讀取 Excel 常見問題

Apache POI 支援哪些 Excel 格式?有什麼限制?

  • 支援 XLS(HSSFWorkbook)、XLSX(XSSFWorkbook)、CSV(需額外處理)。
  • 不支援加密、受密碼保護的檔案。

如何處理合併儲存格、公式、圖片?

  • 合併儲存格:可用 sheet.getMergedRegions() 取得合併範圍。
  • 公式:可取得公式字串,也可用 FormulaEvaluator 計算結果。
  • 圖片:可取得圖片資料,但處理較為複雜,需額外 API。

如何避免記憶體溢位(大檔案處理)?

  • 使用 SXSSFWorkbook 進行串流處理。
  • 分批讀取、釋放資源。

POI 與其他 Java Excel 庫的比較與選擇建議

  • POI:功能最全,適合多數需求。
  • EasyExcel:適合大檔案、批次處理。
  • JExcelAPI:僅支援舊格式,維護較少。

如何在 Spring Boot 等框架中整合 POI?

  • pom.xml 加入依賴,於 Service 層封裝 Excel 處理邏輯。
  • 可結合 REST API,實現 Excel 上傳、解析與資料庫同步。

結語與進一步學習建議

透過 Apache POI,Java 開發者能輕鬆自動化 Excel 資料處理,無論是批次匯入、資料轉換或專案管理,都能大幅提升效率。

若你需將 Excel 任務表與專案管理、團隊協作無縫整合,推薦試用 Monday.com 等專案協作平台,其內建 Excel 匯入功能與自動化流程,能讓團隊更高效協作、資料即時同步。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

✨ 讓專案管理變簡單,團隊更強大!

在專案推進的每一步,效率就是競爭力。monday.com 整合進度追蹤、團隊協作與資源分配,讓你隨時掌握全局、快速解決問題。
全球18萬家專業團隊已經採用,你還在等什麼?