不想努力的程序员 2024-07-10 16:32 采纳率: 52.1%
浏览 10
已结题

springboot+poi导出自定义excel时,部分表头没有数据

在使用poi生成excel时,第一行已经合并了,在第二行输入表头时,只有一个最后几个输入进去了,我是在一个for循环中添加的,只有最后执行fora循环才添加了,具体代码如下


  int row2 = 3;
            int row3 = 3;
            for (Subject subject : finalSubjectList) {
                String subjectName = subject.getSubjectName();
                //  Cell cell3 = sheet.createRow(1);
                Cell cell2 = headerRow.createCell(row2);
                System.out.println(subjectName);
                cell2.setCellValue(subjectName);
                cell2.setCellStyle(headerStyle);
                Row headerRow1 = sheet.createRow(1);
                System.out.println(row3);

                Cell cell6 = headerRow1.createCell(row3);
                cell6.setCellValue("选择题分数");
                cell6.setCellStyle(headerStyle);
                row3++;
                System.out.println(row3);
                Cell cell4 = headerRow1.createCell(row3);
                cell4.setCellValue("非选择分数");
                cell4.setCellStyle(headerStyle);
                row3++;
                System.out.println(row3);
                Cell cell5 = headerRow1.createCell(row3);
                cell5.setCellValue("分数");
                cell5.setCellStyle(headerStyle);
                if (!teacherDataParamsVO.isShowRanking()) {
                    CellRangeAddress cellAddresses34 = new CellRangeAddress(0, 0, row2, row2 + 2);
                    sheet.addMergedRegion(cellAddresses34);

                    row2 = row2 + 3;
                }
                if (teacherDataParamsVO.isShowRanking()) {
                    CellRangeAddress cellAddresses34 = new CellRangeAddress(0, 0, row2, row2 + 3);
                    sheet.addMergedRegion(cellAddresses34);
                    row3++;
                    System.out.println(row3);
                    Cell className = headerRow1.createCell(row3);
                    className.setCellValue("班名");
                    className.setCellStyle(headerStyle);

                    row2 = row2 + 4;
                }
                row3++;
            }

导出来的结果如下图

img

应该在其他科目下也有的,目前只是在语文下面有,我查看了一下控制台,row3都有值

img

这是哪里的问题?

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2024-07-10 16:32
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    您好,根据您提供的代码和描述,问题可能出在几个方面:

    1. 循环内创建行:在您的for循环中,您每次循环都创建了新的headerRow1,这可能会导致前一个循环创建的行被覆盖。在循环外创建行可以解决这个问题。

    2. 行和列索引的使用:您的代码中row2row3的使用可能存在逻辑错误。在循环中不断增加row3的值,但没有正确地为每个科目设置新的行,这可能导致表头重叠或丢失。

    3. 合并单元格的逻辑:合并单元格的逻辑可能影响了表头的显示。您需要确保合并单元格的逻辑与科目的数量和布局相匹配。

    针对您的问题,我建议以下几个步骤来解决:

    • 确保行的创建在循环外:将headerRow1的创建移到循环外,并确保在整个过程中只创建一次。

    • 正确设置行和列索引:检查row2row3的逻辑,确保每个科目都有足够的空间来放置其表头,并且不会与其他科目的表头重叠。

    • 调整合并单元格的逻辑:根据是否显示排名来正确设置合并单元格的逻辑,确保不会影响其他科目的表头显示。

    • 调试和验证:在代码中添加更多的打印语句来验证row2row3的值,确保它们在循环中按预期增加。

    下面是一些调整后的代码示例,供您参考:

    // 创建headerRow1一次,并在循环外
    Row headerRow1 = sheet.createRow(1);
    
    int row2 = 3; // 初始化row2
    for (Subject subject : finalSubjectList) {
        String subjectName = subject.getSubjectName();
        // ... 其他代码 ...
    
        // 为每个科目创建新的行来放置表头
        Row currentRow = sheet.createRow(row2);
        Cell cell2 = currentRow.createCell(0); // 假设科目名称在第一列
        cell2.setCellValue(subjectName);
        cell2.setCellStyle(headerStyle);
    
        // 根据是否显示排名来设置表头
        if (teacherDataParamsVO.isShowRanking()) {
            // ... 设置排名相关的表头 ...
        } else {
            // ... 设置不显示排名的表头 ...
        }
    
        // 更新row2以指向下一个科目的起始行
        row2 += (teacherDataParamsVO.isShowRanking() ? 4 : 3);
    }
    
    // 确保headerRow1用于设置表头样式
    for (int i = 0; i < headerRow1.getLastCellNum(); i++) {
        Cell cell = headerRow1.getCell(i);
        if (cell != null) {
            cell.setCellStyle(headerStyle);
        }
    }
    

    请注意,这只是一个示例,您可能需要根据您的具体需求来调整代码。

    至于参考链接,由于您的问题比较具体,可能需要查看Apache POI的官方文档或者搜索相关的Stack Overflow问题来获取更详细的解决方案。这里没有特定的链接可以提供,但是您可以使用关键词如“Apache POI Excel header row creation”或“Apache POI merged regions issue”进行搜索。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 8月6日
  • 已采纳回答 7月29日
  • 创建了问题 7月10日

悬赏问题

  • ¥15 c++2013读写oracle
  • ¥15 c++ gmssl sm2验签demo
  • ¥15 关于模的完全剩余系(关键词-数学方法)
  • ¥15 有没有人懂这个博图程序怎么写,还要跟SFB连接,真的不会,求帮助
  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音