public void exportToExcel(List<Node> nodeList, OutputStream outputStream) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Tree Data"); // 创建表头 Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("ID"); headerRow.createCell(1).setCellValue("Name"); headerRow.createCell(2).setCellValue("Parent ID"); // 创建数据行 int rowIndex = 1; for (Node node : nodeList) { Row row = sheet.createRow(rowIndex++); row.createCell(0).setCellValue(node.getId()); row.createCell(1).setCellValue(node.getName()); row.createCell(2).setCellValue(node.getParentId()); } // 合并父级相同的行 Map<String, CellRangeAddress> mergedRegions = new HashMap<>(); for (int i = 1; i < rowIndex; i++) { Row row = sheet.getRow(i); String parentId = row.getCell(2).getStringCellValue(); if (mergedRegions.containsKey(parentId)) { CellRangeAddress mergedRegion = mergedRegions.get(parentId); int lastRow = mergedRegion.getLastRow(); mergedRegions.put(parentId, new CellRangeAddress(lastRow, lastRow + 1, 2, 2)); } else { mergedRegions.put(parentId, new CellRangeAddress(i, i, 2, 2)); } } for (CellRangeAddress mergedRegion : mergedRegions.values()) { sheet.addMergedRegion(mergedRegion); } // 输出Excel try { workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); }} 这个代码报 这个错 Exception in thread "main" java.lang.IllegalArgumentException: Merged region C2 must contain 2 or more cells at org.apache.poi.xssf.usermodel.XSSFSheet.addMergedRegion(XSSFSheet.java:403) at org.apache.poi.xssf.usermodel.XSSFSheet.addMergedRegion(XSSFSheet.java:368) at com.cd.test.Test1.exportToExcel(Test1.java:80) at com.cd.test.Test1.main(Test1.java:40)
时间: 2024-02-26 13:53:04 浏览: 125
jsp导出excel并支持分sheet导出的方法.docx
5星 · 资源好评率100%
这个错误是因为在创建合并单元格区域时,其中一个区域的单元格数量少于2个,导致了 IllegalArgumentException 异常。
根据你的代码,这个错误可能是因为你尝试将一个只包含一个单元格的区域合并到工作表中。在这里,你尝试将行合并到它的自身身上,代码如下:
mergedRegions.put(parentId, new CellRangeAddress(i, i, 2, 2));
这会导致一个只有一个单元格的区域,而这是不允许的。
要解决这个问题,你需要确保合并区域包含至少两个单元格。你可以在条件语句中添加一个额外的分支来处理这种情况,例如:
if (mergedRegions.containsKey(parentId)) {
CellRangeAddress mergedRegion = mergedRegions.get(parentId);
int lastRow = mergedRegion.getLastRow();
if (lastRow == i - 1) {
mergedRegions.put(parentId, new CellRangeAddress(lastRow, i, 2, 2));
} else {
mergedRegions.put(parentId, new CellRangeAddress(lastRow + 1, i, 2, 2));
}
} else {
mergedRegions.put(parentId, new CellRangeAddress(i, i, 2, 2));
}
这段代码会检查前一个行是否与当前行相邻,如果是,则将这两行合并到同一个区域中。否则,创建一个新的合并区域。
希望这可以帮助你解决问题。
阅读全文