easyexcel通过模板导出excel
之前使用其他方式进行excel的导出,像poi或者freemarker或者Beetl,效果都还行,但是总是有一些小问题。许多的解决思路都是:通过制作excel模板,然后另存为xml格式,再对里面的xml节点进行循环遍历或者变量的填充,最后保存为ftl或者btl,再通过他的jar提供的填充方法生成excel。操作起来的话,有些方式有些繁杂,有些方式生成出的excel存在些小问题。其实追根到底,他们都是将其保存为xml进行的操作,流下载的时候保存为xls或者xlsx,但是其本质还是xml文件。所以下载的excel文件,在wps上可以正常打开,但是office打开却有提示:格式与文件扩展名指定的格式不一样,客户体验不好。
在解决生成的excel打开会警告格式与文件扩展名指定的格式不一样,终于找到一个完美的解决方法,那就是alibaba 的easyexcel,经过测试后发现效果很好,操作还很方便,不得不佩服阿里这样的大公司的技术积累。
性能也是刚刚的:64M内存1分钟内读取75M(46W行25列)的Excel
废话不多说,示例地址:
https://alibaba-easyexcel.github.io/quickstart/fill.html
模板里,普通变量的插值通过 {var}占位,列表则是{.var}。
- maven依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta1</version>
</dependency>
- File工具类
public class FileUtil {
public static InputStream getResourcesFileInputStream(String fileName) {
return Thread.currentThread().getContextClassLoader().getResourceAsStream("" + fileName);
}
public static String getPath() {
return FileUtil.class.getResource("/").getPath();
}
public static File createNewFile(String pathName) {
File file = new File(getPath() + pathName);
if (file.exists()) {
file.delete();
} else {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
}
return file;
}
public static File readFile(String pathName) {
return new File(getPath() + pathName);
}
}
- controller代码
@Override
public void exportInfo(HttpServletResponse response) throws IOException {
OutputStream out = null;
BufferedOutputStream bos = null;
try {
String templateFileName = FileUtil.getPath() + "templates" + File.separator + "模板.xls";
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("下载后的名称.xls", "utf-8");
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));
out = response.getOutputStream();
bos = new BufferedOutputStream(out);
//读取Excel
ExcelWriter excelWriter = EasyExcel.write(bos).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
//list map 是查询并需导出的数据,并且里面的字段和excel需要导出的字段对应
// 直接写入Excel数据
List<Map> list = xxx;
Map<String,Object> map = yyy;
excelWriter.fill(list, writeSheet);
excelWriter.fill(map, writeSheet);
excelWriter.finish();
bos.flush();
} catch (Exception e) {
}
}
模板放在 templates 目录下
参考的博客是:https://blog.csdn.net/weixin_42153503/article/details/104994360
github地址是:
https://github.com/alibaba/easyexcel
当然,EasyExcel不仅可以填充Excel模板进行数据导出,它还有常规的读写Excel,官方给的实例代码来看,还是操作简易,入手很快。
现在回想起之前的操作Excel的方法,感觉是比较陈旧,操作繁杂。本来操作Excel就是作为一个"工具人",以前的操作方式代码量很大,还都是重复的造轮子,阿里EasyExcel就如命名一样,基于上层的再构造,原来我们去操作表单和单元格,现在都没有了,只需要关注表格的构造和渲染,而不必要去实现 数据的基础读写,大大的简化了开发的效率!估计也是阿里内部自己基于业务需要Excel的操作,做的东西然后开源出来了,点赞!