English 中文(简体)
比较 Java两个Excel案的最容易的方法?
原标题:
  • 时间:2009-05-14 23:16:18
  •  标签:

I m 撰写一份《Junnit》测试,测试一些产生Excel文档(即双轨)的代码。 我有另一份Excel文件,其中载有我的预期产出。 将实际档案与预期档案进行比较的最容易的方法是什么?

我可以自己写这部法典,但我很想知道,在值得信赖的第三方图书馆(例如春天或阿帕奇共同点)中是否有一种已有的方法。

最佳回答

在此,我最后做些什么(通过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);
  }
}

比较了这两个档案中的数据,没有从任何可能不同的不相干的元数据中产生错误负面的风险。 希望有助于人们。

问题回答

您可考虑使用我的项目simple-excel。 该公司为哈姆克斯特骑师提供一队工作。

当你做以下事情时:

assertThat(actual, WorkbookMatcher.sameWorkbook(expected));

例如,请见

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)

这样,你就可以从您的自动测试中操作,并在你重新开发的过程中获得有意义的反馈。

可在

我需要做一些类似的事情,已经在我创建Excel档案的项目中使用rel=“noreferer”>ExcelExtractor接口,以出口两份工作手册作为案文的载体,并声称这些图表是平等的。 https://poi.apache.org/apidocs/org/apache/poi/hssf/extractor/ExcelExtractor.html” rel=“noreferer”HSSF for .xls,以及

Dump tostring:

XSSFWorkbook xssfWorkbookA = ...;
String workbookA = new XSSFExcelExtractor(xssfWorkbookA).getText();

ExcelExtractor有一些选择,可以选择哪些选择都应纳入铺设的垃圾场。 我发现,它存在包括姓名在内的有用违约情况。 此外,还包括囚室的内容。

The easiest way I find is to use Tika. I use it like this:

private void compareXlsx(File expected, File result) throws IOException, TikaException {
     Tika tika = new Tika();
     String expectedText = tika.parseToString(expected);
     String resultText = tika.parseToString(result);
     assertEquals(expectedText, resultText);
}


<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>1.13</version>
    <scope>test</scope>
</dependency>

请看thesite,比较双亲档案,

猛虎

您可使用Beyond compare 3,从指挥线开始,并支持以不同方式比较 Excel文档,包括:

  • Comparing Excel sheets as database tables
  • Checking all textual content
  • Checking textual content with some formating

只测试科特林首页的内容(通常可以转换为java)。

private fun checkEqualityExcelDocs(doc : XSSFWorkbook, doc1 : XSSFWorkbook) : Boolean{
        val mapOfCellDoc = doc.toList().first().toList().flatMap { row -> row.map { Pair(PivotExcelCreator.IndexInThePivotTable(it.rowIndex,it.columnIndex),it.stringCellValue) }}.toMap()
        val mapOfCellDoc1 = doc1.toList().first().toList().flatMap { row -> row.map { Pair(PivotExcelCreator.IndexInThePivotTable(it.rowIndex,it.columnIndex),it.stringCellValue) }}.toMap()
        if(mapOfCellDoc.size == mapOfCellDoc1.size){
            return mapOfCellDoc.entries.all { mapOfCellDoc1.containsKey(it.key) && mapOfCellDoc[it.key] == mapOfCellDoc1[it.key]}
        }
        return false
    }

data class IndexInThePivotTable(val row: Int, val col: Int)

以及

    assertTrue(checkEqualityExcelDocs(expected, actual), "Docs aren t equal!")

如您能看到<条码>doc.toList(>.first()只读到文件的第一页,如果您需要将每一页的改动代码进行比较的话。

同样,不考虑“空洞的囚室”也是非常好的想法,我不需要这种功能(如果你需要,只是增加这一部分)。


也可以是有用的信息

//first doc I ve got from outputstream such way
val out = ByteArrayOutputStream()
//some method which writes excel to outputstream
val firstDoc = XSSFWorkbook(ByteArrayInputStream(out.toByteArray()))

档案中的第二版

val secondDoc = XSSFWorkbook(Test::class.java.getClassLoader().getResource("yourfile.xlsx").path)

也许......比较每个档案的MD5摘要? 我确信,有许多办法可以做到这一点。 你只能公开档案和逐一比较。

EDIT:James称,XLS格式在元数据上可能有所不同。 也许你应当使用你用来生成xls文档的同一接口,以打开这些文档,并将从电池到电池的数值进行比较?





相关问题
热门标签