一 背景
开发中,经常会有一些导出excel的需求,而有些需求中导出的字段还比较多,如果需要我们人工一个个对齐到excel里,非常费时费力,并且还要关注每一列的格式排版等,开发好调试也需要花费不少时间和精力。那么,我们有什么高效的方法导出excel,还能不需要花费过多精力去关注排版等。
答案是肯定的,那就是jxls,这是jxls的官网:http://jxls.sourceforge.net/index.html
二 如何使用
引入依赖1
2
3# 版本可替换为最新版本
'org.jxls:jxls:2.8.1',
'org.jxls:jxls-poi:2.8.1',
在resources下先维护好模板xlsx文件
如: template/xxx_template.xlsx,其他具体用法可以参考jxls官网
其中 A1格子中设置批注如下(指定最后的列,限定列的范围):1
jx:area(lastCell="E2")
另外A2格子中设置批注如下(指定循环的字段,并限定最大列号)1
jx:each(items="items" var="item" lastCell="E2")
导出excel的controller方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18"export") (
public ResponseEntity<Resource> export(XxxParamVO xxxParamVO) throws IOException {
Resource resource = new ClassPathResource("template/xxx_template.xlsx");
Map<String, Object> map = new HashMap<>();
List<XxxVO> xxxVOList = "<<根据实际情况获取到业务数据>>";
map.put("items", xxxVOList);
ByteArrayOutputStream output = new ByteArrayOutputStream();
JxlsHelper.getInstance().processTemplate(resource.getInputStream(), output, new Context(map));
byte[] bytes = output.toByteArray();
ByteArrayResource byteArrayResource = new ByteArrayResource(bytes);
return ResponseEntity.ok()
.contentLength(bytes.length)
.header(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s_%s.xls", "xxx-filename", DateFormatUtils.format(new Date(), "yyyyMMddHHmm")))
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(byteArrayResource);
}
针对上传模板、导出模板都是同一个模板的情况
针对上传模板,我们一般都需要带一些模板数据,这时候可以通过
jx:if
控制这部分数据的显示,如下图:
1
jx:if(condition="items == null", lastCell="F5")