说明
使用JXLS根据模板填充数据时,若模板上绑定的标签中含中文将会报错
详细字段绑定
一个详细字段,若在模板绑定成:${test.姓名}
,将会报错如下:
2021-01-28T11:13:58.284+08:00 [main] [org.jxls.transform.poi.PoiTransformer] [ERROR] - Failed to write a cell with CellData{Sheet2!C3, cellType=STRING, cellValue=${test.姓名}} and context keys [img, test2, test.name, student, nowdate, test.姓名, employees1, employees2, employees, test1]
org.jxls.expression.EvaluationException: An error occurred when evaluating expression test.姓名
at org.jxls.expression.JexlExpressionEvaluator.evaluate(JexlExpressionEvaluator.java:70) ~[jxls-2.9.0.jar:?]
at org.jxls.common.CellData.evaluate(CellData.java:292) ~[jxls-2.9.0.jar:?]
at org.jxls.common.CellData.evaluate(CellData.java:262) ~[jxls-2.9.0.jar:?]
at org.jxls.transform.poi.PoiCellData.writeToCell(PoiCellData.java:129) ~[jxls-poi-1.0.15.jar:?]
at org.jxls.transform.poi.PoiTransformer.transform(PoiTransformer.java:152) ~[jxls-poi-1.0.15.jar:?]
at org.jxls.area.XlsArea.transformStaticCell(XlsArea.java:427) ~[jxls-2.9.0.jar:?]
at org.jxls.area.XlsArea.transformTopStaticArea(XlsArea.java:400) ~[jxls-2.9.0.jar:?]
at org.jxls.area.XlsArea.applyAt(XlsArea.java:165) ~[jxls-2.9.0.jar:?]
at org.jxls.util.JxlsHelper.processTemplate(JxlsHelper.java:222) ~[jxls-2.9.0.jar:?]
at com.sunwayworld.jxls.JxlsUtils.exportExcel(JxlsUtils.java:37) ~[classes/:?]
at com.sunwayworld.jxls.ObjectCollectionDemo.main(ObjectCollectionDemo.java:72) ~[classes/:?]
Caused by: org.apache.commons.jexl3.JexlException$Tokenization: org.jxls.expression.JexlExpressionEvaluator.evaluate@1:6 tokenization error in ''
at org.apache.commons.jexl3.JexlEngine.createExpression(JexlEngine.java:304) ~[commons-jexl3-3.1.jar:3.1]
at org.jxls.expression.JexlExpressionEvaluator.evaluate(JexlExpressionEvaluator.java:65) ~[jxls-2.9.0.jar:?]
... 10 more
解决办法,改为:${test."姓名"}
表格绑定
若是表格的模板绑定如下:
解决办法
也就是涉及标签中包含中文的,就将标签中文部分用双引号包裹即可
为什么出现中文
在出现问题后,网上查找到的几乎算是没找到解决办法,可能大家都不涉及到标签含中文的情况吧,都是将模板所需数据来源定义为对象或List
为什么会有中文标签的用法,比如表格的数据源支持List<Bean类型>的集合,也支持List<Map<String, Object>>这样的集合类型,自定义SQL,将SQL查询结果集作为JXLS模板表格的数据来源,若SQL中列为中文别名则会出现需要绑定标签含中文的情况
JXLS标签中含中文报错的原因
这个原因经过排查,暂时没找到,但是经过自己尝试后发现标签中用英文双引号包裹中文部分可以支持,大致的原因应该如下:
// java语法不支持这样的定义
String name = 姓名;
// 支持这样的定义