用 Java 從 Excel 中讀取值

**1.**概述

對於 Microsoft Excel 文件,從不同單元格讀取值可能有點棘手。 Excel文件是按行和單元格組織的電子表格,其中可以包含String, Numeric, Date, Boolean, and even Formula值甚至公式值。 Apache POI 是一個庫,提供了一整套工具來處理不同的 excel 文件和值類型

在本教程中,我們將重點學習如何處理 excel 文件、遍歷行和單元格,以及使用正確的方法讀取每個單元格值類型。

2. Maven 依賴

讓我們首先將 Apache POI 依賴項添加到pom.xml

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

可以在 Maven Central 找到最新版本的[poi-ooxml](https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.poi%22%20AND%20a%3A%22poi-ooxml%22)

3. Apache POI 概述

層次結構從代表整個 Excel 文件的工作簿開始。每個文件可以包含一個或多個工作表,它們是行和單元格的集合。根據 Excel 文件的版本, HSSF 是代表舊 Excel 文件的類的前綴 ( .xls ),而 XSSF 用於最新版本 ( .xlsx )。因此我們有:

  • XSSFWorkbookHSSFWorkbook類代表 Excel 工作簿
  • Sheet界面代表Excel工作表
  • Row接口代表行
  • Cell界面代表細胞

3.1.處理 Excel 文件

首先,我們打開要讀取的文件並將其轉換為FileInputStream以進行進一步處理。 FileInputStream構造函數拋出一個java.io.FileNotFoundException所以我們需要將它包裹在一個 try-catch 塊中並在最後關閉流:

public static void readExcel(String filePath) {
 File file = new File(filePath);
 try {
 FileInputStream inputStream = new FileInputStream(file);
 ...
 inputStream.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 }

3.2.遍歷 Excel 文件

在我們成功打開InputStream ,是時候創建XSSFWorkbook並遍歷每個工作表的行和單元格了。在情況下,我們知道片的確切數量或特定片材的名稱,我們可以使用getSheetAt(int index)getSheet(String sheetName)的方法XSSFWorkbook,分別。

由於我們想要讀取任何類型的 Excel 文件,我們將使用三個嵌套的 for 循環遍歷所有工作表,一個用於工作表,一個用於每個工作表的行,最後一個用於每個工作表的單元格

在本教程中,我們只會將數據打印到控制台:

FileInputStream inputStream = new FileInputStream(file);
 Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream);
 for (Sheet sheet : baeuldungWorkBook) {
 ...
 }

然後,為了遍歷工作表的行,我們需要找到從工作表對像中獲得的第一行和最後一行的索引:

int firstRow = sheet.getFirstRowNum();
 int lastRow = sheet.getLastRowNum();
 for (int index = firstRow + 1; index <= lastRow; index++) {
 Row row = sheet.getRow(index);
 }

最後,我們對細胞做同樣的事情。此外,在訪問每個單元格時,我們可以選擇傳遞一個MissingCellPolicy ,它基本上告訴 POI 當單元格值為空或 null 時返回什麼。 MissingCellPolicy枚舉包含三個枚舉值:

  • RETURN_NULL_AND_BLANK
  • RETURN_BLANK_AS_NULL
  • CREATE_NULL_AS_BLANK ;

單元格迭代的代碼如下:

for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
 Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
 ...
 }

3.3.在 Excel 中讀取單元格值

正如我們之前提到的,Microsoft Excel 的單元格可以包含不同的值類型,因此能夠將一種單元格值類型與另一種區分開來並使用適當的方法提取值非常重要。下面是所有值類型的列表:

  • NONE
  • NUMERIC
  • STRING
  • FORMULA
  • BLANK
  • BOOLEAN
  • ERROR

我們將關註四種主要的單元格值類型: Numeric, String, Boolean, and Formula ,其中最後一個包含前三種類型的計算值。

讓我們創建一個輔助方法,它基本上會檢查每個值類型,並在此基礎上使用適當的方法來訪問值。也可以將單元格值視為字符串並使用相應的方法檢索它。

有兩件重要的事情值得注意。首先, Date值存儲為Numeric值,而且如果單元格的值類型是FORMULA我們需要使用getCachedFormulaResultType()而不是getCellType()方法來檢查公式的計算結果:

public static void printCellValue(Cell cell) {
 CellType cellType = cell.getCellType().equals(CellType.FORMULA)
 ? cell.getCachedFormulaResultType() : cell.getCellType();
 if (cellType.equals(CellType.STRING)) {
 System.out.print(cell.getStringCellValue() + " | ");
 }
 if (cellType.equals(CellType.NUMERIC)) {
 if (DateUtil.isCellDateFormatted(cell)) {
 System.out.print(cell.getDateCellValue() + " | ");
 } else {
 System.out.print(cell.getNumericCellValue() + " | ");
 }
 }
 if (cellType.equals(CellType.BOOLEAN)) {
 System.out.print(cell.getBooleanCellValue() + " | ");
 }
 }

現在,我們需要做的就是printCellValue方法,我們就完成了。這是完整代碼的片段:

...
 for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
 Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
 printCellValue(cell);
 }
 ...

4。結論

在本文中,我們展示了一個使用 Apache POI 讀取 Excel 文件和訪問不同單元格值的示例項目。