第三章——jXLS Excel标记
为什么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标记相关推荐
- 第三章 可扩展标记语言XML
XML(可扩展标记语言)的作用: 用于传输和存储数据的,并且对数据有一定的描述性. 没有预定义标签,用户可以自定义标签. XML最好的描述是:XML 是独立于软件和硬件的信息传输工具.即不依赖于任何软 ...
- Java黑皮书课后题第8章:8.9(井字游戏)玩家使用各自标志标记3*3网格中的某个空格,当一个玩家在网格的水平、垂直或对角线方向标记了三个相同的标记时,游戏结束,该玩家获胜。创建一个玩井字游戏的程序
***8.9(井字游戏)玩家使用各自标志标记3*3网格中的某个空格,当一个玩家在网格的水平.垂直或对角线方向标记了三个相同的标记时,游戏结束,该玩家获胜.创建一个玩井字游戏的程序 题目 题目描述与运行 ...
- 第三章:Windows 7操作——知识点整理
第三章:Windows 7操作--知识点整理 第三章:Windows 7操作 知识梳理 高频考点 3.1 操作系统概述 3.1.1 操作系统的概念 3.1.2 操作系统的功能 ⭐️⭐️⭐️ 3.1.3 ...
- 王道考研 计算机网络笔记 第三章:数据链路层
本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...
- IA-32系统编程指南 - 第三章 保护模式的内存管理【1】
第三章 保护模式的内存管理[1] [作者:lion3875 原创文章 参考文献<Intel 64 and IA-32 system programming guide>] IA-32保护模 ...
- Windows Pe 第三章 PE头文件(上)
第三章 PE头文件 本章是全书重点,所以要好好理解,概念比较多,但是非常重要. PE头文件记录了PE文件中所有的数据的组织方式,它类似于一本书的目录,通过目录我们可以快速定位到某个具体的章节:通过P ...
- Python第三章-字符串
第三章 字符串 3.1 基本字符串操作 Python的字符串和元组差不多,是不可以进行改变的,如果想改变值,可以尝试list序列化之后在进行修改. { website = 'http://ww ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...
- 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>第一章~第三 ...
最新文章
- python语法基础知识-python_基础知识_安装和基础语法
- oracle外部表导入,oracle 外部表导入时间日期类型数据
- 我可以/应该在事务上下文中使用并行流吗?
- 博图v16组态wincc_西门子WinCC与S71200OPC通讯方法
- win 卸载mysql5.6_mysql5.6 win 安装 卸载总结
- 支撑百万并发的数据库架构如何设计?
- 基于JAVA+SpringMVC+Mybatis+MYSQL的学习资源交互系统
- DedeCMS5.5 调用当前内容页TAG标记的办法
- 【韦东山嵌入式Linux】Linux命令入门笔记
- 软件工程(需求分析)
- 如何查询网站被搜狗收录,搜狗收录查询工具
- W3C 标准 较详细
- 李沐动手学深度学习v2-目标检测中的锚框和代码实现
- keep T 不是 KG等级_keep的用法
- 软件测试自动生成测试数据,软件测试中测试数据的自动生成方法浅析
- 微信小程序getday方法_日期getDay()方法和JavaScript中的示例
- Oracle报ORA-00942: 表或视图不存在的解决方法
- Spark Job Submit分析
- 漏洞修复:Web Server Misconfiguration: SSL Certificate Hostname Discrepancy
- 依云工资查询系统升级方法
热门文章
- 学习响应式BootStrap来写融职教育网站,Bootsrtap第十四天,PK模块的开发
- 向一个对象数组里面添加新的属性 + 将一个对象数组数据拿出来变成另一个对象
- Caffe: gflag编译出现问题汇总
- LINUX/UNIX 一些目录名称术语解释
- ActiveMQ的安装搭建
- 《PHP和MySQL Web开发从新手到高手(第5版)》一一第1章 安装
- ProtoBuffer的.proto文件生成c++
- 按照指定字符(@split )分割字符串,并取第@index 个
- Conversion to Dalvik format failed with error 1
- 用vi在linux下查看16进制文件