EasyExcel模板填充 导出Excel
参考官网easyExcel例 :https://www.yuque.com/easyexcel/doc/fill
1.简单对象填充:
/**
* 根据id导出Excel模板
* @param id
* @param response
*/
@Override
public void exportExcelTemplateById(String id, HttpServletResponse response) throws IOException {
// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
String path = this.getClass().getClassLoader().getResource("template/lswttjXtxz.xls").getPath();
System.out.println("path========================"+path+"======================");
File fileTemp = new File(path);
//查询需要导出的数据
PageData pd = new PageData();
pd.put("id",StringUtil2.subStrForInQuery(id));
List<TLswttjXtxz> lswttjXtxz = tLswttjXtxzMapper.getTLswttjXtxzByMonth(pd);
//导出直接浏览器下载
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
//设置要导出的文件的名字、这里URLEncoder.encode可以防止中文乱码
String fileName = "问题统计表" + System.currentTimeMillis()+".xls";
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" +fileName);
OutputStream outputStream = response.getOutputStream();
EasyExcel.write(outputStream).withTemplate(fileTemp).sheet().doFill(lswttjXtxz.get(0));
}
excel模板:
2.复杂、多条数据填充
/**
* 根据id导出Excel模板
* @param id
* @param response
*/
@Override
public void exportExcelTemplateById(String id, HttpServletResponse response) throws IOException {
// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替 {} 代表普通变量 {.} 代表是list的变量
//1.创建excel模板
String path = this.getClass().getClassLoader().getResource("template/lswttjXtxz.xls").getPath();
System.out.println("path========================"+path+"======================");
//2.导出直接浏览器下载
response.reset();
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
//设置要导出的文件的名字、这里URLEncoder.encode可以防止中文乱码
String fileName = "问题统计表" + System.currentTimeMillis()+".xls";
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" +fileName);
OutputStream outputStream = response.getOutputStream();
ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(path).build();
//3.填充赋值、查询需要导出的数据
PageData pd = new PageData();
pd.put("id",StringUtil2.subStrForInQuery(id));
List<TLswttjXtxz> lswttjXtxzList = tLswttjXtxzMapper.getTLswttjXtxzByMonth(pd);
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
// 如果数据量大 list不是最后一行 参照下一个
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
excelWriter.fill(lswttjXtxzList, fillConfig, writeSheet);
Map<String, Object> map = new HashMap<String, Object>();
map.put("tbdw", "2019年10月9日13:28:28");
map.put("tbsj", 1000);
map.put("tbr", 1000);
map.put("lxfs", 1000);
excelWriter.fill(map, writeSheet);
excelWriter.finish();
}
!
如果想要保存到指定目录,更改outputStream;以上测试没问题,可以进一步自己封装一下,封装到工具类。遇到的问题:1.pom.xml文件里面加以下内容,否则编译后classes里面模板乱码
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.docx</exclude>
<exclude>**/*.xls</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>**/*.docx</include>
<include>**/*.xls</include>
</includes>
</resource>
</resources>
</build>
2.我用自己本地创建excel当做模板报错,可能和版本有关,粘贴到官方的excel模板例子里就可以了;