记一波easyexcel使用小坑

2018-12-28 笔记本

JAVA解析Excel工具easyexcel

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。

小坑

最近在使用easyexcel的时候,碰到一个小坑:

在使用Safari浏览器进行导出的时候,导出的文件会自动增加一个.xlw后缀,很烦。。

后来通过搜索解决了问题,在这里记录一波。

将原来的代码:

response.setContentType("application/vnd.ms-excel");

改成:

response.setContentType(
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

然后所有浏览器都没有问题了。

工具类

贴一下easyexcel导出的工具类:

public class ExcelUtil {

    private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);

    /**
     * 导出
     *
     * @param list 导出数据
     * @param excelName excel名称
     * @param response response
     * @param clazz clazz
     */
    public static void export(List<? extends BaseRowModel> list, 
            String excelName, HttpServletResponse response,
            Class<? extends BaseRowModel> clazz) {

        ServletOutputStream out = null;
        ExcelWriter writer = null;
        try {
            out = response.getOutputStream();
            writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
            String fileName = excelName + 
                new SimpleDateFormat("yyyy-MM-dd").format(new Date());

            Sheet sheet2 = new Sheet(2, 3, clazz, "sheet", null);
            writer.write(list, sheet2);
            response.setCharacterEncoding("utf-8");
//            response.setContentType("application/vnd.ms-excel");
            response.setContentType(
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

            setFileDownloadHeader(response, fileName);

            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != writer) {
                writer.finish();
            }
            if (null != out) {
                try {
                    out.flush();
                } catch (IOException e) {
                    logger.error("excel导出出错", e);
                }
            }
        }
    }

    private static void setFileDownloadHeader(
        HttpServletResponse response, String filename) {
        String headerValue = "attachment;";
        headerValue += " filename=\"" 
            + encodeURIComponent(filename) + "\";";
        headerValue += " filename*=utf-8''" 
            + encodeURIComponent(filename + ".xlsx");
        response.setHeader("Content-Disposition", headerValue);
    }

    private static String encodeURIComponent(String value) {
        try {
            return URLEncoder.encode(value, "UTF-8")
                .replaceAll("\\+", "%20");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
}
Java easyexcel

相关推荐



版权声明




留言区

文章目录