easyExcel 模板填充 动态单元格填充后样式存在问题如下
这是模板文件
寻求有能力的技术解决问题
并且有一些生成的行高很窄不知道为什么?数据也混乱
代码如下
代码如下
1、
public Boolean edit(FurnitureContractRowReq contractRowReq) {
// contractHeadService.update(new LambdaUpdateWrapper<FurnitureContractHead>()
// .eq(FurnitureContractHead::getId, contractRowReq.getId())
// .set(FurnitureContractHead::getTotal, contractRowReq.getTotal())
// .set(FurnitureContractHead::getConcessionalRate, contractRowReq.getConcessionalRate())
// );
this.remove(new LambdaQueryWrapper<FurnitureContractRow>()
.eq(FurnitureContractRow::getContractHeadId, contractRowReq.getId()));
for (FurnitureContractRow row : contractRowReq.getRows()) {
if (row.getType() == 2 && StringUtils.hasText(row.getColumn0())) {
String[] imgs = row.getColumn0().split(",");
if (imgs.length > 0 && !ObjectUtils.isEmpty(imgs[0])) row.setColumn0(imgs[0]);
if (imgs.length > 1 && !ObjectUtils.isEmpty(imgs[1])) row.setColumn1(imgs[1]);
if (imgs.length > 2 && !ObjectUtils.isEmpty(imgs[2])) row.setColumn2(imgs[2]);
if (imgs.length > 3 && !ObjectUtils.isEmpty(imgs[3])) row.setColumn3(imgs[3]);
}
row.setId(null);
row.setContractHeadId(contractRowReq.getId());
}
boolean b = this.saveBatch(contractRowReq.getRows());
//生成Excel文件
FurnitureContractHead byId = contractHeadService.getById(contractRowReq.getId());
FurnitureSalesOrders salesOrders = ordersService.getById(byId.getSalesOrdersId());
FurnitureSalesOrdersRemittanceLog ordersRemittanceLog = ordersRemittanceLogService.getOne(new LambdaQueryWrapper<FurnitureSalesOrdersRemittanceLog>()
.eq(FurnitureSalesOrdersRemittanceLog::getSalesOrdersId, byId.getSalesOrdersId())
);
List<FurnitureContractRow> contractProductExcels = contractRowReq.getRows();
String orderNumber = "";
// File file = new File("/usr/local/app/temp/" + "contract_" + contractRowReq.getId() + ".xlsx");
File file = new File("/Users/zhangzhenxing/Downloads/" + "contract_" + contractRowReq.getId() + ".xlsx");
Set<CellRangeAddress> cellRangeAddresses = new HashSet<>();
ExcelWriterBuilder write = EasyExcel.write(file);
int index = 7;
int index1 = 1;
List<Map<String, Object>> data = new ArrayList<>();
for (FurnitureContractRow contractProductExcel : contractProductExcels) {
if (contractProductExcel.getType() == 0) {
CellRangeAddress cellAddresses = new CellRangeAddress(index, index, 1, 6);
cellRangeAddresses.add(cellAddresses);
// write.registerWriteHandler(new MergeCellStrategyHandler(index, 0, 6, false));
Map<String, Object> map = CollectionUtil.objectToMap(contractProductExcel);
data.add(map);
//图示
} else if (contractProductExcel.getType() == 2) {
CellRangeAddress cellAddresses = new CellRangeAddress(index, index, 1, 6);
cellRangeAddresses.add(cellAddresses);
// write.registerWriteHandler(new MergeCellStrategyHandler(index, 2, 6, false));
Map<String, Object> map = new HashMap<>();
if (StringUtils.hasText(contractProductExcel.getColumn0())) {
map.put("column0", imageCells(HttpUtil.createGet(contractProductExcel.getColumn0()).execute().bodyBytes()));
}
if (StringUtils.hasText(contractProductExcel.getColumn1())) {
map.put("column1", imageCells(HttpUtil.createGet(contractProductExcel.getColumn1()).execute().bodyBytes()));
}
if (StringUtils.hasText(contractProductExcel.getColumn2())) {
map.put("column2", imageCells(HttpUtil.createGet(contractProductExcel.getColumn2()).execute().bodyBytes()));
}
if (StringUtils.hasText(contractProductExcel.getColumn3())) {
map.put("column3", imageCells(HttpUtil.createGet(contractProductExcel.getColumn3()).execute().bodyBytes()));
}
data.add(map);
} else {
// write.registerWriteHandler(new MergeCellStrategyHandler(index, 8, 8, true));
contractProductExcel.setSort(index1);
Map<String, Object> map = CollectionUtil.objectToMap(contractProductExcel);
if (StringUtils.hasText(contractProductExcel.getColumn1())) {
map.put("column1", imageCells(HttpUtil.createGet(contractProductExcel.getColumn1()).execute().bodyBytes()));
}
data.add(map);
index1++;
}
index++;
}
try (ExcelWriter excelWriter = write
.registerWriteHandler(new AddCellRangeWriteHandler(cellRangeAddresses))
// .registerWriteHandler(new RowWriteHandler() {
// @Override
// public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
// row.setHeight((short) 1600);
// }
// })
.withTemplate(new ClassPathResource("template/excel/orderContract.xlsx").getInputStream())
.excelType(ExcelTypeEnum.XLSX)
.build()) {
WriteSheet writeSheet = EasyExcel.writerSheet(0)
.sheetName("合同")
.build();
List<WriteHandler> customWriteHandlerList = writeSheet.getCustomWriteHandlerList();
//填充列表
// Workbook workbook = excelWriter.writeContext().writeWorkbookHolder().getWorkbook();
excelWriter.fill(data, FillConfig.builder().forceNewRow(Boolean.TRUE).build(), writeSheet);
//填充对象
excelWriter.fill(Map.of("orderNumber", orderNumber,
"contacts", byId.getContacts(),
"telephone", byId.getPhone()
), writeSheet);
excelWriter.finish();
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
String s = aliYunOssUtil.writeOssBytes(Files.readAllBytes(Paths.get(file.getAbsolutePath())), UUID.randomUUID() + ".xlsx");
System.out.println("s = " + s);
// contractHeadService.update(new LambdaUpdateWrapper<FurnitureContractHead>()
// .eq(FurnitureContractHead::getId, contractRowReq.getId())
// .set(FurnitureContractHead::getFileUrl, s)
// );
} catch (Exception e) {
e.printStackTrace();
}
// file.delete();
return b;
}
2、
private WriteCellData<Void> imageCells(byte[] bytes) {
WriteCellData<Void> writeCellData = new WriteCellData<>();
// 这里可以设置为 EMPTY 则代表不需要其他数据了
// writeCellData.setType(CellDataTypeEnum.EMPTY);
// 可以放入多个图片
List<ImageData> imageDataList = new ArrayList<>();
writeCellData.setImageDataList(imageDataList);
ImageData imageData = new ImageData();
imageDataList.add(imageData);
imageData.setImage(bytes);
// 图片类型
//imageData.setImageType(ImageData.ImageType.PICTURE_TYPE_PNG);
// 上 右 下 左边距 类似于 css 的 margin
imageData.setTop(0);
imageData.setRight(0);
imageData.setBottom(0);
imageData.setLeft(0);
// relative表示相对于当前的单元格index。first是左上点,last是对角线的右下点,这样确定一个图片的位置和大小。
// 例:0,0,0,0 表示在当前单元格大小,FirstRow:0,FirstColumn:0,LastRow:0,LastColumn:1 表示图片基于当前单元格,横向占据两个单元格,纵向占据两个单元格
imageData.setRelativeFirstRowIndex(0);
imageData.setRelativeFirstColumnIndex(0);
imageData.setRelativeLastRowIndex(0);
imageData.setRelativeLastColumnIndex(0);
return writeCellData;
}
3、
/**
* 添加合并区Handler
*/
public class AddCellRangeWriteHandler extends AbstractMergeStrategy {
private final Set<CellRangeAddress> rangeCellList;
public AddCellRangeWriteHandler(Set<CellRangeAddress> rangeCellList) {
this.rangeCellList = (rangeCellList == null) ? new HashSet<>() : rangeCellList;
}
@Override
protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
if (CollectionUtils.isEmpty(rangeCellList)) {
if (cell.getRowIndex() == 7) {
for (CellRangeAddress item : rangeCellList) {
sheet.addMergedRegionUnsafe(item);
}
}
}
}
}
4、