天天看點

JXLS 标簽含中文,解決使用中文标簽報錯問題

說明

使用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."姓名"}

表格綁定

若是表格的模闆綁定如下:

JXLS 标簽含中文,解決使用中文标簽報錯問題

解決辦法

也就是涉及标簽中包含中文的,就将标簽中文部分用雙引号包裹即可

為什麼出現中文

在出現問題後,網上查找到的幾乎算是沒找到解決辦法,可能大家都不涉及到标簽含中文的情況吧,都是将模闆所需資料來源定義為對象或List

為什麼會有中文标簽的用法,比如表格的資料源支援List<Bean類型>的集合,也支援List<Map<String, Object>>這樣的集合類型,自定義SQL,将SQL查詢結果集作為JXLS模闆表格的資料來源,若SQL中列為中文别名則會出現需要綁定标簽含中文的情況

JXLS标簽中含中文報錯的原因

這個原因經過排查,暫時沒找到,但是經過自己嘗試後發現标簽中用英文雙引号包裹中文部分可以支援,大緻的原因應該如下:

// java文法不支援這樣的定義
String name = 姓名;

// 支援這樣的定義