示例代码

DEMO代码地址:https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java

最简单的填充

since

2.1.1

模板

填充 - 图1

最终效果

填充 - 图2

对象
  1. @Data
  2. public class FillData {
  3. private String name;
  4. private double number;
  5. }

代码
  1. /**
  2. * 最简单的填充
  3. *
  4. * @since 2.1.1
  5. */
  6. @Test
  7. public void simpleFill() {
  8. // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
  9. String templateFileName =
  10. TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "simple.xlsx";
  11. // 方案1 根据对象填充
  12. String fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
  13. // 这里 会填充到第一个sheet, 然后文件流会自动关闭
  14. FillData fillData = new FillData();
  15. fillData.setName("张三");
  16. fillData.setNumber(5.2);
  17. EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);
  18. // 方案2 根据Map填充
  19. fileName = TestFileUtil.getPath() + "simpleFill" + System.currentTimeMillis() + ".xlsx";
  20. // 这里 会填充到第一个sheet, 然后文件流会自动关闭
  21. Map<String, Object> map = new HashMap<String, Object>();
  22. map.put("name", "张三");
  23. map.put("number", 5.2);
  24. EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
  25. }

填充列表

since

2.1.1

模板

填充 - 图3

最终效果

填充 - 图4

对象

参照:对象

代码
  1. /**
  2. * 填充列表
  3. *
  4. * @since 2.1.1
  5. */
  6. @Test
  7. public void listFill() {
  8. // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
  9. // 填充list 的时候还要注意 模板中{.} 多了个点 表示list
  10. String templateFileName =
  11. TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "list.xlsx";
  12. // 方案1 一下子全部放到内存里面 并填充
  13. String fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
  14. // 这里 会填充到第一个sheet, 然后文件流会自动关闭
  15. EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(data());
  16. // 方案2 分多次 填充 会使用文件缓存(省内存)
  17. fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";
  18. ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
  19. WriteSheet writeSheet = EasyExcel.writerSheet().build();
  20. excelWriter.fill(data(), writeSheet);
  21. excelWriter.fill(data(), writeSheet);
  22. // 千万别忘记关闭流
  23. excelWriter.finish();
  24. }

复杂的填充

since

2.1.1

模板

填充 - 图5

最终效果

填充 - 图6

对象

参照:对象

代码
  1. /**
  2. * 复杂的填充
  3. *
  4. * @since 2.1.1
  5. */
  6. @Test
  7. public void complexFill() {
  8. // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
  9. // {} 代表普通变量 {.} 代表是list的变量
  10. String templateFileName =
  11. TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "complex.xlsx";
  12. String fileName = TestFileUtil.getPath() + "complexFill" + System.currentTimeMillis() + ".xlsx";
  13. ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
  14. WriteSheet writeSheet = EasyExcel.writerSheet().build();
  15. // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
  16. // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
  17. // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
  18. // 如果数据量大 list不是最后一行 参照下一个
  19. FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
  20. excelWriter.fill(data(), fillConfig, writeSheet);
  21. excelWriter.fill(data(), fillConfig, writeSheet);
  22. Map<String, Object> map = new HashMap<String, Object>();
  23. map.put("date", "2019年10月9日13:28:28");
  24. map.put("total", 1000);
  25. excelWriter.fill(map, writeSheet);
  26. excelWriter.finish();
  27. }

数据量大的复杂填充

since

2.1.1

模板

填充 - 图7

最终效果

填充 - 图8

对象

参照:对象

代码
  1. /**
  2. * 数据量大的复杂填充
  3. * <p>
  4. * 这里的解决方案是 确保模板list为最后一行,然后再拼接table.还有03版没救,只能刚正面加内存。
  5. *
  6. * @since 2.1.1
  7. */
  8. @Test
  9. public void complexFillWithTable() {
  10. // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
  11. // {} 代表普通变量 {.} 代表是list的变量
  12. // 这里模板 删除了list以后的数据,也就是统计的这一行
  13. String templateFileName =
  14. TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "complexFillWithTable.xlsx";
  15. String fileName = TestFileUtil.getPath() + "complexFillWithTable" + System.currentTimeMillis() + ".xlsx";
  16. ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
  17. WriteSheet writeSheet = EasyExcel.writerSheet().build();
  18. // 直接写入数据
  19. excelWriter.fill(data(), writeSheet);
  20. excelWriter.fill(data(), writeSheet);
  21. // 写入list之前的数据
  22. Map<String, Object> map = new HashMap<String, Object>();
  23. map.put("date", "2019年10月9日13:28:28");
  24. excelWriter.fill(map, writeSheet);
  25. // list 后面还有个统计 想办法手动写入
  26. // 这里偷懒直接用list 也可以用对象
  27. List<List<String>> totalListList = new ArrayList<List<String>>();
  28. List<String> totalList = new ArrayList<String>();
  29. totalListList.add(totalList);
  30. totalList.add(null);
  31. totalList.add(null);
  32. totalList.add(null);
  33. // 第四列
  34. totalList.add("统计:1000");
  35. // 这里是write 别和fill 搞错了
  36. excelWriter.write(totalListList, writeSheet);
  37. excelWriter.finish();
  38. // 总体上写法比较复杂 但是也没有想到好的版本 异步的去写入excel 不支持行的删除和移动,也不支持备注这种的写入,所以也排除了可以
  39. // 新建一个 然后一点点复制过来的方案,最后导致list需要新增行的时候,后面的列的数据没法后移,后续会继续想想解决方案
  40. }

横向的填充

since

2.1.1

模板

填充 - 图9

最终效果

填充 - 图10

对象

参照:对象

代码
  1. /**
  2. * 横向的填充
  3. *
  4. * @since 2.1.1
  5. */
  6. @Test
  7. public void horizontalFill() {
  8. // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
  9. // {} 代表普通变量 {.} 代表是list的变量
  10. String templateFileName =
  11. TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "horizontal.xlsx";
  12. String fileName = TestFileUtil.getPath() + "horizontalFill" + System.currentTimeMillis() + ".xlsx";
  13. ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
  14. WriteSheet writeSheet = EasyExcel.writerSheet().build();
  15. FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
  16. excelWriter.fill(data(), fillConfig, writeSheet);
  17. excelWriter.fill(data(), fillConfig, writeSheet);
  18. Map<String, Object> map = new HashMap<String, Object>();
  19. map.put("date", "2019年10月9日13:28:28");
  20. excelWriter.fill(map, writeSheet);
  21. // 别忘记关闭流
  22. excelWriter.finish();
  23. }

多列表组合填充填充

since

2.2.0-beta1

模板

image.png

最终效果

image.png

对象

参照:对象

代码
  1. /**
  2. * 多列表组合填充填充
  3. *
  4. * @since 2.2.0-beta1
  5. */
  6. @Test
  7. public void compositeFill() {
  8. // 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
  9. // {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list
  10. String templateFileName =
  11. TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "composite.xlsx";
  12. String fileName = TestFileUtil.getPath() + "compositeFill" + System.currentTimeMillis() + ".xlsx";
  13. ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
  14. WriteSheet writeSheet = EasyExcel.writerSheet().build();
  15. FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
  16. // 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹
  17. excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
  18. excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
  19. excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
  20. excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
  21. excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
  22. excelWriter.fill(new FillWrapper("data3", data()), writeSheet);
  23. Map<String, Object> map = new HashMap<String, Object>();
  24. map.put("date", "2019年10月9日13:28:28");
  25. excelWriter.fill(map, writeSheet);
  26. // 别忘记关闭流
  27. excelWriter.finish();
  28. }