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);