在Java中比较两个Excel文件的最简单方法?

And*_*wan 16 java binary compare file

我正在为一些生成Excel文件(二进制文件)的代码编写JUnit测试.我有另一个包含我的预期输出的Excel文件.将实际文件与预期文件进行比较的最简单方法是什么?

当然我可以自己编写代码,但我想知道在可信第三方库(例如Spring或Apache Commons)中是否存在已经执行此操作的现有方法.

Tob*_*oby 12

您可以考虑使用我的项目simple-excel,它提供了一堆Hamcrest Matchers来完成这项工作.

当您执行以下操作时,

assertThat(actual, WorkbookMatcher.sameWorkbook(expected));
Run Code Online (Sandbox Code Playgroud)

你会看到,例如,

java.lang.AssertionError:
Expected: entire workbook to be equal
     but: cell at "C14" contained <"bananas"> expected <nothing>,
          cell at "C15" contained <"1,850,000 EUR"> expected <"1,850,000.00 EUR">,
          cell at "D16" contained <nothing> expected <"Tue Sep 04 06:30:00">
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)
Run Code Online (Sandbox Code Playgroud)

这样,您可以从自动化测试中运行它,并在开发过程中获得有意义的反馈.

您可以在我的网站上的这篇文章中阅读更多相关信息

  • 当然,但我想说它不是来自 SO 的规则;这表明社区可能会对你感到不满。我原以为这可能发生在公然自我推销的情况下。我的回复是真实的,并且符合现代 Java 测试策略,即 hamcrest。无论是谁提供的 IMO,它都是对这个问题的一个很好的回答。 (2认同)

And*_*wan 8

这是我最终做的事情(由DBUnit完成繁重的工作):

/**
 * Compares the data in the two Excel files represented by the given input
 * streams, closing them on completion
 * 
 * @param expected can't be <code>null</code>
 * @param actual can't be <code>null</code>
 * @throws Exception
 */
private void compareExcelFiles(InputStream expected, InputStream actual)
  throws Exception
{
  try {
    Assertion.assertEquals(new XlsDataSet(expected), new XlsDataSet(actual));
  }
  finally {
    IOUtils.closeQuietly(expected);
    IOUtils.closeQuietly(actual);
  }
}
Run Code Online (Sandbox Code Playgroud)

这比较了两个文件中的数据,没有任何可能不同的无关元数据的漏报风险.希望这有助于某人.


sle*_*ske 6

使用一些校验和(如MD5)或只读取两个文件,可以轻松完成简单的文件比较.

但是,由于Excel文件包含大量元数据,因此James Burgess指出,这些文件可能永远不会是逐字节相同的.因此,您需要对您的测试进行另一种比较.

我建议以某种方式从Excel文件生成"规范"表单,即读取生成的Excel文件并将其转换为更简单的格式(CSV或类似的东西),这将只保留您要检查的信息.然后你可以使用"规范形式"来比较你的预期结果(当然也是规范形式).

Apache POI可能对读取文件很有用.

顺便说一句:读取整个文件以检查其正确性通常不会被视为单元测试.这是一个集成测试......


jos*_*den 5

我需要做一些类似的事情,并且已经在我的项目中使用Apache POI 库来创建 Excel 文件。所以我选择使用包含的ExcelExtractor接口将两个工作簿导出为文本字符串,并断言这些字符串是相等的。有这两种方案的HSSF为.xls的以及XSSF为的.xlsx

转储到字符串:

XSSFWorkbook xssfWorkbookA = ...;
String workbookA = new XSSFExcelExtractor(xssfWorkbookA).getText();
Run Code Online (Sandbox Code Playgroud)

ExcelExtractor 有一些选项,用于确定所有应包含在字符串转储中的内容。我发现它具有包含工作表名称的有用默认值。此外,它还包括单元格的文本内容。