1
如图
如图
我尝试重写 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);
}
}
}
}
}
查看源码中有段逻辑
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);
}
}