首页 > 解决方案 > 如何比较Java中Excel文件中两行的相等性?

问题描述

是否有任何内置函数可用于轻松比较 Excel 文件中的两行。我正在使用 Apache POI。

        try {

            Workbook wb1 = WorkbookFactory.create(new File(file1Path));
            Sheet sheet1 = wb1.getSheetAt(0);

            Workbook wb2 = WorkbookFactory.create(new File(file2Path));
            Sheet sheet2 = wb2.getSheetAt(0);

            for (Row myrow : sheet1) {
                if (myrow.getRowNum() == 0) {
                    // add entire row to a sheet for 'found in file 1 but not file 2' -> sheet 0
                    write(myrow, output_filename_path, dstSheetNumberInOutputFile);
                    continue;
                }
                // look for this key in the other sheet
                for (Row otherRow : sheet2) {
                    if (rowsAreEqual(myrow, otherRow)) {
                        write(myrow, output_filename_path, dstSheetNumberInOutputFile);
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

所以我有一个if statement功能rowsAreEqual()需要比较两行的相等性。我怎样才能实现这个rowsAreEqual()功能?

我试过这个但没有奏效:

    private static boolean rowsAreEqual(Row myrow, Row otherRow) {
        int equalCount = 0;
        System.out.println("last cell num: " + myrow.getLastCellNum());
        for(int i=0; i < myrow.getLastCellNum(); i++){
            if(myrow.getCell(i) == otherRow.getCell(i)){
                equalCount++;
                System.out.println("Cells are the same: " + myrow.getCell(i) + " && " + otherRow.getCell(i));
            }
        }

        if(equalCount == myrow.getLastCellNum()){
            return true;
        }
        return false;
    }

标签: javaapache-poi

解决方案


您可以抽象为比较一系列单元格。这将允许您比较行或列,或单个区域(例如 A1:Z256) - 所谓的Range

所以要比较的对象——内容相等——是CellRange

在 Java 中boolean equals(),任何对象的方法都依赖于它们的int hashCode()功能。在名为的实用程序类中,RangeContentsUtils您可以实现两者:

public class RangeContentsUtils {

  public static boolean contentsEquals(CellRange rangeA, CellRange rangeB) {
    if (rangeA == null || rangeB == null) {
        return false;
    }
    if (rangeA.size() != rangeB.size()) {
        return false;
    }
    // alternative would be:
    // return stringContentsOf(rangeA).hashCode() == stringContentsOf(rangeB).hashCode();

    return contentsToString(rangeA).equals(contentsToString(rangeB));
  }

  public static String contentsToString(CellRange range) {
    StringBuilder sb = new StringBuilder();
    
    Iterator<Cell> cellIterator = range.iterator();
    while(cellIterator.hasNext()) {
      Cell cell = cellIterator.next();
      switch(cell.getCellType()) {
        case Cell.CELL_TYPE_BOOLEAN:
          sb.append(cell.getBooleanCellValue());
          break;
        case Cell.CELL_TYPE_NUMERIC:
          sb.append(cell.getNumericCellValue());
          break;
        case Cell.CELL_TYPE_STRING:
          sb.append(cell.getStringCellValue());
          break;
      }
      sb.append("\0"); // use NUL char as cell-separator 
    }

    return sb.toString();
  }

}

现在您的行比较可以使用这个实用程序类。

另请参阅: 使用 java 和 Apache POI 比较 xls 表的特定行或列


推荐阅读