使用Apache POI从Excel中读取由一系列合并单元格索引的多行
我正在尝试使用Apache POI读取Excel文件。 我的问题是试图读取一系列的行作为一个合并单元格,考虑到这个合并包含的行数是任意的。
这张照片
可能是一个适当的例子,我希望。 在这种情况下,我不能拿出一个函数来通过属性的所有行,并停止当我到达外键行。 合并单元格中的“属性”string包含在合并单元格的第一行中。
谢谢您的帮助!
合并区域中的所有单元格都显示在电子表格XML中。 并可以读取行和单元格。 但是他们的单元格types在XML中丢失了。 在POI中,单元格types返回为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()); } } }
获取表单中的单元格中的值。 您可能需要处理数字或布尔单元格,这些不在我的示例中显示。
你到底在干什么? 如果您需要阅读合并单元格的内容,则可能需要检查此线程 。 如果你的问题是“如何确定行中有一个合并区域(比如你的”Checks“–Row),那么你就不会在parsing器中join某种”洞察力“ – 例如”if col A =='检查',然后阅读col C“