目录
Easy Excel 填充
1、简单填充
模板:
1.1、方式一:根据对象填充
@Data
public class FillData {
private String name;
private double number;
private Date date;
}
/**
* 方式一:根据对象填充
*/
@Test
public void simpleFill1() {
// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
String templateName = "./src/main/resources/fill.xlsx";
String fileName = "./src/main/resources/success.xlsx";
// 这里 会填充到第一个sheet, 然后文件流会自动关闭
FillData fillData = new FillData();
fillData.setName("张三");
fillData.setNumber(5.2);
fillData.setDate(new Date());
EasyExcel.write(fileName).withTemplate(templateName).sheet().doFill(fillData);
}
1.2、方式二:根据Map填充
/**
* 方式二:根据Map填充
*/
@Test
public void simpleFill2() {
// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
String templateName = "./src/main/resources/fill.xlsx";
String fileName = "./src/main/resources/success.xlsx";
Map<String, Object> map = MapUtils.newHashMap();
map.put("name", "张三");
map.put("number", 5.2);
EasyExcel.write(fileName).withTemplate(templateName).sheet().doFill(map);
}
2、填充列表
模板:
2.1、方式一:全部放入内存,一次性填充
/**
* 方式一:全部放入内存,一次性填充
*/
@Test
public void listFill1() {
// 填充list 的时候还要注意 模板中{.} 多了个点 表示list
// 如果填充list的对象是map,必须包涵所有list的key,哪怕数据为null,必须使用map.put(key,null)
String templateName = "./src/main/resources/list.xlsx";
String fileName = "./src/main/resources/success.xlsx";
// 这里 会填充到第一个sheet, 然后文件流会自动关闭
EasyExcel.write(fileName).withTemplate(templateName).sheet().doFill(data());
}
/**
* 生成数据
* @return
*/
private List<FillData> data() {
List<FillData> list = ListUtils.newArrayList();
for (int i = 0; i < 10; i++) {
FillData data = new FillData();
data.setName("A" + i);
data.setNumber(2.202 * i);
data.setDate(new Date());
list.add(data);
}
return list;
}
2.2、方式二:分多次填充 会使用文件缓存(省内存)
/**
* 方式二:分多次填充 会使用文件缓存(省内存)
*/
@Test
public void listFill2() {
// 填充list 的时候还要注意 模板中{.} 多了个点 表示list
// 如果填充list的对象是map,必须包涵所有list的key,哪怕数据为null,必须使用map.put(key,null)
String templateName = "./src/main/resources/list.xlsx";
String fileName = "./src/main/resources/success.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateName).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(data(), writeSheet);
excelWriter.fill(data(), writeSheet);
}
}
3、复杂填充
模板:
@Test
public void complexFill() {
String templateName = "./src/main/resources/fuza.xlsx";
String fileName = "./src/main/resources/success.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateName).build()) {
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 = MapUtils.newHashMap();
map.put("date", "2019年10月9日13:28:28");
map.put("total", 1000);
excelWriter.fill(map, writeSheet);
}
}
4、数据量大的复杂填充
模板:
@Test
public void complexFillWithTable() {
String templateName = "./src/main/resources/fuza.xlsx";
String fileName = "./src/main/resources/success.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateName).build()) {
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 = ListUtils.newArrayList();
List<String> totalList = ListUtils.newArrayList();
totalListList.add(totalList);
totalList.add(null);
totalList.add(null);
totalList.add(null);
// 第四列
totalList.add("统计:1000");
// 这里是write 别和fill 搞错了
excelWriter.write(totalListList, writeSheet);
// 总体上写法比较复杂 但是也没有想到好的版本 异步的去写入excel 不支持行的删除和移动,也不支持备注这种的写入,所以也排除了可以
// 新建一个 然后一点点复制过来的方案,最后导致list需要新增行的时候,后面的列的数据没法后移,后续会继续想想解决方案
}
}
5、横向的填充
模板:
@Test
public void horizontalFill() {
String templateName = "./src/main/resources/hengxiang.xlsx";
String fileName = "./src/main/resources/success.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateName).build()) {
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);
}
}
6、多列表组合填充
模板:
@Test
public void compositeFill() {
String templateName = "./src/main/resources/multi.xlsx";
String fileName = "./src/main/resources/success.xlsx";
try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateName).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet().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("data2", 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);
}
}