愿你如阳光,明媚不忧伤。
5. 详解填充Excel
5.1 简单填充Excel
-
EasyExcelTemplateFile.xlsx
先在excel模板文件中设定好模板样式。注意:{}
前面加上转义符\
会忽略该属性。
-
EasyExcelData.java
创建与Excel模板相对应的实体类。
public class EasyExcelFillData {
private String name;
private Double age;
// 省略get和set
}
- EasyExcelDataController.java
填充Excel,这里提供两种方式填充
@RestController
@RequestMapping("/easyExcel")
public class EasyExcelDataController extends BaseController {
@Resource
EasyExcelDataListener easyExcelDataListener;
// 指定需要读的excel文件
String fileName = "C:/Users/ISCCF_A/Desktop/EasyExcelData.xlsx";
// 省略读取和写入部分
@RequestMapping("/fill")
public JsonResult<? extends Object> simpleFill(int mode) {
log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
// Excel模板文件
String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
// 要填充的文件
String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
if (mode == 1) {
// 方案1 根据对象填充
// 这里会填充到第一个sheet,然后文件流会自动关闭
EasyExcelFillData fillData = new EasyExcelFillData();
fillData.setName("张三");
fillData.setAge(24.2);
EasyExcel.write(fillAimFileName).withTemplate(templateFileName).sheet().doFill(fillData);
log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
return new JsonResult<EasyExcelFillData>(fillData, "Excel填充数据成功!");
} else {
// 方案2 根据Map填充
// 这里会填充到第一个sheet,然后文件流会自动关闭
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "李四");
map.put("age", 26.5);
EasyExcel.write(fillAimFileName).withTemplate(templateFileName).sheet().doFill(map);
log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
return new JsonResult<Map<String, Object>>(map, "Excel填充数据成功!");
}
}
}
浏览器访问 http://localhost:8080/easyExcel/fill?mode=1
- EasyExcelFillAimFile.xlsx
5.2 填充列表
- EasyExcelTemplateFile.xlsx
先在excel模板文件中设定好模板样式。注意:{}
前面加上转义符\
会忽略该属性。 模板中{.}
多了个点,表示list。
- EasyExcelUtil.java
创建填充数据
public class EasyExcelUtil {
public static List<EasyExcelFillData> testFillData() {
List<EasyExcelFillData> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
EasyExcelFillData data = new EasyExcelFillData();
data.setName("OUSEKI" + i);
data.setAge(18 + i * Math.random());
list.add(data);
}
return list;
}
}
- EasyExcelDataFillController.java
@RestController
@RequestMapping("/easyExcelFill")
public class EasyExcelDataFillController extends BaseController {
// Excel模板文件
String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
// 要填充的文件
String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
// 写入Excel的数据
List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
@RequestMapping("/listFill")
public void listFill(int mode) {
log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
if (mode == 1) {
// 方案1:一下子全部放到内存里面并填充
// 这里会填充到第一个sheet, 然后文件流会自动关闭
EasyExcel.write(fillAimFileName).withTemplate(templateFileName).sheet().doFill(list);
} else {
// 方案2:分多次填充,会使用文件缓存(省内存)
ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(list, writeSheet);
// 可以填充另一个文件中的内容,我这里没做额外数据
excelWriter.fill(list, writeSheet);
// 千万别忘记关闭流
excelWriter.finish();
}
log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
}
}
浏览器访问 http://localhost:8080/easyExcelFill/listFill?mode=10
5.3 复杂的填充
- EasyExcelTemplateFile.xlsx
先在excel模板文件中设定好模板样式。注意:{}
前面加上转义符\
会忽略该属性。 模板中{.}
多了个点,表示list。
- EasyExcelDataFillController.java
@RestController
@RequestMapping("/easyExcelFill")
public class EasyExcelDataFillController extends BaseController {
// Excel模板文件
String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
// 要填充的文件
String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
// 写入Excel的数据
List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
@RequestMapping("/complexFill")
public void complexFill() {
log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 这里注意,入参用了forceNewRow,代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// forceNewRow如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用!
// 简单的说,如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存,会很耗内存。
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
excelWriter.fill(list, fillConfig, writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", new Date());
map.put("total", 1000);
excelWriter.fill(map, writeSheet);
excelWriter.finish();
log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
}
}
浏览器访问 http://localhost:8080/easyExcelFill/complexFill
5.4 横向的填充
- EasyExcelTemplateFile.xlsx
先在excel模板文件中设定好模板样式。注意:{}
前面加上转义符\
会忽略该属性。 模板中{.}
多了个点,表示list。
- EasyExcelDataFillController.java
@RestController
@RequestMapping("/easyExcelFill")
public class EasyExcelDataFillController extends BaseController {
// Excel模板文件
String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
// 要填充的文件
String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
// 写入Excel的数据
List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
@RequestMapping("/horizontalFill")
public void horizontalFill() {
log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
excelWriter.fill(list, fillConfig, writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", new Date());
excelWriter.fill(map, writeSheet);
// 别忘记关闭流
excelWriter.finish();
log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
}
}
浏览器访问 http://localhost:8080/easyExcelFill/horizontalFill
5.5 多列表组合填充
- EasyExcelTemplateFile.xlsx
先在excel模板文件中设定好模板样式。注意:{}
前面加上转义符\
会忽略该属性。 模板中{.}
多了个点,表示list。
- EasyExcelDataFillController.java
@RestController
@RequestMapping("/easyExcelFill")
public class EasyExcelDataFillController extends BaseController {
// Excel模板文件
String templateFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelTemplateFile.xlsx";
// 要填充的文件
String fillAimFileName = "C:/Users/ISCCF_A/Desktop/EasyExcelFillAimFile.xlsx";
// 写入Excel的数据
List<EasyExcelFillData> list = EasyExcelUtil.testFillData();
@RequestMapping("/compositeFill")
public void compositeFill() {
log.info(startLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
ExcelWriter excelWriter = EasyExcel.write(fillAimFileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
// 如果有多个list,模板上必须有{前缀.} 这里的前缀就是data1,然后多个list必须用FillWrapper包裹
excelWriter.fill(new FillWrapper("data1", list), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("data2", list), writeSheet);
excelWriter.fill(new FillWrapper("data3", list), writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", new Date());
excelWriter.fill(map, writeSheet);
// 别忘记关闭流
excelWriter.finish();
log.info(endLog(Thread.currentThread().getStackTrace()[1].getMethodName()));
}
}
浏览器访问 http://localhost:8080/easyExcelFill/compositeFill