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后缀,很烦。。

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

将原来的代码:

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

改成:

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

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

工具类

贴一下easyexcel导出的工具类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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;
}
}
}