近期需要做一个导出,模板的样子如下
有4行是表头,最后一行是合计
使用的 easyexcel 的版本为
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.1</version>
</dependency>
经过试错了几次后,最终处理结果如下
// 合计单元格样式
WriteCellStyle summaryCellStyle = new WriteCellStyle();
summaryCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
summaryCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy();
horizontalCellStyleStrategy.setContentWriteCellStyleList(CustomArrayUtis.toList(summaryCellStyle));
ExcelWriter excelWriter = EasyExcel.write(xlsFilePath, IncomeTuanPlatform.class)
.registerWriteHandler(new CustomCellWeightWeightConfig2())
// 合并策略
.registerWriteHandler(new ColumnMergeStrategy(list.size()))
.registerWriteHandler(horizontalCellStyleStrategy)
.build();
WriteSheet writeSheet = EasyExcel.writerSheet(1, sheetName).needHead(Boolean.FALSE).build();
WriteTable writeTable = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
excelWriter.write(list, writeSheet, writeTable);
int settledAmountSum = 0;
int taxSum = 0;
int excludeTaxAmountSum = 0;
String taxRate = null;
for (IncomeTuanPlatform data : list) {
settledAmountSum += CustomMathUtils.yuan2fen(data.getSettledAmount());
taxRate = data.getTaxRate();
taxSum += CustomMathUtils.yuan2fen(data.getTax());
excludeTaxAmountSum = CustomMathUtils.yuan2fen(data.getExcludeTaxAmount());
}
// 合计
excelWriter.write(createIncomeData(settledAmountSum, taxSum, excludeTaxAmountSum, taxRate), writeSheet);
excelWriter.finish();
public class ColumnMergeStrategy implements RowWriteHandler {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
// 数据总数
private int dataCount;
public ColumnMergeStrategy(int dataCount) {
this.dataCount = dataCount;
}
@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
// logger.info("afterRowDispose");
// 经过多次测试,发现不同的数据量处理的方式不同,难道是跟合并列的数量有关系?
boolean flag = dataCount <= 3;
if (flag) {
int summaryRowIndex = dataCount + 4;
if (relativeRowIndex.intValue() == dataCount) {
logger.info("relativeRowIndex:{}", relativeRowIndex);
CellRangeAddress mergeRange = new CellRangeAddress(summaryRowIndex, summaryRowIndex, 0, 2);
writeSheetHolder.getSheet().addMergedRegionUnsafe(mergeRange);
}
} else {
int totalIndex = dataCount - 1;
// 由于表头是4行,所以需要处理一下
int summaryRowIndex = dataCount + 4;
if (relativeRowIndex.intValue() == totalIndex) {
logger.info("relativeRowIndex:{}, summaryRowIndex:{}", relativeRowIndex, summaryRowIndex);
CellRangeAddress mergeRange = new CellRangeAddress(summaryRowIndex, summaryRowIndex, 0, 2);
writeSheetHolder.getSheet().addMergedRegion(mergeRange);
}
}
}
}
最终结果
有一个问题是所有的行都居中了,这个问题目前没找到可以单独设置合计行的样式的api,后面看一下。
参考链接
https://blog.csdn.net/qq_20426717/article/details/121040243
https://blog.csdn.net/weixin_46114883/article/details/129031331