jXLS的Excel標記分爲3種:java
jXLS提供XlsCommentAreaBuilder類從Excel單元格註釋讀取標記。XlsCommentAreaBuilder實現通用AreaBuilder接口。AreaBuilder接口以下所示:express
public interface AreaBuilder { List<Area> build(); }
這是一個單方法簡單接口,返回一個Area對象列表。所以,若是你想要定義本身的標記,能夠建立本身的AreaBuilder實現,解釋輸入Excel模板或任意其它輸入。app
jXLS使用Apache JEXL表達式語言處理Bean屬性標記。在將來版本中,能夠配置表達式語言引擎,以便在須要時能夠用任何其餘表達式引擎替換JEXL。默認,jXLS指望JEXL表達式放在模板文件中的${和}之間。例如,如下單元格內容${department.chief.age} years告訴jXLS,假設,在Context中有一個department對象有一個chief對象有一個age屬性,使用JEXL計算department.chief.age。若是表達式department.getChief().getAge()計算等於35,jXLS將放置35 years在單元格中。函數
jXLS區域標記用於定義jXLS引擎處理的根XlsArea。XlsCommentAreaBuilder支持的Excel單元格註釋區域定義語法以下所示:ui
jx:area(lastCell="<LAST_CELL>")
<LAST_CELL>定義矩形區域右下角單元格。第一個單元格是定義Excel註釋的單元格。所以,假設咱們有一個註釋jx:area(lastCell="G12")在單元格A1中,根區域將讀取A1:G12。lua
XlsCommentAreaBuilder應該用於從模板文件讀取全部區域。例如,如下代碼讀取全部區域到xlsAreaList,而後保存第一個區域到xlsArea變量:spa
AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer); List<Area> xlsAreaList = areaBuilder.build(); Area xlsArea = xlsAreaList.get(0);
大多數狀況下,定義一個根區域就足夠了。code
命令應該定義在XlsArea中。XlsCommentAreaBuilder接收如下命令符建立Excel單元格註釋:orm
jx:<command_name>(attr1='val1' attr2='val2' ... attrN='valN' lastCell=<last_cell> areas=["<command_area1>", "<command_area2", ... "<command_areaN>"])
<command_name>是在XlsCommentAreaBuilder中預註冊或手動註冊的命令名稱。當前,預註冊瞭如下命令:xml
使用XlsCommentAreaBuilder的static void addCommandMapping(String commandName, Class clazz)方法註冊自定義命令。
attr1, attr2,…, attrN是命令屬性。
例如,if命令有condition屬性設置條件表達式。
<last_cell>定義命令區域的右下角單元格。右上角由註釋所在單元格決定。
<command_area1>, <command_area2>, … <command_areaN>——區域做爲參數傳遞給命令。
例如,if命令指望如下區域被定義:
if命令的區域屬性定義以下所示:
areas=["A8:F8","A13:F13"]
一個單元格註釋能夠定義多個命令。例如,Each和If命令:
jx:each(items="department.staff", var="employee", lastCell="F8") jx:if(condition="employee.payment <= 2000", lastCell="F8", areas=["A8:F8","A13:F13"])
默認,jXLS使用Apache JEXL表達式語言計算Excel模板文件中的屬性表達式。
若是你須要自定義JEXL處理,能夠從Transformer獲取JexlEngine引用並設置必須的配置。
例如,如下代碼在demo命名空間註冊一個自定義JEXL函數:
Transformer transformer = TransformerFactory.createTransformer(is, os); // ... JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer .getTransformationConfig() .getExpressionEvaluator(); Map<String, Object> functionMap = new HashMap<>(); functionMap.put("demo", new JexlCustomFunctionDemo()); evaluator.getJexlEngine() .setFunctions(functionMap);
下面是JexlCustomerFunctionDemo類:
public Integer mySum(Integer x, Integer y){ return x + y; }
所以,模板中能夠這樣使用函數:
${demo:mySum(x,y)}
x和y是Context中的參數。
你可能不喜歡使用Apache JEXL,而想要使用其它表達式處理引擎,例如,SpEL。jXLS容許你使用喜歡的計算引擎替代默認的計算引擎。
你只須要實現ExpressionEvaluator接口的一個方法委託表達式計算處理給你想要的引擎:
public interface ExpressionEvaluator { Object evaluate(String expression, Map<String,Object> context); }
而後,傳入你的ExpressionEvaluator實現給TransformationConfig:
ExpressionEvaluator evaluator = new MyCustomEvaluator(); // 基於SpEL的自定義實現 transformer.getTransformationConfig().setExpressionEvaluator(evaluator);