当前位置: 首页 > 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对象。

相关文章:

  • 2025年MathorCup数学应用挑战赛D题问题一求解与整体思路分析
  • 51单片机实验二:数码管静态显示
  • yarn的定义,yarn的三大组件及各自作用,yarn的三个资源调度策略
  • 音乐播放对接状态栏MediaSession控制
  • Yocto项目实战教程 · 第4章:4.3小节-层
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析
  • Linux:线程概念与控制
  • L38.【LeetCode题解】四数之和(双指针思想) 从汇编角度分析报错原因
  • 如何在米尔-STM32MP257开发板上部署环境监测系统
  • DeepSeek编程新手全栈指南:从Python到网站搭建的避坑实战手册
  • 力扣最热一百题——二叉搜索树中第 K 小的元素
  • namesapce、cgroup
  • 边缘计算网关组态功能的定义
  • 计算机视觉cv2入门之车牌号码识别
  • 代码随想录算法训练营day7(字符串)
  • C++:PTA L1-006 连续因子
  • 中华传承-医山命相卜-梅花易数
  • leetcode0145. 二叉树的后序遍历-easy
  • 班翎流程平台 | 全新Agent节点,助您构建企业智能流程
  • 极狐GitLab 登录限制如何设置?
  • 新城市志|全球供应链动荡加剧,中国稳外贸有信心有底气
  • 上海浦东召开高水平改革开放推进会,综合型企业出海服务平台启动
  • 习近平同柬埔寨首相洪玛奈举行会谈
  • 中国驻德国大使馆公使曾颖如,调任广州医科大学党委书记
  • 商务部:敦促美方立即停止极限施压,停止胁迫讹诈
  • 山东海事局通报3起商渔船碰撞事故:将严打违反避碰规则等违法行为