使用 Java 確定 Excel 檔案中的空白行
1. 概述
在 Java 中處理 Excel 檔案時的常見任務是識別空白行,尤其是在處理大型資料集進行分析或報告時。
Excel 檔案中的空白行可能會中斷資料處理,導致結果不準確或資料分析中出現不必要的複雜情況。識別這些行可確保資料清理或轉換等操作順利運作。
在本教程中,我們將研究三個流行的 Java 庫 — Apache POI、JExcel 和 fastexcel — 並了解如何使用每個庫讀取和查找 Excel 電子表格中的空白行。
2. 使用 Apache POI
Apache POI 是一個用於在 Java 中處理 Excel 檔案的綜合函式庫,支援.xls
和.xlsx
格式。由於其靈活性和穩健性,它被廣泛使用。
2.1. Maven 依賴項
要開始使用 Apache POI,我們將依賴項新增到pom.xml
檔案中:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.3.0</version>
</dependency>
2.2.偵測空行
首先,我們將建立一個輔助類,其中包含一個名為isRowEmpty()
的方法來偵測空行。這將迭代每一行,並透過將單元格類型與CellType.BLANK
進行比較來檢查所有單元格是否為null
或空白:
public class PoiHelper {
public static boolean isRowEmpty(Row row) {
for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) {
Cell cell = row.getCell(cellNum);
if (cell != null && cell.getCellType() != CellType.BLANK) {
return false;
}
}
return true;
}
}
2.3.測試方法
我們將首先建立測試類別和方法,並在 try-with-resources 區塊中開啟workbook
。我們使用一個名為empty_excel_file.xlsx
的簡單空檔進行測試:
public class PoiDetectEmptyRowUnitTest {
private PoiHelper poiHelper = new PoiHelper();
private static final String XLSX_EMPTY_FILE_PATH = "src/main/resources/empty_excel_file.xlsx";
@Test
public void givenXLSXFile_whenParsingExcelFile_thenDetectAllRowsEmpty() throws IOException {
try (FileInputStream file = new FileInputStream(XLSX_EMPTY_FILE_PATH);
Workbook workbook = new XSSFWorkbook(file)) {
Sheet sheet = workbook.getSheetAt(0);
for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
Row row = sheet.getRow(rowNum);
assertTrue(poiHelper.isRowEmpty(row));
}
}
}
}
然後,我們取得工作簿中的第一個工作表並迭代該工作表中的所有行。對於每一行,我們將應用先前建立的isRowEmpty()
方法並斷言該行為空。
3.使用JExcel
JExcel 是另一個處理 Excel 檔案(尤其是.xls
檔案)的函式庫。它以其簡單性和易用性而聞名。
3.1. Maven 依賴項
要使用 JExcel,我們將依賴項新增到pom.xml
檔案中:
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
3.2.偵測空行
使用 JExcel 檢測空行涉及迭代Cell
物件陣列並使用getContents()
方法檢查所有物件是否為空:
public class JExcelHelper {
public boolean isRowEmpty(Cell[] row) {
if (row == null) {
return true;
}
for (Cell cell : row) {
if (cell != null && !cell.getContents().trim().isEmpty()) {
return false;
}
}
return true;
}
}
3.3.測試方法
現在,讓我們看看它的實際效果:
public class JExcelDetectEmptyRowUnitTest {
private JExcelHelper jexcelHelper = new JExcelHelper();
private static final String EMPTY_FILE_PATH = "src/main/resources/empty_excel_file.xls";
@Test
public void givenXLSFile_whenParsingJExcelFile_thenDetectAllRowsEmpty()
throws IOException, BiffException {
Workbook workbook = Workbook.getWorkbook(new File(EMPTY_FILE_PATH));
Sheet sheet = workbook.getSheet(0);
for (int rowNum = 0; rowNum < sheet.getRows(); rowNum++) {
Cell[] row = sheet.getRow(rowNum);
assertTrue(jexcelHelper.isRowEmpty(row));
}
}
}
在這裡,我們打開了工作簿,然後檢索了第一張工作表。之後,我們將迭代工作表中的所有行,並對每一行應用輔助方法以斷言它們為空。
4.使用fastexcel
fastexcel是一個輕量級函式庫,針對快速讀取和寫入大型 Excel 檔案進行了最佳化。當性能至關重要時,這是一個不錯的選擇。
4.1. Maven 依賴項
我們將透過將 fastexcel依賴項包含在pom.xml
檔案中來將其新增至我們的專案:
<dependency>
<groupId>org.dhatim</groupId>
<artifactId>fastexcel</artifactId>
<version>0.18.3</version>
</dependency>
4.2.偵測空行
為了偵測 fastexcel 中的空行,我們將串流傳輸Row
物件中的單元格,並使用getText()
方法檢查每個單元格是否為空:
public class FastexcelHelper {
public boolean isRowEmpty(Row row) {
if (row == null) {
return true;
}
for (Cell cell : row) {
if (cell != null && !cell.getText().trim().isEmpty()) {
return false;
}
}
return true;
}
}
4.3.測試方法
讓我們看看它的實際操作,檢查電子表格的所有行是否為空:
public class FastexcelDetectEmptyRowUnitTest {
private FastexcelHelper fastexcelHelper = new FastexcelHelper();
private static final String EMPTY_FILE_PATH = "src/main/resources/empty_excel_file.xlsx";
@Test
public void givenXLSXFile_whenParsingEmptyFastExcelFile_thenDetectAllRowsAreEmpty()
throws IOException {
try (FileInputStream file = new FileInputStream(EMPTY_FILE_PATH);
ReadableWorkbook wb = new ReadableWorkbook(file)) {
Sheet sheet = wb.getFirstSheet();
try (Stream<Row> rows = sheet.openStream()) {
boolean isEmpty = rows.allMatch(fastexcelHelper::isRowEmpty);
assertTrue(isEmpty);
}
}
}
}
與先前的測試一樣,我們將開啟工作簿並取得第一張工作表。然後,我們將迭代行Stream
以檢查它們是否為空。
fastexcel 的流 API openStream()
使其能夠有效地處理大型資料集,即使在搜尋空行時也是如此。
5. 結論
在本教程中,我們看到,無論我們使用 Apache POI、JExcel 還是 fastexcel,每個程式庫都提供了強大的工具來有效偵測空白行。我們還查看了使用每個庫的程式碼範例,這有助於我們了解檢測 Excel 文件中空行的多種方法。
與往常一樣,完整的程式碼範例可以在 GitHub 上找到。