为什么80%的码农都做不了架构师?>>>   

jXLS的Excel标记分为3种:

  • Bean属性标记
  • 区域标记
  • 命令标记

jXLS提供XlsCommentAreaBuilder类从Excel单元格注释读取标记。XlsCommentAreaBuilder实现通用AreaBuilder接口。AreaBuilder接口如下所示:

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

这是一个单方法简单接口,返回一个Area对象列表。因此,如果你想要定义自己的标记,可以创建自己的AreaBuilder实现,解释输入Excel模板或任意其它输入。

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单元格注释区域定义语法如下所示:

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

<LAST_CELL>定义矩形区域右下角单元格。第一个单元格是定义Excel注释的单元格。因此,假设我们有一个注释jx:area(lastCell="G12")在单元格A1中,根区域将读取A1:G12。

XlsCommentAreaBuilder应该用于从模板文件读取所有区域。例如,以下代码读取所有区域到xlsAreaList,然后保存第一个区域到xlsArea变量:

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

大多数情况下,定义一个根区域就足够了。

3    命令标记

命令应该定义在XlsArea中。XlsCommentAreaBuilder接收以下命令符创建Excel单元格注释:

jx:<command_name>(attr1='val1' attr2='val2' ... attrN='valN' lastCell=<last_cell> areas=["<command_area1>", "<command_area2", ... "<command_areaN>"])

<command_name>是在XlsCommentAreaBuilder中预注册或手动注册的命令名称。当前,预注册了以下命令:

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

转载于:https://my.oschina.net/leeck/blog/1845844

第三章——jXLS Excel标记相关推荐

  1. 第三章 可扩展标记语言XML

    XML(可扩展标记语言)的作用: 用于传输和存储数据的,并且对数据有一定的描述性. 没有预定义标签,用户可以自定义标签. XML最好的描述是:XML 是独立于软件和硬件的信息传输工具.即不依赖于任何软 ...

  2. Java黑皮书课后题第8章:8.9(井字游戏)玩家使用各自标志标记3*3网格中的某个空格,当一个玩家在网格的水平、垂直或对角线方向标记了三个相同的标记时,游戏结束,该玩家获胜。创建一个玩井字游戏的程序

    ***8.9(井字游戏)玩家使用各自标志标记3*3网格中的某个空格,当一个玩家在网格的水平.垂直或对角线方向标记了三个相同的标记时,游戏结束,该玩家获胜.创建一个玩井字游戏的程序 题目 题目描述与运行 ...

  3. 第三章:Windows 7操作——知识点整理

    第三章:Windows 7操作--知识点整理 第三章:Windows 7操作 知识梳理 高频考点 3.1 操作系统概述 3.1.1 操作系统的概念 3.1.2 操作系统的功能 ⭐️⭐️⭐️ 3.1.3 ...

  4. 王道考研 计算机网络笔记 第三章:数据链路层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

  5. IA-32系统编程指南 - 第三章 保护模式的内存管理【1】

    第三章 保护模式的内存管理[1] [作者:lion3875 原创文章 参考文献<Intel 64 and IA-32 system programming guide>] IA-32保护模 ...

  6. Windows Pe 第三章 PE头文件(上)

    第三章  PE头文件 本章是全书重点,所以要好好理解,概念比较多,但是非常重要. PE头文件记录了PE文件中所有的数据的组织方式,它类似于一本书的目录,通过目录我们可以快速定位到某个具体的章节:通过P ...

  7. Python第三章-字符串

    第三章  字符串 3.1 基本字符串操作 Python的字符串和元组差不多,是不可以进行改变的,如果想改变值,可以尝试list序列化之后在进行修改. {    website = 'http://ww ...

  8. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...

  9. CV:翻译并解读2019《A Survey of the Recent Architectures of Deep Convolutional Neural Networks》第一章~第三章

    CV:翻译并解读2019<A Survey of the Recent Architectures of Deep Convolutional Neural Networks>第一章~第三 ...

最新文章

  1. python语法基础知识-python_基础知识_安装和基础语法
  2. oracle外部表导入,oracle 外部表导入时间日期类型数据
  3. 我可以/应该在事务上下文中使用并行流吗?
  4. 博图v16组态wincc_西门子WinCC与S71200OPC通讯方法
  5. win 卸载mysql5.6_mysql5.6 win 安装 卸载总结
  6. 支撑百万并发的数据库架构如何设计?
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的学习资源交互系统
  8. DedeCMS5.5 调用当前内容页TAG标记的办法
  9. 【韦东山嵌入式Linux】Linux命令入门笔记
  10. 软件工程(需求分析)
  11. 如何查询网站被搜狗收录,搜狗收录查询工具
  12. W3C 标准 较详细
  13. 李沐动手学深度学习v2-目标检测中的锚框和代码实现
  14. keep T 不是 KG等级_keep的用法
  15. 软件测试自动生成测试数据,软件测试中测试数据的自动生成方法浅析
  16. 微信小程序getday方法_日期getDay()方法和JavaScript中的示例
  17. Oracle报ORA-00942: 表或视图不存在的解决方法
  18. Spark Job Submit分析
  19. 漏洞修复:Web Server Misconfiguration: SSL Certificate Hostname Discrepancy
  20. 依云工资查询系统升级方法

热门文章

  1. 学习响应式BootStrap来写融职教育网站,Bootsrtap第十四天,PK模块的开发
  2. 向一个对象数组里面添加新的属性 + 将一个对象数组数据拿出来变成另一个对象
  3. Caffe: gflag编译出现问题汇总
  4. LINUX/UNIX 一些目录名称术语解释
  5. ActiveMQ的安装搭建
  6. 《PHP和MySQL Web开发从新手到高手(第5版)》一一第1章 安装
  7. ProtoBuffer的.proto文件生成c++
  8. 按照指定字符(@split )分割字符串,并取第@index 个
  9. Conversion to Dalvik format failed with error 1
  10. 用vi在linux下查看16进制文件