Java 中比较两个 Excel 文件

10 Sept 2024 | 5 分钟阅读

比较两个或多个 Excel 工作簿是一个非常常见的需求,尤其是在自动化测试场景中。在本节中,我们将学习如何比较两个 Excel 工作簿,或者验证两个工作簿是否包含相同的数据集。

比较 Excel 文件

我们不应该直接开始按单元格或单元格数据来比较 Excel 工作表。在进行单元格比较之前,我们应该先检查基本条件是否满足。

首先应检查的排序好的基本条件如下:

  • 工作簿是否具有相同数量的工作表?
  • 我们可以根据需要更改工作表的顺序。我在这里更改工作表的顺序,但保持单元格数据顺序不变。
  • 工作簿是否具有相同数量的行?
  • 工作簿的对应行是否具有相同数量的列/单元格?对应行意味着每一行可能有不同数量的列。

当上述条件都检查通过后,我们才应该进行单元格数据比较。如果任何一个检查失败,我们就不应该继续进行。

检查两个 Excel 工作簿是否具有相同数量的工作表

要获取工作簿中的工作表数量,我们需要使用 Apache POI 提供的 Workbook 接口的 getNumberOfSheets() 方法。Workbook 接口由 XSSFWorkbook、HSSFWorkbook 等主要类实现。

检查两个 Excel 工作簿的工作表名称是否相同

这里有两种情况。

第一种:仅验证工作表名称是否相同,而不考虑工作表顺序。

第二种:验证工作表名称是否相同,并且顺序也相同。

检查两个工作簿在所有工作表中是否具有相同数量的行

我们需要检查工作簿中每个工作表的行数是否相同。如果工作簿 1 的 sheet1 有 10 行,sheet2 有 15 行,那么工作簿 2 的 sheet1 也应该有 10 行,sheet2 也应该有 15 行。

要获取工作表中的行数,我们需要使用 Sheet 接口的 getPhysicalNumberOfRows() 方法。此方法返回物理定义的行数(而不是工作表中的行数)。如果我们有一个工作表中有 10 行,每一行都将从零开始索引或编号。对所有工作表都需要执行相同的操作。下面是一个工作表的示例代码。

检查两个工作簿的行是否具有相同的列数

一行可以有不同数量的列。因此,我们需要检查所有工作表中每一行的列数。要遍历行,我们可以使用 Sheet 接口的 rowIterator() 方法,它返回物理行的迭代器。在遍历行的过程中,我们需要获取物理单元格的数量。对所有工作表都需要执行相同的逻辑。

现在我们需要检查单元格数据并断言。

每个单元格都有类型,如 String、Numeric、Boolean 等。要获取按类型划分的值,需要使用不同的方法。例如,要从 Numeric 类型的单元格中获取数据,我们需要使用 getNumericCellValue(),对于 String 类型的单元格,则使用 getStringCellValue()。

如果单元格包含日期,我们没有这样的 Cell 类型。带有日期的单元格属于 Numeric 类型。我们需要检查单元格是否为日期格式。我们可以使用 DateUtil.isCellDateFormatted(Cell cell) 进行检查。

CompareExcelFiles.java

输出

The cell values at (0, 0) are the same
The cell values at (0, 1) are the same
The cell values at (0, 2) are the same
The cell values at (0, 3) are the same
The cell values at (1, 0) are the same
The cell values at (1, 1) are the same
The cell values at (1, 2) are the same
The cell values at (1, 3) are the same
The cell values at (2, 0) are the same
The cell values at (2, 1) are the same
The cell values at (2, 2) are the same
The cell values at (2, 3) are the same
The cell values at (3, 0) are the same
The cell values at (3, 1) are the same
The cell values at (3, 2) are the same
The cell values at (3, 3) are the same

注意:在上面的程序中,假设 file1.xls 和 file2.xls 包含两个结构和值相同的工作表。