阿里easyexcel通过模板导出excel

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


阿里easyexcel通过模板导出excel

模板里,普通变量的插值通过 {var}占位,列表则是{.var}。

  1. maven依赖
   <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.2.0-beta1</version>
    </dependency>



  1. 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);
    }
}


  1. 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

github示例代码
https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/fill/FillTest.java

当然,EasyExcel不仅可以填充Excel模板进行数据导出,它还有常规的读写Excel,官方给的实例代码来看,还是操作简易,入手很快。



现在回想起之前的操作Excel的方法,感觉是比较陈旧,操作繁杂。本来操作Excel就是作为一个"工具人",以前的操作方式代码量很大,还都是重复的造***,阿里EasyExcel就如命名一样,基于上层的再构造,原来我们去操作表单和单元格,现在都没有了,只需要关注表格的构造和渲染,而不必要去实现 数据的基础读写,大大的简化了开发的效率!估计也是阿里内部自己基于业务需要Excel的操作,做的东西然后开源出来了,点赞!

本文地址:https://blog.csdn.net/u010328541/article/details/107486266

猜你喜欢