简单的excel填充
先导入相关依赖
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version></dependency><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version><scope>compile</scope></dependency>
编写需要用到的填充对象
@Getter
@Setter
@EqualsAndHashCode
public class FillData {private String name;private double number;private String date;
}
相关测试类
public class simpleFill {/*** 根据模板进行单个填充*/@Testpublic void simpleFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// 造好一个相关的模板String templateFileName = "C:\\Users\\861123024\\Desktop\\mqtt压测软件\\自造热交数据\\excelTemplate.xlsx";// 方案1 根据对象填充String fileName = "C:\\Users\\simpleFill.xlsx";// 这里 会填充到第一个sheet, 然后文件流会自动关闭FillData fillData = new FillData();fillData.setName("张三");fillData.setNumber(5.2);EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);// 方案2 根据Map填充fileName = "C:\\Users\\simpleFill.xlsx";// 这里 会填充到第一个sheet, 然后文件流会自动关闭Map<String, Object> map = new HashMap<>();map.put("name", "张三");map.put("number", 5.2);EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);}/*** 根据模板进行多个填充*/@Testpublic void listFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// 填充list 的时候还要注意 模板中{.} 多了个点 表示list// 如果填充list的对象是map,必须包涵所有list的key,哪怕数据为null,必须使用map.put(key,null)String templateFileName = "C:\\Users\\excelTemplate.xlsx";// 方案1 一下子全部放到内存里面 并填充String fileName = "C:\\Users\\listFill.xlsx";// 这里 会填充到第一个sheet, 然后文件流会自动关闭/* EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());*/// 方案2 分多次 填充 会使用文件缓存(省内存)fileName = "C:\\Users\\listFill.xlsx";ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet().build();excelWriter.fill(data(), writeSheet);excelWriter.fill(data(), writeSheet);}finally {excelWriter.finish();}}/*** 根据模板进行复杂填充*/@Testpublic void complexFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量String templateFileName = "C:\\Users\\excelTemplate.xlsx";String fileName = "C:\\Users\\complexFill.xlsx";// 方案1EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet().build();// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存// 如果数据量大 list不是最后一行 参照下一个FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(data(), fillConfig, writeSheet);excelWriter.fill(data(), fillConfig, writeSheet);Map<String, Object> map = new HashMap<>();map.put("date", "2019年10月9日13:28:28");map.put("total", 1000);excelWriter.fill(map, writeSheet);} finally {excelWriter.finish();}}/*** 数据量大的复杂填充*/@Testpublic void complexFillWithTable() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量// 这里模板 删除了list以后的数据,也就是统计的这一行String templateFileName = "C:\\Users\\excelTemplate.xlsx";String fileName = "C:\\Users\\complexFillWithTable.xlsx";// 方案1ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet().build();// 直接写入数据excelWriter.fill(data(), writeSheet);excelWriter.fill(data(), writeSheet);// 写入list之前的数据Map<String, Object> map = new HashMap<String, Object>();map.put("date", "2019年10月9日13:28:28");excelWriter.fill(map, writeSheet);// list 后面还有个统计 想办法手动写入// 这里偷懒直接用list 也可以用对象List<List<String>> totalListList = new ArrayList<>();List<String> totalList = new ArrayList<>();totalListList.add(totalList);totalList.add(null);totalList.add(null);totalList.add(null);// 第四列totalList.add("统计:1000");// 这里是write 别和fill 搞错了excelWriter.write(totalListList, writeSheet);// 总体上写法比较复杂 但是也没有想到好的版本 异步的去写入excel 不支持行的删除和移动,也不支持备注这种的写入,所以也排除了可以// 新建一个 然后一点点复制过来的方案,最后导致list需要新增行的时候,后面的列的数据没法后移,后续会继续想想解决方案} finally {excelWriter.finish();}}/*** 根据横向模板进行横向的填充*/@Testpublic void horizontalFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量String templateFileName ="C:\\Users\\excelTemplate1.xlsx";String fileName = "C:\\Users\\horizontalFill.xlsx";// 方案1ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet().build();FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();excelWriter.fill(data(), fillConfig, writeSheet);excelWriter.fill(data(), fillConfig, writeSheet);Map<String, Object> map = new HashMap<>();map.put("date", "2019年10月9日13:28:28");excelWriter.fill(map, writeSheet);} finally {excelWriter.finish();}}/*** 组合填充模板进行填充*/@Testpublic void compositeFill() {// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替// {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的listString templateFileName ="C:\\Users\\excelTemplate2.xlsx";String fileName = "C:\\Users\\compositeFill.xlsx";// 方案1ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();try {WriteSheet writeSheet = EasyExcel.writerSheet(0,"sheet0").build();FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);excelWriter.fill(new FillWrapper("data2", data()), writeSheet);excelWriter.fill(new FillWrapper("data2", data()), writeSheet);excelWriter.fill(new FillWrapper("data3", data()), writeSheet);excelWriter.fill(new FillWrapper("data3", data()), writeSheet);Map<String, Object> map = new HashMap<String, Object>();//map.put("date", "2019年10月9日13:28:28");map.put("date", new Date());excelWriter.fill(map, writeSheet);} finally {excelWriter.finish();}}private List<Object> data() {List<Object> list = new ArrayList<>();FillData fillData = new FillData();for (int i = 0; i < 10; i++) {fillData.setName("小明");fillData.setNumber(1);list.add(fillData);}return list;}
}
相关对应模板:
横向模板
组合模板
若想深入了解可看:https://easyexcel.opensource.alibaba.com/docs/current/