【问题标题】:Comparing the contents of 2 excel files比较2个excel文件的内容
【发布时间】:2017-06-16 07:59:00
【问题描述】:

我有 2 个 excel 文件,我想比较内容并突出显示差异。 例如:

第一个文件...

name|age
abc|123
def|456
second file...
name|age
abc|123
def|456
ghi|789 - this being the differece

是否有任何第三方库可以做到这一点? 或者最好的方法是什么?

【问题讨论】:

  • 如果您正在寻找读/写 excel 文件,Apache Poi (poi.apache.org) 库是(至少是我的)首选。
  • 如果您需要知道 2 个文件是否完全相同,gTito 发布的链接可能对您非常有用。请注意,即使内容相同,不同的字体大小也意味着文件完全不同。

标签: java excel comparison compare


【解决方案1】:

就像 DaDaDom 所说的 Apache POI 就是您正在寻找的东西。您可以从this page 下载它。请注意,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 的快速介绍对您的项目有所帮助 :)

【讨论】:

    【解决方案2】:

    来自this question,我的回答部分重复如下。

    我的项目simple-excel 提供了一堆 Hamcrest 匹配器并封装了 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)
    

    Read a blog post about it

    【讨论】:

      【解决方案3】:

      我会使用 epplus 将两个文档加载到数据表中,然后遍历它们以查找差异。 根据您想要突出显示差异的方式,您可以简单地使用 epplus 为单元格着色并将它们保存回文件中。..

      【讨论】:

      • EPPlus 也可用于 Java?对我来说看起来像一个 .net 项目。
      • 啊抱歉,没有看到Java标签:(
      • 我想这个 epplus 提供了比任何 java 库更快的对 excel 文件的访问
      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      相关资源
      最近更新 更多