第三章——jXLS Excel標記

jXLS的Excel標記分爲3種:java

  • Bean屬性標記
  • 區域標記
  • 命令標記

jXLS提供XlsCommentAreaBuilder類從Excel單元格註釋讀取標記。XlsCommentAreaBuilder實現通用AreaBuilder接口。AreaBuilder接口以下所示:express

public interface AreaBuilder {
    List<Area> build();
}

這是一個單方法簡單接口,返回一個Area對象列表。所以,若是你想要定義本身的標記,能夠建立本身的AreaBuilder實現,解釋輸入Excel模板或任意其它輸入。app

1    Bean屬性標記

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在單元格中。函數

2    區域標記

jXLS區域標記用於定義jXLS引擎處理的根XlsArea。XlsCommentAreaBuilder支持的Excel單元格註釋區域定義語法以下所示:ui

jx:area(lastCell="<LAST_CELL>")

<LAST_CELL>定義矩形區域右下角單元格。第一個單元格是定義Excel註釋的單元格。所以,假設咱們有一個註釋jx:area(lastCell="G12")在單元格A1中,根區域將讀取A1:G12lua

XlsCommentAreaBuilder應該用於從模板文件讀取全部區域。例如,如下代碼讀取全部區域到xlsAreaList,而後保存第一個區域到xlsArea變量:spa

AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> xlsAreaList = areaBuilder.build();
Area xlsArea = xlsAreaList.get(0);

大多數狀況下,定義一個根區域就足夠了。code

3    命令標記

命令應該定義在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

  • each
  • if
  • image

使用XlsCommentAreaBuilder的static void addCommandMapping(String commandName, Class clazz)方法註冊自定義命令。

attr1, attr2,…, attrN是命令屬性。

例如,if命令有condition屬性設置條件表達式。

<last_cell>定義命令區域的右下角單元格。右上角由註釋所在單元格決定。

<command_area1>, <command_area2>, … <command_areaN>——區域做爲參數傳遞給命令。

例如,if命令指望如下區域被定義:

  • ifArea:當if條件計算爲true時,輸出區域的引用。
  • elseArea(可選):當if條件計算爲false時,輸出區域的引用。

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"])

4    表達式語言

默認,jXLS使用Apache JEXL表達式語言計算Excel模板文件中的屬性表達式。

4.1    自定義JEXL處理

若是你須要自定義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中的參數。

4.2    改變表達式引擎

你可能不喜歡使用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);
相關文章
相關標籤/搜索