【JXLS 自定义函数】(jxls-2.12.0-sources.jar commons-jexl3-3.2-sources.jar setFunctions找不到解决办法)


项目中经常会生成报表,使用模板工具JXLS来进行生成。同时有些金额需要千分位做逗号处理的情况,此时就要对数据进行处理,需要使用自定义函数。

官方网址
​​

查询到官方网站有相应的代码

https://i-blog.csdnimg.cn/blog_migrate/a4f65b92a8dcda28c05dffac36616917.png

但是并不能正常编译

https://i-blog.csdnimg.cn/blog_migrate/817287d81d4550cf43019c1d05e53147.png

Engine 里头确实找不到对应的setFunctions方法

https://i-blog.csdnimg.cn/blog_migrate/78205779ea4787caa28a937724d465f6.png

但是却找到了本体属性

https://i-blog.csdnimg.cn/blog_migrate/812bd2459be68ac4ce3761c894a6f0dd.png
https://i-blog.csdnimg.cn/blog_migrate/1addcf4347fcd87f80ee7af64355ba51.png

透过使用链发现一处可以设置值的位置

因此,我们只需要调用Engine的构造器传入一个JexlBuilder

https://i-blog.csdnimg.cn/blog_migrate/dcd213827870db7be1cc917096de6c36.png

同时JexlBuilder 中的namespaces方法传入一个map,那这就类同于setFunctions。

于是,

代码已经呼之欲出了:

Transformer trans = TransformerFactory.createTransformer(templateIs, reportOs);
   			JexlExpressionEvaluator evaluator =(JexlExpressionEvaluator)trans.getTransformationConfig().getExpressionEvaluator(); //设置静默模式,不报警告
   		     JexlBuilder jexlBuilder = new JexlBuilder();
   		     Map<String , Object> myFunction = new HashMap<String , Object>();
   		      myFunction.put("customUtil", new JexlUtils());
   		     jexlBuilder.namespaces(myFunction);
   		      JexlEngine engine= new Engine(jexlBuilder);
   			evaluator.setJexlEngine(engine);

贴上自定义方法截图

https://i-blog.csdnimg.cn/blog_migrate/9aaf50cf9b2c3764da422de7195c1b0e.png

贴上模板截图和导出文件截图

https://i-blog.csdnimg.cn/blog_migrate/b954a62c0e452e82d200791a1d527fe7.png
https://i-blog.csdnimg.cn/blog_migrate/3bf6fb5dd5b0e62796b947d80a54862f.png

大功告成,完美调用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值