第三章——jXLS Excel标记
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
jXLS的Excel標(biāo)記分為3種:
- Bean屬性標(biāo)記
- 區(qū)域標(biāo)記
- 命令標(biāo)記
jXLS提供XlsCommentAreaBuilder類從Excel單元格注釋讀取標(biāo)記。XlsCommentAreaBuilder實(shí)現(xiàn)通用AreaBuilder接口。AreaBuilder接口如下所示:
public interface AreaBuilder {List<Area> build(); }這是一個(gè)單方法簡(jiǎn)單接口,返回一個(gè)Area對(duì)象列表。因此,如果你想要定義自己的標(biāo)記,可以創(chuàng)建自己的AreaBuilder實(shí)現(xiàn),解釋輸入Excel模板或任意其它輸入。
1? ? Bean屬性標(biāo)記
jXLS使用Apache JEXL表達(dá)式語(yǔ)言處理Bean屬性標(biāo)記。在未來(lái)版本中,可以配置表達(dá)式語(yǔ)言引擎,以便在需要時(shí)可以用任何其他表達(dá)式引擎替換JEXL。默認(rèn),jXLS期望JEXL表達(dá)式放在模板文件中的${和}之間。例如,以下單元格內(nèi)容${department.chief.age} years告訴jXLS,假設(shè),在Context中有一個(gè)department對(duì)象有一個(gè)chief對(duì)象有一個(gè)age屬性,使用JEXL計(jì)算department.chief.age。如果表達(dá)式department.getChief().getAge()計(jì)算等于35,jXLS將放置35 years在單元格中。
2? ? 區(qū)域標(biāo)記
jXLS區(qū)域標(biāo)記用于定義jXLS引擎處理的根XlsArea。XlsCommentAreaBuilder支持的Excel單元格注釋區(qū)域定義語(yǔ)法如下所示:
jx:area(lastCell="<LAST_CELL>")<LAST_CELL>定義矩形區(qū)域右下角單元格。第一個(gè)單元格是定義Excel注釋的單元格。因此,假設(shè)我們有一個(gè)注釋jx:area(lastCell="G12")在單元格A1中,根區(qū)域?qū)⒆x取A1:G12。
XlsCommentAreaBuilder應(yīng)該用于從模板文件讀取所有區(qū)域。例如,以下代碼讀取所有區(qū)域到xlsAreaList,然后保存第一個(gè)區(qū)域到xlsArea變量:
AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer); List<Area> xlsAreaList = areaBuilder.build(); Area xlsArea = xlsAreaList.get(0);大多數(shù)情況下,定義一個(gè)根區(qū)域就足夠了。
3? ? 命令標(biāo)記
命令應(yīng)該定義在XlsArea中。XlsCommentAreaBuilder接收以下命令符創(chuàng)建Excel單元格注釋:
jx:<command_name>(attr1='val1' attr2='val2' ... attrN='valN' lastCell=<last_cell> areas=["<command_area1>", "<command_area2", ... "<command_areaN>"])<command_name>是在XlsCommentAreaBuilder中預(yù)注冊(cè)或手動(dòng)注冊(cè)的命令名稱。當(dāng)前,預(yù)注冊(cè)了以下命令:
- each
- if
- image
使用XlsCommentAreaBuilder的static void addCommandMapping(String commandName, Class clazz)方法注冊(cè)自定義命令。
attr1,?attr2,…,?attrN是命令屬性。
例如,if命令有condition屬性設(shè)置條件表達(dá)式。
<last_cell>定義命令區(qū)域的右下角單元格。右上角由注釋所在單元格決定。
<command_area1>,?<command_area2>, …?<command_areaN>——區(qū)域作為參數(shù)傳遞給命令。
例如,if命令期望以下區(qū)域被定義:
- ifArea:當(dāng)if條件計(jì)算為true時(shí),輸出區(qū)域的引用。
- elseArea(可選):當(dāng)if條件計(jì)算為false時(shí),輸出區(qū)域的引用。
if命令的區(qū)域?qū)傩远x如下所示:
areas=["A8:F8","A13:F13"]一個(gè)單元格注釋可以定義多個(gè)命令。例如,Each和If命令:
jx:each(items="department.staff", var="employee", lastCell="F8") jx:if(condition="employee.payment <= 2000", lastCell="F8", areas=["A8:F8","A13:F13"])4? ? 表達(dá)式語(yǔ)言
默認(rèn),jXLS使用Apache JEXL表達(dá)式語(yǔ)言計(jì)算Excel模板文件中的屬性表達(dá)式。
4.1????自定義JEXL處理
如果你需要自定義JEXL處理,可以從Transformer獲取JexlEngine引用并設(shè)置必須的配置。
例如,以下代碼在demo命名空間注冊(cè)一個(gè)自定義JEXL函數(shù):
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; }因此,模板中可以這樣使用函數(shù):
${demo:mySum(x,y)}x和y是Context中的參數(shù)。
4.2????改變表達(dá)式引擎
你可能不喜歡使用Apache JEXL,而想要使用其它表達(dá)式處理引擎,例如,SpEL。jXLS允許你使用喜歡的計(jì)算引擎替代默認(rèn)的計(jì)算引擎。
你只需要實(shí)現(xiàn)ExpressionEvaluator接口的一個(gè)方法委托表達(dá)式計(jì)算處理給你想要的引擎:
public interface ExpressionEvaluator {Object evaluate(String expression, Map<String,Object> context); }然后,傳入你的ExpressionEvaluator實(shí)現(xiàn)給TransformationConfig:
ExpressionEvaluator evaluator = new MyCustomEvaluator(); // 基于SpEL的自定義實(shí)現(xiàn) transformer.getTransformationConfig().setExpressionEvaluator(evaluator);?
轉(zhuǎn)載于:https://my.oschina.net/leeck/blog/1845844
總結(jié)
以上是生活随笔為你收集整理的第三章——jXLS Excel标记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在centos 7 下安装图形界面
- 下一篇: 『TensorFlow』SSD源码学习_