使用 Apache POI 從 Excel 中提取列名
一、簡介
無論是讀取資料進行處理還是產生報告,有效處理 Excel 文件至關重要。 Apache POI 是一個功能強大的 Java 函式庫,可讓開發人員以程式設計方式操作 Excel 檔案並與之互動。
在本教程中,我們將探索 Apache POI 以從 Excel 工作表中讀取列名稱。
我們將首先快速概述 POI API。然後我們將設定所需的依賴項並介紹一個簡單的資料範例。然後,我們將看到從舊格式和新格式檔案內的 Excel 工作表中提取列名稱的步驟。最後,我們將編寫單元測試來驗證所有工作是否如預期進行。
2. 依賴關係和範例設置
讓我們開始在pom.xml
中加入所需的依賴項,包括[poi-ooxml](https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml)
和commons-collections4
:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
讓我們從儲存在兩個 Excel 檔案中的一些範例資料開始。第一個是food_info.xlsx
文件,包含以下列和範例資料:
下一個由consumer_info.xls
檔案中的消費者資料(具有較舊的.xls
副檔名)和列名稱組成:
接下來,我們將按照以下步驟使用 POI 提供的 API 從這些檔案中提取列名稱。
3. 從 Excel 擷取列名
要使用 Apache POI 從 Excel 工作表讀取列名稱,我們將建立一個執行下列步驟的方法:
- 開啟 Excel 文件
- 存取所需的工作表
- 讀取標題行(第一行)以取得列名稱
3.1.開啟 Excel 文件
首先,我們需要開啟 Excel 檔案並建立一個WorkBook
實例。 POI 使用兩種不同的抽象(即XSSFWorkbook
和HSSFWorkbook
提供對.xls
和.xlsx
的支援:
public static Workbook openWorkbook(String filePath) throws IOException {
try (InputStream fileInputStream = new FileInputStream(filePath)) {
if (filePath.toLowerCase()
.endsWith("xlsx")) {
return new XSSFWorkbook(fileInputStream);
} else if (filePath.toLowerCase()
.endsWith("xls")) {
return new HSSFWorkbook(fileInputStream);
} else {
throw new IllegalArgumentException("The specified file is not an Excel file");
}
} catch (OLE2NotOfficeXmlFileException | NotOLE2FileException e) {
throw new IllegalArgumentException(
"The file format is not supported. Ensure the file is a valid Excel file.", e);
}
}
本質上,我們使用代表 Excel 工作簿的WorkBook
介面。它是 Apache POI 中處理 Excel 文件的頂級物件。 XSSFWorkbook
是一個為.xlsx
檔案實作WorkBook
類別。另一方面, HSSFWorkbook
類別實作.xls
檔案的WorkBook
。
3.2.訪問工作表
現在我們有了一個Workbook
,讓我們透過工作表名稱存取工作簿中所需的工作表:
public static Sheet getSheet(Workbook workbook, String sheetName) {
return workbook.getSheet(sheetName);
}
POI API 中的Sheet
介面代表 Excel 工作簿中的工作表。
3.3.讀取標題行
使用Sheet
對象,我們可以根據需要存取其資料。
讓我們使用 API 來讀取標題行,其中包含工作表中所有列的名稱。 Row
介面代表工作表中的一行。簡單地說,這裡我們將存取工作表的第一行,將索引0
傳遞給sheet.get()
方法。然後,我們將使用Cell
介面來提取標題行中的每個列名稱。
Cell
介面表示一行中的一個儲存格:
public static List<String> getColumnNames(Sheet sheet) {
Row headerRow = sheet.getRow(0);
if (headerRow == null) {
return Collections.EMPTY_LIST;
}
return StreamSupport.stream(headerRow.spliterator(), false)
.filter(cell -> cell.getCellType() != CellType.BLANK)
.map(Cell::getStringCellValue)
.filter(cellValue -> cellValue != null && !cellValue.trim()
.isEmpty())
.map(String::trim)
.collect(Collectors.toList());
}
在這裡,我們使用 Java Streams 來迭代每個Cell
。我們過濾掉空白儲存格和僅包含空格或null
的儲存格。然後,我們使用Cell
中的getStringCellValue()
方法來提取每個剩餘單元格的字串值。在這種情況下,API 會傳回單元格中資料的字串值。此外,我們也修剪了這些字串值中的空格。最後,我們將這些清理後的字串值收集到一個列表中並傳回該列表。
此時,也值得討論一個名為getRichStringTextValue()
的相關方法,該方法以RichTextString
形式檢索單元格值。這在處理格式化文字(例如同一單元格內具有不同字體、顏色或樣式的文字)時非常有用。如果我們的用例不僅要求我們提取列名,還要求保留這些列名的格式,那麼我們將使用**Cell::getRichStringTextValue()**
進行映射,並將結果儲存為**List<RichTextString>**
4. 單元測試
現在讓我們設定單元測試來查看.xls
和.xlsx
檔案的 POI API 的運作:
@Test
public void givenExcelFileWithXLSXFormat_whenGetColumnNames_thenReturnsColumnNames() throws IOException {
Workbook workbook = ExcelUtils.openWorkbook(XLSX_TEST_FILE_PATH);
Sheet sheet = ExcelUtils.getSheet(workbook, SHEET_NAME);
List<String> columnNames = ExcelUtils.getColumnNames(sheet);
assertEquals(4, columnNames.size());
assertTrue(columnNames.contains("Category"));
assertTrue(columnNames.contains("Name"));
assertTrue(columnNames.contains("Measure"));
assertTrue(columnNames.contains("Calories"));
workbook.close();
}
@Test
public void givenExcelFileWithXLSFormat_whenGetColumnNames_thenReturnsColumnNames() throws IOException {
Workbook workbook = ExcelUtils.openWorkbook(XLS_TEST_FILE_PATH);
Sheet sheet = ExcelUtils.getSheet(workbook, SHEET_NAME);
List<String> columnNames = ExcelUtils.getColumnNames(sheet);
assertEquals(3, columnNames.size());
assertTrue(columnNames.contains("Name"));
assertTrue(columnNames.contains("Age"));
assertTrue(columnNames.contains("City"));
workbook.close();
}
測試驗證 API 是否支援從兩種類型的 Excel 檔案讀取列名稱。
5. 結論
在本文中,我們探討如何使用 Apache POI 從 Excel 工作表中讀取列名稱。我們首先概述 Apache POI,然後設定必要的依賴項。然後,我們看到了一份逐步指南,其中包含用於實施解決方案的程式碼片段,並包含單元測試以確保正確性。
Apache POI 是一個強大的函式庫,它簡化了在 Java 中處理 Excel 檔案的過程,使其成為開發人員處理應用程式和 Excel 之間資料交換的寶貴工具。
與往常一樣,本文的完整實作可以在 GitHub 上找到。