欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

阿里easyexcel通过模板导出excel

程序员文章站 2022-05-04 08:49:33
easyexcel通过模板导出excel之前使用其他方式进行excel的导出,像poi或者freemarker或者Beetl,效果都还行,但是总是有一些小问题。许多的解决思路都是:通过制作excel模板,然后另存为xml格式,再对里面的xml节点进行循环遍历或者变量的填充,最后保存为ftl或者btl,再通过他的jar提供的填充方法生成excel。操作起来的话,有些方式有些繁杂,有些方式生成出的excel存在些小问题。其实追根到底,他们都是将其保存为xml进行的操作,流下载的时候保存为xls或者xlsx,但...

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