当前位置: 首页 > news >正文

easyexcel使用模板填充excel坑点总结

1.单层map设置值是{属性},那使用两层map进行设置值,是不是可以使用{属性.属性},以为取出map里字段只用{属性}就可以设置值,那再加个.就可以从里边map取出对应属性,没有两层map写法
填充得到的文件打开报错 was empty (zero bytes long)

Map<String, Map<String, String>> map = new HashMap<>();Map<String, String> map1 = new HashMap<>();map1.put("name", "张三");map1.put("age", "18");HashMap<String, String> map2 = new HashMap<>();map2.put("name", "李四");map2.put("age", "19");map.put("obj1", map1);map.put("obj2", map2);ExcelWriter excelWriter = EasyExcel.write(EXCEL_OUPUT_FILE_PATH).withTemplate(TEMPLATE_FILE_PATH).build(); // 构建ExcelWriter对象 整个文件对象WriteSheet sheet1 = EasyExcel.writerSheet("Sheet1").build(); // 构建sheet对象excelWriter.fill(map, sheet1); //将操作的sheet和数据填充到ExcelWriter对象中

2.尝试使用map包对象写法,想着反正是.,那里面是对象就可以使用了吧,填充后文件还是报文件 was empty (zero bytes long)

public static final String EXCEL_OUPUT_FILE_PATH = "templateOutput/template1Output.xlsx";public static final String TEMPLATE_FILE_PATH = "excelTemplate/template1.xlsx";static class Person {public String name;public String age;}public static void main(String[] args) {Map<String, Person> map = new HashMap<>();Map<String, String> map1 = new HashMap<>();Person person = new Person();person.name = "张三";person.age = "18";map1.put("name", "张三");map1.put("age", "18");HashMap<String, String> map2 = new HashMap<>();Person person1 = new Person();person1.name = "李四";person1.age = "19";map2.put("name", "李四");map2.put("age", "19");map.put("obj1", person);map.put("obj2", person1);ExcelWriter excelWriter = EasyExcel.write(EXCEL_OUPUT_FILE_PATH).withTemplate(TEMPLATE_FILE_PATH).build(); // 构建ExcelWriter对象 整个文件对象WriteSheet sheet1 = EasyExcel.writerSheet("Sheet1").build(); // 构建sheet对象excelWriter.fill(map, sheet1); //将操作的sheet和数据填充到ExcelWriter对象中}

3.使用创建EasyWriter和WriteSheet对象,直接使用
EasyExcel.write(filePath).withTemplate(excelTemplate).sheet(0).doFill(excelDataMap);

EasyExcel.write(filePath).withTemplate(excelTemplate).sheet(1).doFill(excelDataMap);

对两个sheet进行填充,只有最后一个sheet设置了值。
应该创建EasyWriter和WriterSheet对象进行设置值

正确写法:

Map<String, String> excelDataMap = new HashMap();
ExcelWriter excelWriter = EasyExcel.write(filePath).withTemplate(asInputStream).build();
WriteSheet sheet1 = EasyExcel.writerSheet(0).build();
WriteSheet sheet2 = EasyExcel.writerSheet(0).build();
excelWriter.fill(sheet1, excelDataMap);
excelWriter.fill(sheet2, excelDataMap);
excelWriter.finish();

4.使用,没有告诉excelwriter对象,结束导入,导致生成的excel文件打不开,报was empty (zero bytes long)。应该在写入完成后调用

excelWriter.finish();

完整用法:

Map<String, String> excelDataMap = new HashMap();
ExcelWriter excelWriter = EasyExcel.write(filePath).withTemplate(asInputStream).build();
WriteSheet sheet1 = EasyExcel.writerSheet(0).build();
WriteSheet sheet2 = EasyExcel.writerSheet(0).build();
excelWriter.fill(sheet1, excelDataMap);
excelWriter.fill(sheet2, excelDataMap);
excelWriter.finish();

5.由于我需要将模版文件的某些sheet复制多个形成新的模版,但又不想多产生一个模版文件,我将输出文件和文件和模版文件都设置成一个

ExcelWriter excelWriter = EasyExcel.write(TEMPLATE_FILE_PATH).withTemplate(TEMPLATE_FILE_PATH).build();

报错Exception in thread "main" com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure
    at com.alibaba.excel.context.WriteContextImpl.<init>(WriteContextImpl.java:98)
    at com.alibaba.excel.write.ExcelBuilderImpl.<init>(ExcelBuilderImpl.java:36)
    at com.alibaba.excel.ExcelWriter.<init>(ExcelWriter.java:36)
    at com.alibaba.excel.write.builder.ExcelWriterBuilder.build(ExcelWriterBuilder.java:114)
    at org.example.demotask.util.EasyexcelUtils.main(EasyexcelUtils.java:60)
Caused by: org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)

复制模版里的sheet形成新的模版赋值导出写法:

