覆盖
填充列表时新增一行向下填充应该使用
forceNewRow(Boolean.TRUE)
代码如下:
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 填充数据
excelWriter.fill(expList, fillConfig, writeSheet);
excelWriter.fill(proList, fillConfig, writeSheet);
excelWriter.fill(testList, fillConfig, writeSheet);
模板:
结果发现forceNewRow(Boolean.TRUE)不生效,数据不会新增一行,而是直接覆盖sheet页中原有内容
原因:填充多个列表时,应该使用FillWrapper来包裹前缀
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 填充数据
excelWriter.fill(new FillWrapper("exp", expList), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("pro", proList), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("test", testList), fillConfig, writeSheet);
新模板:
合并失效
OnceAbsoluteMergeStrategy合并单元格时,新增的数据行合并失败,第0列合并失败
代码如下:
int exp_size = expList.size();
int pro_size = proList.size();
int test_size = testList.size();
int firstRowIndex = 22 + exp_size + pro_size;
int lastRowIndex = firstRowIndex + test_size - 1;
OnceAbsoluteMergeStrategy strategy1 = new OnceAbsoluteMergeStrategy(firstRowIndex, lastRowIndex, 0, 0);
OnceAbsoluteMergeStrategy strategy2 = new OnceAbsoluteMergeStrategy(firstRowIndex, lastRowIndex, 2, 2);
OnceAbsoluteMergeStrategy strategy3 = new OnceAbsoluteMergeStrategy(firstRowIndex, lastRowIndex, 4, 4);
for (int i = 0; i < exp_size; i++) {
OnceAbsoluteMergeStrategy strategy = new OnceAbsoluteMergeStrategy(8 + i, 8 + i, 2, 2);
list.add(strategy);
}
list.add(strategy1);
list.add(strategy2);
list.add(strategy3);
for (OnceAbsoluteMergeStrategy item : list) {
writerBuilder.registerWriteHandler(item);
}
下载结果:
解决方案:
重写CellWriteHandler 来合并坐标
private CellWriteHandler CellMergeStrategy(int i, int j, int k) {
return new CellWriteHandler() {
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex,
Boolean isHead) {
int rowIndex = cell.getRowIndex();
if (rowIndex >= 9 && rowIndex <= 7 + i && i != 0 && columnIndex == 2) {
CellRangeAddress cellAddresses = new CellRangeAddress(rowIndex, rowIndex, 2, 3);
writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses);
}
if (rowIndex >= 11 + i && rowIndex <= 9 + i + j && j != 0 && columnIndex == 2) {
CellRangeAddress cellAddresses = new CellRangeAddress(rowIndex, rowIndex, 2, 5);
writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses);
}
if (rowIndex == 22 + i + j && k != 0 && columnIndex == 1) {
CellRangeAddress cellAddresses1 = new CellRangeAddress(rowIndex, rowIndex + k - 1, 0, 0);
CellRangeAddress cellAddresses2 = new CellRangeAddress(rowIndex, rowIndex + k - 1, 2, 2);
CellRangeAddress cellAddresses3 = new CellRangeAddress(rowIndex, rowIndex + k - 1, 4, 4);
writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses1);
writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses2);
writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses3);
}
}
};
}
CellWriteHandler mergeStrategy = CellMergeStrategy(expList.size(), proList.size(), testList.size());
writerBuilder.registerWriteHandler(mergeStrategy);
下载结果:
边框线缺失
创建缺失的单元格,重新设置cellStyle
private CellWriteHandler CellMergeStrategy(int i, int j, int k) {
return new CellWriteHandler() {
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex,
Boolean isHead) {
int rowIndex = cell.getRowIndex();
int columnIndex = cell.getColumnIndex();
// 样式
CellStyle cellStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle();
cellStyle.cloneStyleFrom(writeSheetHolder.getCachedSheet().getRow(1).getCell(1).getCellStyle());
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
if (rowIndex >= 9 && rowIndex <= 7 + i && i != 0 && columnIndex == 2) {
// 补充边框线
writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(3);
writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(3).setCellStyle(cellStyle);
}
if (rowIndex >= 11 + i && rowIndex <= 9 + i + j && j > 1 && columnIndex == 2) {
// 补充边框线
writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(3);
writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(4);
writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(5);
writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(3).setCellStyle(cellStyle);
writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(4).setCellStyle(cellStyle);
writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(5).setCellStyle(cellStyle);
}
if (rowIndex == 22 + i + j && k > 1 && columnIndex == 1) {
// 补充边框线
for (int m = 1; m < k; m++) {
writeSheetHolder.getCachedSheet().createRow(rowIndex + m);
writeSheetHolder.getCachedSheet().getRow(rowIndex + m).createCell(0);
writeSheetHolder.getCachedSheet().getRow(rowIndex + m).createCell(2);
writeSheetHolder.getCachedSheet().getRow(rowIndex + m).createCell(4);
}
writeSheetHolder.getCachedSheet().getRow(rowIndex + k - 1).getCell(0).setCellStyle(cellStyle);
writeSheetHolder.getCachedSheet().getRow(rowIndex + k - 1).getCell(2).setCellStyle(cellStyle);
writeSheetHolder.getCachedSheet().getRow(rowIndex + k - 1).getCell(4).setCellStyle(cellStyle);
}
}
};
}
下载结果: