java - 如何比较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;
}
解决方案
您可以抽象为比较一系列单元格。这将允许您比较行或列,或单个区域(例如 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();
}
}
现在您的行比较可以使用这个实用程序类。
推荐阅读
- npx - npx 但在包 json 中使用版本
- c++ - C++:候选函数不可行:对于第一个参数,没有从“Segment [2]”到“int *”的已知转换
- javascript - Ctrl+Tab 为 puppeteer 切换选项卡
- c++ - 如何在 C++ 中使用开始和结束分隔符提取子字符串
- javascript - 使用 Flask 从 Javascript 中的 JQuery 发送数据到 python 脚本
- javascript - 如何以编程方式打开 DAL(Django Autocomplete Light)Select2
- c - C 版本是否向后兼容?
- sql - 在 SQL 中,如何计算显示每个布尔设置可能性的行数?
- c++ - SFINAE/requires 基于静态 constexpr 变量
- python - 如何在类图中表示自由函数 Python