目錄
ToggleJava 讀取 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 匯入功能與自動化流程,能讓團隊更高效協作、資料即時同步。