当前位置: 首页 > 后端技术 > Java

EasyExcel填充Excel

时间:2023-04-01 22:51:42 Java

原文地址Demo地址最简单的填充模板效果对象@Getter@Setter@EqualsAndHashCodepublicclassFillData{privateStringname;私人双号;privateDatedate;}代码/***最简单的填充**@since2.1.1*/@TestpublicvoidsimpleFill(){//注意模板使用{}表示你要使用的变量。如果有"{","}"特殊字符,用"\{","\}"代替StringtemplateFileName=TestFileUtil.getPath()+"demo"+File.separator+"fill"+File.separator+“简单.xlsx”;//方案1根据对象填充StringfileName=TestFileUtil.getPath()+"simpleFill"+System.currentTimeMillis()+".xlsx";//这里会填充第一张sheet,然后自动关闭文件流FillDatafillData=newFillData();fillData.setName("张三");fillData.setNumber(5.2);EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);//方案2根据Map填写fileName=TestFileUtil.getPath()+"simpleFill"+System.currentTimeMillis()+".xlsx";//这里会先填充第一个sheet,然后自动关闭文件流Mapmap=newHashMap();map.put("姓名","张三");map.put("数字",5.2);EasyExcel.write(文件名).withTemplate(模板文件名).sheet().doFill(地图);}Filllist模板效果代码/***Filllist**@since2.1.1*/@TestpublicvoidlistFill(){//注意模板使用{}表示如果已经存在要使用的变量"{","}"特殊字符替换为"\{","\}"//填充列表时,还要注意模板中的{.}表示列表StringtemplateFileName=TestFileUtil.getPath()+"demo"+File.separator+"fill"+File.separator+"list.xlsx";//解决方案1一次性全部放入内存并填充StringfileName=TestFileUtil.getPath()+"listFill"+System.currentTimeMillis()+".xlsx";//这里会填充到第一个sheet,然后自动关闭文件流EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());//方案二会使用文件缓存进行多次填充(节省内存)jdk8//since:3.0.0-beta1fileName=TestFileUtil.getPath()+"listFill"+System.currentTimeMillis()+".xlsx";EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(()->{//分页查询数据returndata();});//方案三会使用文件缓存(节省内存)进行多次填充。fileName=TestFileUtil.getPath()+"listFill"+System.currentTimeMillis()+".xlsx";ExcelWriterexcelWriter=EasyExcel.write(fileName).withTemplate(templateFileName).build();WriteSheetwriteSheet=EasyExcel.writerSheet().build();excelWriter.fill(数据(),writeSheet);excelWriter.fill(data(),writeSheet);//不要忘记关闭流程excelWriter.finish();}复杂填充模板最终效果生成代码/***复杂填充**@since2.1.1*/@TestpublicvoidcomplexFill(){//注意模板使用{}表示如果有"{","}你要使用的变量"特殊字符用"\{","\}"代替//{}代表普通变量{.}代表列表变量StringtemplateFileName=TestFileUtil.getPath()+"demo"+File.separator+"fill"+File.separator+"complex.xlsx";StringfileName=TestFileUtil.getPath()+"complexFill"+System.currentTimeMillis()+".xlsx";ExcelWriterexcelWriter=EasyExcel.write(fileName).withTemplate(templateFileName).build();WriteSheetwriteSheet=EasyExcel.writerSheet().build();//这里注意使用forceNewRow作为参数,意思是在写列表的时候,不管列表下面有没有空行,都会创建一行,然后后面的数据默认向后移动如果是false,直接使用下一行,没有则创建。//如果forceNewRow设置为true,有个缺点就是会把所有的数据都放在内存中,所以慎用下面还是数据填充时必须设置forceNewRow=true,但是这样会把所有数据放到内存中,会消耗大量内存//如果数据量很大,list不是最后一行,参考接下来的FillConfigfillConfig=FillConfig.builder().forceNewRow(Boolean.TRUE)。建造();excelWriter.fill(data(),fillConfig,writeSheet);excelWriter.fill(data(),fillConfig,writeSheet);Mapmap=newHashMap();地图。put("日期","2019年10月9日13:28:28");map.put("总计",1000);excelWriter.fill(map,writeSheet);excelWriter.finish();}datavolumeLargeandcomplexfillingtemplateeffectcode/***数据量大的复杂填充*

*这里的解决方法是保证模板列表是最后一行,然后拼接表格。还有03版没法保存,只能前面加内存。**@since2.1.1*/@TestpublicvoidcomplexFillWithTable(){//请注意,模板使用{}来指示您要使用的变量。如果有"{","}"特殊字符用"\{","\}"代替//{}代表普通变量{.}代表列表变量//这里模板删除列表后面的数据,这是统计行StringtemplateFileName=TestFileUtil.getPath()+"demo"+File.separator+"fill"+File.separator+"complexFillWithTable.xlsx";StringfileName=TestFileUtil.getPath()+"complexFillWithTable"+System.currentTimeMillis()+".xlsx";ExcelWriterexcelWriter=EasyExcel.write(fileName).withTemplate(templateFileName).build();WriteSheetwriteSheet=EasyExcel.writerSheet().build();//直接写入数据excelWriter.fill(data(),writeSheet);excelWriter.fill(数据(),writeSheet);//写入列表前的数据Mapmap=newHashMap();map.put("大te","October9,201913:28:28");excelWriter.fill(map,writeSheet);//list后面有个统计,想办法手动写//也可以用如果你懒的话直接列表ObjectList>totalListList=newArrayList>();ListtotalList=newArrayList();totalListList.add(totalList);totalList.add(null);totalList.add(null);totalList.add(null);//第四列totalList.add("Statistics:1000");//这里是写的,不要写错了fillexcelWriter.write(totalListList,writeSheet);excelWriter.finish();//总体来说,写法比较复杂,但是没想到异步写入excel的好版本,不支持行删除和移动,也不支持写注释,所以也排除了。//新建一个,然后一点点复制,最后当list需要添加新行的时候,后面的列的数据就不能了向后移动,以后会继续思考解决方案}横向填充模板最终效果代码/***横向填充**@since2.1.1*/@Testpublicvoidhorizo??ntalFill(){//注意模板使用{}指示您要使用的变量。如果有"{","}"特殊字符用"\{","\}"替换//{}代表普通变量{.}代表列表变量StringtemplateFileName=TestFileUtil.getPath()+"demo"+File.separator+"fill"+File.separator+"horizo??ntal.xlsx";StringfileName=TestFileUtil.getPath()+"horizo??ntalFill"+System.currentTimeMillis()+".xlsx";ExcelWriterexcelWriter=EasyExcel.write(fileName).withTemplate(templateFileName).build();WriteSheetwriteSheet=EasyExcel.writerSheet().build();FillConfigfillConfig=FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();excelWriter.fill(data(),fillConfig,writeSheet);excelWriter.fill(data(),fillConfig,writeSheet);Mapmap=newHashMap();map.put("日期","2019年10月9日13:28:28");excelWriter.fill(map,writeSheet);//不要忘记关闭流程excelWriter.finish();}多列表组合填充模板效果代码/***多个列表的复合填充**@since2.2.0-beta1*/@TestpublicvoidcompositeFill(){//注意模板使用{}表示你要使用的变量。如果有"{","}"特殊字符替换为"\{","\}"//{}代表普通变量{.}代表列表变量{prefix.}前缀可以区分不同的列表StringtemplateFileName=TestFileUtil.getPath()+"demo"+File.separator+"fill"+File.separator+"composite.xlsx";StringfileName=TestFileUtil.getPath()+"compositeFill"+System.currentTimeMillis()+".xlsx";ExcelWriterexcelWriter=EasyExcel.write(fileName).withTemplate(templateFileName).build();WriteSheetwriteSheet=EasyExcel.writerSheet().build();FillConfigfillConfig=FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();//如果有多个列表模板,必须有{prefix.}这里的前缀是data1,然后多个列表必须用FillWrapper包裹excelWriter.fill(newFillWrapper("data1",data()),fill配置,写表);excelWriter.fill(newFillWrapper("data1",data()),fillConfig,writeSheet);excelWriter.fill(newFillWrapper("data2",data()),writeSheet);excelWriter.fill(newFillWrapper("data2",data()),writeSheet);excelWriter.fill(newFillWrapper("data3",data()),writeSheet);excelWriter.fill(newFillWrapper("data3",data()),writeSheet);Mapmap=newHashMap();map.put("日期","2019年10月9日13:28:28");excelWriter.fill(map,writeSheet);//别忘记关闭流excelWriter.finish();}