我正在尝试使用Apache POI读取Excel文件。我的问题是试图读取一系列行作为合并单元格,考虑到此合并包含的行数是任意的。使用Apache POI从Excel中读取由一系列合并单元格索引的多行
这张照片
可能是一个适当的例子,我希望。在这种情况下,我不能想出一个函数来通过属性的所有行,并在到达外键行时停止。合并单元格中的“属性”字符串包含在合并单元格的第一行中。
感谢您的帮助!
我正在尝试使用Apache POI读取Excel文件。我的问题是试图读取一系列行作为合并单元格,考虑到此合并包含的行数是任意的。使用Apache POI从Excel中读取由一系列合并单元格索引的多行
这张照片
可能是一个适当的例子,我希望。在这种情况下,我不能想出一个函数来通过属性的所有行,并在到达外键行时停止。合并单元格中的“属性”字符串包含在合并单元格的第一行中。
感谢您的帮助!
合并区域中的所有单元格都出现在电子表格XML中,并且可以读取行和单元格,但是它们的单元格类型在XML中缺失。单元格类型为Cell.CELL_TYPE_BLANK
。这可能是由于其他原因导致的,但仅仅查找Cell.CELL_TYPE_BLANK
还不够,还需要检查单元是否位于工作表中的某个合并区域内。像这样:
public static CellRangeAddress getMergedRegion(Cell cell) {
Sheet sheet = cell.getSheet();
for (CellRangeAddress range : sheet.getMergedRegions()) {
if (range.isInRange(cell.getRowIndex(), cell.getColumnIndex())) {
return range;
}
}
return null;
}
这将返回包含该单元的CellRangeAddress
对象,或返回null。然后,您可以使用
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() == Cell.CELL_TYPE_BLANK) {
CellRangeAddress range = getMergedRegion(cell);
if (range != null) {
Cell mergeValue = sheet.getRow(range.getFirstRow()).getCell(range.getFirstColumn());
System.out.println("Cell " + cell.getAddress() + ": " + "merged cell (" +
range.formatAsString() + ") " + mergeValue.getStringCellValue());
} else {
System.out.println("Cell " + cell.getAddress() + ": " + "blank");
}
} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
System.out.println("Cell " + cell.getAddress() + ": " + cell.getStringCellValue());
}
}
}
以获取工作表中单元格中的值。您可能需要处理数字或布尔单元格,这些在我的示例中未显示。
你到底在挣扎着什么?如果您需要阅读合并单元格的内容,则可能需要检查this thread。如果您的问题是“如何确定行中存在合并区域(例如您的”Checks“--Row),那么您不会在解析器中添加某种”洞察“ - 逻辑,例如”if col A =='Checks',然后阅读col C“