【发布时间】:2017-03-02 10:18:33
【问题描述】:
我正在尝试使用 Apache POI 读取 Excel 文件。我的问题是尝试将一系列行读取为合并单元格,同时考虑到此合并包含的行数是任意的。
这张照片
我希望这可能是一个充分的例子。在这种情况下,我无法想出一个函数来遍历所有作为属性的行并在到达外键行时停止。合并单元格中的“属性”字符串包含在合并单元格的第一行中。
感谢您的帮助!
【问题讨论】:
标签: java excel eclipse apache-poi
我正在尝试使用 Apache POI 读取 Excel 文件。我的问题是尝试将一系列行读取为合并单元格,同时考虑到此合并包含的行数是任意的。
这张照片
我希望这可能是一个充分的例子。在这种情况下,我无法想出一个函数来遍历所有作为属性的行并在到达外键行时停止。合并单元格中的“属性”字符串包含在合并单元格的第一行中。
感谢您的帮助!
【问题讨论】:
标签: java excel eclipse apache-poi
合并区域中的所有单元格都显示在电子表格 XML 中。并且可以读取行和单元格。但是 XML 中缺少它们的单元格类型。在 POI 中,单元格类型返回为 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 对象,或者返回一个空值。然后就可以使用了
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。如果您的问题是“我如何确定行中有合并区域(例如您的“检查”-行),您将无法绕过将某种“洞察力”-逻辑放入解析器,例如“如果 col A == 'Checks',然后读取 col C"
【讨论】: