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

Apache POI 讀取 Excel 完整實戰:兼容 .xls 與 .xlsx 格式

     編輯:Java 綜合教學

Apache POI 讀取 Excel 完整實戰:兼容 .xls 與 .xlsx 格式

在 Java 企業級開發中,Excel 數據導入是高頻需求。Apache POI 作為操作 Microsoft Office 文檔的標準庫,提供了 HSSF(處理 .xls)與 XSSF(處理 .xlsx)兩套 API。本文封裝了一個通用的 ExcelReader 工具類,支援文件路徑、FileInputStream、InputStream 多種輸入源,並演示了如何讀取郵編數據作為實戰案例。

一、核心依賴

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

二、工具類設計亮點

  • 多重載入入口:提供 4 個靜態方法,分別接受 String 路徑、FileInputStream、InputStream,覆蓋本地文件、網絡流、資源文件等場景;
  • 資源安全釋放:統一使用 try-catch-finally 確保流關閉,避免句柄洩漏;
  • 異常屏蔽與日誌:捕獲異常打印堆棧,不拋出檢查異常,調用方無需強制處理。

三、關鍵代碼解析

1. 讀取 .xls (HSSF)

public static HSSFSheet readHssfExcel(String path) {
    File file = new File(path);
    try (FileInputStream is = new FileInputStream(file)) {
        HSSFWorkbook wb = new HSSFWorkbook(is);
        return wb.getSheetAt(0);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

2. 讀取 .xlsx (XSSF)

public static XSSFSheet readXssfExcel(InputStream is) {
    try {
        XSSFWorkbook wb = new XSSFWorkbook(is);
        return wb.getSheetAt(0);
    } catch (IOException e) {
        e.printStackTrace();
        return null;
    }
}

注意:XSSFWorkbook 構造函數會消耗輸入流,調用方無需手動關閉(內部已處理),但若傳入 FileInputStream 仍建議外層管理生命週期。

四、實戰演示:讀取郵編數據

public static void main(String[] args) {
    // 從 classpath 讀取 resources/postcode.xlsx
    InputStream is = Thread.currentThread()
                           .getContextClassLoader()
                           .getResourceAsStream("postcode.xlsx");
    XSSFSheet sheet = readXssfExcel(is);
    
    for (int i = 0; i <= sheet.getLastRowNum(); i++) {
        XSSFRow row = sheet.getRow(i);
        if (row == null) continue;
        // 假設第1列為數字郵編,第2列為字符串地址
        System.out.println("郵編:" + (long) row.getCell(0).getNumericCellValue());
        System.out.println("地址:" + row.getCell(1).getStringCellValue());
    }
}

五、進階擴展建議

  1. 統一介面:定義 ExcelReader 介面,採用策略模式自動判斷格式(WorkbookFactory.create());
  2. 大數據流式讀取:對於百萬行級文件,改用 SXSSF 或 XSSFReader (SAX 事件模型) 避免 OOM;
  3. 數據校驗與映射:結合註解或配置,將行直接映射為 Java Bean,並集成 JSR-303 校驗。

提示:完整代碼已包含包聲明與導入,可直接複製到項目中使用。

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