easyexcel 填充合并单元格时 写模板语法的行数据获取不到

xoefb8l8  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(43)

填充模板 导出Excel时合并单元格时 写模板语法的行数据获取不到

问题描述

后面合并都没有问题 是不是因为第一行写的是模板语法才导致获取不到{.index}

导出代码

// 调用合并单元格工具类,此工具类是根据工程名称相同则合并后面数据
        ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(mergeColumnIndex, mergeRowIndex);
           
         InputStream templateInputStream = ExcelMergeUtil.class.getClassLoader().getResourceAsStream(templatePath);
         try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(templateInputStream).build()) {
             WriteSheet writeSheet = EasyExcel.writerSheet()
                     .registerWriteHandler(excelFillCellMergeStrategy)
                     .build();
             // 直接写入数据
             excelWriter.fill(list, writeSheet);
         }

合并单元格 关键代码

/**
* 当前单元格向上合并
*
* @param writeSheetHolder /
* @param cell             当前单元格
* @param curRowIndex      当前行
* @param curColIndex      当前列
*/
    private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
        Object curData = cell.getCellType() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
        if (cell.getSheet().getRow(curRowIndex - 1) == null) {
            //这里取不到数据 也就是第一行写模板语法的数据
//            throw new BusinessException("获取上一行数据为null");
            return;
        }
        Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
        Object preData = preCell.getCellType() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();
        // 将当前单元格数据与上一个单元格数据比较
        Boolean dataBool = preData.equals(curData);
        Boolean bool = cell.getRow().getCell(curColIndex).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex).getStringCellValue());
        if (dataBool && bool) {
            Sheet sheet = writeSheetHolder.getSheet();
            List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
            boolean isMerged = false;
            for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
                CellRangeAddress cellRangeAddr = mergeRegions.get(i);
                // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
                if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
                    sheet.removeMergedRegion(i);
                    cellRangeAddr.setLastRow(curRowIndex);
                    sheet.addMergedRegion(cellRangeAddr);
                    isMerged = true;
                }
            }
            // 若上一个单元格未被合并,则新增合并单元
            if (!isMerged) {
                CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
                sheet.addMergedRegion(cellRangeAddress);
            }
        }
    }

有没有大佬知道 这是bug还是写法有问题

iqih9akk

iqih9akk1#

我不通过模板,而是直接生成Excel 没有这样的问题

// 调用合并单元格工具类,此工具类是根据工程名称相同则合并后面数据
      ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(mergeColumnIndex, mergeRowIndex);
      EasyExcel.write(response.getOutputStream(), TestData.class)
              .registerWriteHandler(excelFillCellMergeStrategy)
              .autoCloseStream(Boolean.TRUE).sheet()
              .doWrite(list);

相关问题