你说的很对,每一列都有可能合并行,而不仅仅是第三列。在这段代码中,它只考虑了第三列的合并情况,需要进行修改。可以考虑使用一个二维数组来记录每个单元格的合并情况,然后在遍历行的过程中动态更新这个数组,最后再将所有需要合并的单元格进行合并。 根据你这段话优化下上面的代码
时间: 2024-02-25 13:59:06 浏览: 46
3个表合并的问题
好的,我来优化一下上面的代码。可以使用一个二维数组`merged`来记录每个单元格的合并情况,其中`merged[i][j]`表示第i行第j列单元格是否已经被合并。在遍历行的过程中,如果当前行的某个单元格与上一行的单元格内容相同,且上一行的单元格未被合并,则将它们合并,并将`merged`数组中对应位置的值设为`true`。最后,将所有需要合并的单元格进行合并。
下面是修改后的代码:
```
public static void exportToExcel(List<Node> nodeList, OutputStream outputStream, int pageSize) {
Workbook workbook = new XSSFWorkbook();
int totalSize = nodeList.size();
int totalPage = (totalSize % pageSize == 0) ? (totalSize / pageSize) : (totalSize / pageSize + 1);
// 二维数组 merged 用于记录每个单元格的合并情况
boolean[][] merged = new boolean[totalSize][3];
for (int i = 0; i < totalPage; i++) {
Sheet sheet = workbook.createSheet("Tree Data - Page " + (i + 1));
// 创建表头
Row headerRow = sheet.createRow(0);
headerRow.createCell(0).setCellValue("ID");
headerRow.createCell(1).setCellValue("Name");
headerRow.createCell(2).setCellValue("Parent ID");
// 计算当前页起始位置和结束位置
int startIndex = i * pageSize;
int endIndex = Math.min((i + 1) * pageSize, totalSize);
// 创建数据行
int rowIndex = 1;
for (int j = startIndex; j < endIndex; j++) {
Node node = nodeList.get(j);
Row row = sheet.createRow(rowIndex++);
row.createCell(0).setCellValue(node.getId());
row.createCell(1).setCellValue(node.getName());
row.createCell(2).setCellValue(node.getParentId());
// 判断是否需要合并单元格
if (j > 0) {
for (int k = 0; k < 3; k++) {
if (nodeList.get(j - 1).getValueByIndex(k).equals(node.getValueByIndex(k)) && !merged[j - 1][k]) {
CellRangeAddress mergedRegion = new CellRangeAddress(j - 1 + 1, j + 1, k, k);
sheet.addMergedRegion(mergedRegion);
merged[j - 1][k] = true;
merged[j][k] = true;
}
}
}
}
}
// 输出Excel
try {
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
```
这样修改后,每个单元格都会被考虑到合并情况,而不仅仅是第三列。
阅读全文