比较两个Excel文件的内容

3
我有两个Excel文件,我想比较它们的内容并突出显示差异。例如:
第一个文件...
name|age
abc|123
def|456
second file...
name|age
abc|123
def|456
ghi|789 - this being the differece

有没有第三方库可以完成这个功能?或者最好的方法是什么?

3
如果您正在寻找读写Excel文件的解决方案,Apache Poi (http://poi.apache.org/) 库是(至少是我个人的)首选。 - Dominik Sandjaja
1
https://dev59.com/jXNA5IYBdhLWcg3wrf83 - titogeo
如果您需要知道两个文件是否完全相同,gTito发布的链接可能非常有用。请注意,即使内容相同,不同的字体大小也意味着这些文件完全不同。 - user1581900
3个回答

7

像DaDaDom所说的一样,Apache POI是您正在寻找的。 您可以从此页面下载它。 请注意,POI项目并不完全独立,您可能需要下载一些额外的库。 按照Apache POI网站上的说明进行操作。 这是如何使用它:

InputStream myxls = new FileInputStream("workbook.xls"));
HSSFWorkbook wb = new HSSFWorkbook(myxls); // for *.xlsx use XSSFWorkbook

如果是一个新文件,您可能需要在继续之前创建工作表,但在这种情况下,文件已经被创建。

HSSFSheet sheet = wb.getSheetAt(0);       // first sheet
HSSFRow row     = sheet.getRow(0);        // first row
HSSFCell cell   = row.getCell((short)0);  // first cell

要从单元格中获取值,请使用:

String value = cell.getStringCellValue();

但是,如果单元格中存储的类型为数字,则会出现错误。在处理数字时,请使用以下方法:
Int value = cell.getCellValue();

这是我编写的一种处理不同单元格数据类型的方法:
public String getValue(int x, int y){
    Row row = this.activeSheet.getRow(y);
    if(row==null) return "";
    Cell cell = row.getCell(x);
    if(cell==null) return "";
    int type = cell.getCellType();
    switch(type){
    case 0:
        return cell.getNumericCellValue() + "";
    case 1:
        return cell.getStringCellValue();
    case 2:
        return cell.getCellFormula();
    case 3:
        return "";
    case 4:
        return cell.getBooleanCellValue() + "";
    case 5:
        return cell.getErrorCellValue() + "";
    default:
        return "";
    }
}

我希望这个快速介绍Apache POI的内容能够帮助你完成你的项目 :)

4
这个问题中,我的答案部分如下。
我编写的项目simple-excel提供了一堆Hamcrest Matchers,并包装了Apache POI的语法。
当您执行以下操作时,
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)

阅读有关此的博客文章


0
我会使用epplus将两个文档加载到datatables中,然后迭代它们以查找差异。根据您想要突出显示差异的方式,您可以使用epplus简单地对单元格进行着色,并将其保存回文件中。

1
EPPlus也适用于Java吗?在我看来,它似乎是一个.net项目。 - Dominik Sandjaja
啊,抱歉,我没看到Java标签 :( - Christian Sauer
我认为这个Epplus比任何Java库更快地访问Excel文件。 - user1581900

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接