[alibaba/easyexcel]合并单元格时导出后, excel内合计数值不对, 不是真的合并单元格, 怎么解决

2024-01-04 168 views
1

如图 image

回答

0

我尝试重写 WorkbookWriteHandler的afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder)进行解决,但是结果并没有达到预期

从sheet中可以获取数据行数只拿到了最后100行数据,我的总行数为120行,前20行数据未能处理,代码如下

@Override
  public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) {
      Iterator<Sheet> sheetIterator = writeWorkbookHolder.getWorkbook().sheetIterator();
      while (sheetIterator.hasNext()) {
          Sheet sheet = sheetIterator.next();
          List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
          if (CollectionUtils.isEmpty(mergedRegions)) {
              continue;
          }
          for (CellRangeAddress mergedRegion : mergedRegions) {
              for (int ri = mergedRegion.getFirstRow(); ri <= mergedRegion.getLastRow(); ri++) {
                  Row row = sheet.getRow(ri);
                  for (int ci = mergedRegion.getFirstColumn(); ci <= mergedRegion.getLastColumn(); ci++) {
                      // 保留左上角单元格值
                      if (ri == mergedRegion.getFirstRow() && ci == mergedRegion.getFirstColumn()) {
                          continue;
                      }
                      row.getCell(ci).setCellValue((String) null);
                  }
              }
          }
      }
  }
8

查看源码中有段逻辑

if(_randomAccessWindowSize >= 0 && _rows.size() > _randomAccessWindowSize) {
      try {
          flushRows(_randomAccessWindowSize);
      } catch (IOException ioe) {
          throw new RuntimeException(ioe);
      }
  }

其中_randomAccessWindowSize默认值为100,前20行会被flush到磁盘

由于场景数据量少我通过SXSSFSheet#setRandomAccessWindowSize方法重新设定了长度,暂时解决了问题

public class ExcelSheetWriteHandler implements SheetWriteHandler {

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 解除只可访问100行限制 所有数据不刷盘,都可访问
        ((SXSSFSheet) writeSheetHolder.getSheet()).setRandomAccessWindowSize(-1);
    }
}