关于使用EsayExcel导出动态列的解决方案
使用拦截器实现
EasyExcel.write(response.getOutputStream(), clazz)
.registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle))
.registerWriteHandler(new ExcelRowWriterHandler())
.sheet("xx信息").doWrite(data);
实现RowWriteHandler接口
class ExcelRowWriterHandler implements RowWriteHandler {
@Override
public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer integer, Integer integer1, Boolean aBoolean) {
}
@Override
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {
}
@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {
}
}
先新增对应的表头
@Override
public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {
if (ExcelUtil.count != null && ExcelUtil.count > 0) {
// 最后一列的下标
int index = 89;
for(int i = 1; i <=ExcelUtil.count; i++) {
row.getSheet().setVerticallyCenter(true);
row.getSheet().setHorizontallyCenter(true);
Cell cell = row.getSheet().getRow(0).createCell(index);
cell.setCellValue("新增表头名称");
Workbook workbook = row.getSheet().getWorkbook();
// 设置style格式
CellStyle cellStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
font.setFontName("宋体");
font.setFontHeightInPoints((short) 14);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
row.getSheet().setColumnWidth(index, 30 * 256);
index ++;
}
}
}
在对新增的列添加对应的数据
@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer integer, Boolean aBoolean) {
if (ExcelUtil.count != null && ExcelUtil.count > 0) {
int index1 = 89;
String cell1 = row.getCell(0).getStringCellValue();
if (StrUtil.isNotBlank(cell1) && !cell1.equals("矿源唯一标识")) {
List<LongitudeLatitudeInfo> longitudeLatitudeInfos = ExcelUtil.LongitudeLatitudeMap.get(Long.valueOf(cell1));
if (CollUtil.isNotEmpty(longitudeLatitudeInfos)) {
for (LongitudeLatitudeInfo info:longitudeLatitudeInfos) {
Cell cell = row.getSheet().getRow(integer).createCell(index1);
cell.setCellValue(info.getLongitude()+","+info.getLatitude());
index1 ++;
}
}
}
}
}