Map<String, String> map = new HashMap();Map<String, Map<String, String>> lotMap = new HashMap();//获取的模板文件位置String excelTemplate = "path";FileInputStream fileInputStream = new FileInputStream(excelTemplate);InputStream templateStream = fileInputStream;Workbook workbook = WorkbookFactory.create(templateStream);List<String> fatherSheet = Lists.newArrayList("Sheet1");ArrayList<String> lotNames = new ArrayList<>(lotMap.keySet());//复制sheetfor (String cloneSheet : fatherSheet) {for (String lotName : lotNames) {//根据要复制的sheet名拿到要复制的sheetSheet templateSheet = workbook.getSheet(cloneSheet);Sheet newSheet = workbook.cloneSheet(workbook.getSheetIndex(templateSheet));int newSheetIndex = workbook.getSheetIndex(newSheet);  // 获取新克隆的 sheet 索引//设置复制的sheet名workbook.setSheetName(newSheetIndex, cloneSheet + "(" + lotName + ")");}}//新建内存输出流,作为新的模版文件输出ByteArrayOutputStream ops = new ByteArrayOutputStream();workbook.write(ops);ops.flush();byte[] byteArray = ops.toByteArray();ops.close();workbook.close();//使用新的文件的字节流作为模板文件输入InputStream asInputStream = new ByteArrayInputStream(byteArray);// 原文件流后续已不使用,此处关闭templateStream.close();ops.close();ExcelWriter excelWriter = EasyExcel.write("D:\\newnewnewFormat111.xlsx").withTemplate(asInputStream).build();WriteSheet mainSheet = EasyExcel.writerSheet("Sheet1").build();excelWriter.fill(map, mainSheet);for (String lotName : lotNames) {WriteSheet sheet = EasyExcel.writerSheet("Sheet1(" + lotName + ")").build();excelWriter.fill(lotMap.get(lotName), sheet);}//重要 使用excelWriter写入完一定要调用finish方法,不然文件打不开excelWriter.finish();

总结:
1.使用Map类型进行填充只有能普通类型
2.模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
3. {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list

WriteSheet writeSheet = EasyExcel.writerSheet().build();List<String> list1 = new ArrayList<>();list1.add("张三");list1.add("李四");ArrayList<String> list2 = new ArrayList<>();list2.add("11");list2.add("22");//设置列表展开方向,默认垂直FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹excelWriter.fill(new FillWrapper("data1", list1), fillConfig, writeSheet);excelWriter.fill(new FillWrapper("data2", list1), writeSheet);

4.使用ExcelWriter进行sheet写入时完成时,最好调用ExcelWriter对象的finish()方法,不然可能出现文件损坏的情况

5.模版文件路径不要跟输出文件路径,如果不想输出临时的模版文件,可以将产生新的写入内存流,然后将内存流的字节数据写入字节输入流作为模板输入
 

    String excelTemplate = "path";FileInputStream fileInputStream = new FileInputStream(excelTemplate);InputStream templateStream = fileInputStream;Workbook workbook = WorkbookFactory.create(templateStream);List<String> fatherSheet = Lists.newArrayList("Sheet1");ArrayList<String> lotNames = new ArrayList<>(lotMap.keySet());//复制sheetfor (String cloneSheet : fatherSheet) {for (String lotName : lotNames) {//根据要复制的sheet名拿到要复制的sheetSheet templateSheet = workbook.getSheet(cloneSheet);Sheet newSheet = workbook.cloneSheet(workbook.getSheetIndex(templateSheet));int newSheetIndex = workbook.getSheetIndex(newSheet);  // 获取新克隆的 sheet 索引//设置复制的sheet名workbook.setSheetName(newSheetIndex, cloneSheet + "(" + lotName + ")");}}//新建内存输出流,作为新的模版文件输出ByteArrayOutputStream ops = new ByteArrayOutputStream();workbook.write(ops);ops.flush();byte[] byteArray = ops.toByteArray();ops.close();workbook.close();//使用新的文件的字节流作为模板文件输入InputStream asInputStream = new ByteArrayInputStream(byteArray);// 原文件流后续已不使用,此处关闭templateStream.close();ops.close();ExcelWriter excelWriter = EasyExcel.write("D:\\newnewnewFormat111.xlsx").withTemplate(asInputStream).build();

6.使用EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);进行填充会出现只有最后一个sheet填充成功,如果想对多个sheet进行填充,要使用ExcelWriter对象操作数据和sheet对象。

http://www.xdnf.cn/news/13069.html

相关文章:

  • Kotlin协程Semaphore withPermit约束并发任务数量
  • chili3d调试笔记3 加入c++ 大模型对话方法 cmakelists精读
  • PY32F003+TIM+外部中断实现对1527解码
  • 【Test Test】灰度化和二值化处理图像
  • 6TOPS算力NPU加持!RK3588如何重塑8K显示的边缘计算新边界
  • 嵌入式音视频开发指南:从MPP框架到QT实战全解析
  • 3D 视觉赋能仓储精准高效:ID Logistics 与 Stereolabs 的创新合作之旅
  • Java开发中的常用注解
  • 字符串系列一>最长回文子串
  • 给予FLUX更好的控制:FLUX.1-dev-ControlNet-Union-Pro-2.0
  • Redis——网络模型之IO讲解
  • 大模型微服务架构模块实现方案,基于LLaMA Factory和Nebius Cloud实现模型精调的标准流程及代码
  • Android——动画
  • IPTV电视信息发布直播点播系统:营造数字化个性化融合化多媒体IPTV电视信息发布平台
  • 预训练与微调:大模型如何“学习知识”?
  • Python 网络爬虫基础理论与实战指南
  • 【每日八股】复习计算机网络 Day1:TCP 的头部结构 + TCP 确保可靠传输 + TCP 的三次握手
  • 【漫话机器学习系列】209.均值的标准误差(Standard Error of the Mean)
  • 完整的 .NET 6 分布式定时任务实现(Hangfire + Redis 分布式锁)
  • 故障诊断常用算法
  • 2025妈妈杯数学建模D题完整分析论文
  • Kubernetes Pod 调度策略:从基础到进阶
  • java面向对象09:方法的重写
  • PyTorch入门------卷积神经网络
  • TCP/IP和UDP协议的发展历程
  • POSIX 信号量(Semaphore)
  • MacOS怎么显示隐藏文件
  • Vue3 实战:打造多功能旅游攻略选项卡页面
  • 记录学习的第二十九天
  • unity TEngine学习记录3