EasyExcel在Safari浏览器导出文件格式问题
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);
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.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; } } }
|