一、模板
jxls通过模板中的批注语法来渲染数据,所以写好模板已经成功了一大半,
我的模板如下:这里我定义了两个sheet页,第一个sheet页就是汇总的,直接取数据遍历;第二个sheet页就是动态sheet页的模板。
注意模板作用域的定义一定要写在第一个单元格jx:area(lastCell="E7");
动态sheet语法multisheet属性jx:each(items="userScoreList" var="userScore" multisheet="userScore.sheetName" lastCell="E7");
这里sheet的名称我取的是遍历的对象中的某个属性。动态sheet的sheetName也可以额外给一个集合,例如jx:each(items="userScoreList" var="userScore" multisheet="sheetNames" lastCell="E7");
给一个sheetNames,那么代码中就要给过来这个sheetNames为key的集合了。
二、代码部分
我这里给的数据就是两个集合,第一个作为第一个sheet页遍历的数据源,第二个就是动态sheet页的数据源。
如果模板中使用了sheetNames最为动态sheet的名称来源,那么这里就要加一个sheetNames为key的属性了。
关键导出代码
三、单元格中换行
1.代码中给换行符
2.模板中对应的单元格设置自动换行格式
四、注意点
动态sheet页导出时,总会多出一个空白sheet页,设置setDeleteTemplateSheet(true)即可删除多出的空白页。JxlsHelper.getInstance().setDeleteTemplateSheet(true).processTemplate
一开始我使用的是2.6.0的版本,设置了这个属性是没有效果的,后面官网看了一下最新的源码,更换了2.10.0-rc3版本就可以了。最新的版本已经更新了如下的代码,2.6.0的版本中是没有这些的,导出的动态sheet的名称不能超过31个字符,而且不能带有特殊字符。否则会报错java.lang.IllegalArgumentException: The workbook already contains a sheet of this name
看报错的意思是sheet的名称重复了,可是我查了我的代码,我的sheetNames不可能重复,其实真正的原因是我的sheetName超长了,截取一下就可以了。四、导出效果
使用的jar包版本:
<dependency><groupId>org.jxls</groupId><artifactId>jxls</artifactId><version>2.10.0-rc3</version></dependency><dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>1.2.0</version></dependency>
end
参考博客:jxls2.4.x 解决导出多sheet时多出模板sheet问题