alibaba/easyexcel
View on GitHub使用FillConfig.builder().forceNewRow(true)函数之后,他会将我需要的固定行还是给覆盖掉,大佬有解决方法不
Open
#3,845 opened on Jun 19, 2024
help wanted
Repository metrics
- Stars
- (33,728 stars)
- PR merge metrics
- (No merged PRs in 30d)
Description
@RestControllerMapping("/erpIntf/spot_check_excel")
public class EquipmentSpotCheckExcelController {
@GetMapping("/excel")
public void easyExcelTest(HttpServletResponse response) throws IOException {
// 填充普通数据
Map<String, String> fillMap = new HashMap<>();
fillMap.put("equipmentNumber", "小力设备");
fillMap.put("lineNumber", "四线");
fillMap.put("y1", "2024");
fillMap.put("m1", "06");
fillMap.put("ab", "A班");
fillMap.put("bb", "b班");
// 填充的集合数据
List<Map<String, String>> dataList = getDataList();
// 模板文件流
//ByteArrayOutputStream outputStream = EasyExcelUtils.exportExcelByTemplate(fillMap, dataList, "", 0, true, new MyCellWriteHandler());
InputStream fileInputStream = Files.newInputStream(ResourceUtils.getFile("E:\\jobwork\\文档\\大理华晟MES\\XX点检记录表(导出模板)(1).xlsx").toPath());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ExcelWriter excelWriter = null;
try {
ExcelWriterBuilder write = EasyExcel.write(outputStream);
write.registerWriteHandler(new MyCellWriteHandler());
excelWriter = write.withTemplate(fileInputStream).build();
/*
这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
如果数据量大 list不是最后一行 参照下一个
*/
FillConfig fillConfig = FillConfig.builder().forceNewRow(true).build();
// sheet页
WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
excelWriter.fill(fillMap, writeSheet);
// 填充list数据,因为list数据后面还需填充其他数据,所以需要fillConfig
excelWriter.fill(dataList, fillConfig, writeSheet);
} finally {
//关闭流
if (excelWriter != null) {
excelWriter.finish();
}
}
// 下面还可以使用poi进行二次操作
//InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
//Workbook workbook = new XSSFWorkbook(inputStream);
//Sheet sheetAt = workbook.getSheetAt(0);
//Row row = sheetAt.getRow(2);
//int col = CellReference.convertColStringToIndex("F");
//Cell cell = row.getCell(col);
//cell.setCellValue("poi设置的值");
//setCellStyle(cell);
// 运算函数
// XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook);
//ByteArrayOutputStream outputStream1 = new ByteArrayOutputStream();
//workbook.write(outputStream1);
EasyExcelUtils.toResponseStream(outputStream, response);
}
/**
* 测试数据
*/
public static List<Map<String, String>> getDataList() {
List<Map<String, String>> listData = new ArrayList<>();
Random random = new Random();
for (int i = 0; i < 10; i++) {
Map<String, String> map = new HashMap<>();
map.put("d", String.valueOf(random.nextInt(101)));
map.put("e", String.valueOf(random.nextInt(101)));
map.put("d1", String.valueOf(random.nextInt(101)));
map.put("d2", String.valueOf(random.nextInt(101)));
map.put("e1", String.valueOf(random.nextInt(101)));
map.put("e2", String.valueOf(random.nextInt(101)));
listData.add(map);
}
return listData;
}
问题描述
下面是我填充的模板,红线框出是需要动态的填充的模板部分
在我的示例代码中就填充了几个,呈现的效果如下
他并没有展示20行数据,并且中间的“设备技术员签字确认”行不见了“
想要保留,并且{.d}列和{.e}各有十行数据,帮忙看看呗,大佬