访问jxls官网:http://jxls.sourceforge.net/

官网中也有例子:https://bitbucket.org/leonate/jxls-demo/src/master/。

按照官网中的顺序。第一个例子居然是自定义函数。而不是if each这样的命令。通过官网给出的例子。笔者这里进行了测试

package com.xkcoding.helloworld.util.jxls;import org.apache.commons.compress.utils.Lists;
import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlEngine;
import org.jxls.common.Context;
import org.jxls.expression.JexlExpressionEvaluator;
import org.jxls.transform.Transformer;
import org.jxls.transform.poi.PoiTransformer;
import org.jxls.util.JxlsHelper;import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/****  jxls excel模版导出工具类**/
public class JxlsUtils {static {//添加自定义指令(可覆盖jxls原指令)
//        XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class);
//        XlsCommentAreaBuilder.addCommandMapping("comment", CommentCommand.class);}public static void exportExcel(InputStream is, OutputStream os, Map<String, Object> model) throws IOException {Context context = PoiTransformer.createInitialContext();if (model != null) {for (String key : model.keySet()) {context.putVar(key, model.get(key));}}JxlsHelper jxlsHelper = JxlsHelper.getInstance();Transformer transformer = jxlsHelper.createTransformer(is, os);// 获得配置JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator();// 设置静默模式,不报警告// evaluator.getJexlEngine().setSilent(true);// 函数强制,自定义功能Map<String, Object> functionMap = new HashMap<String, Object>();functionMap.put("utils", new JxlsUtils()); // 添加自定义功能
//        evaluator.getJexlEngine().setFunctions(funcs);//jexlEngine使用的setFunctions是jexl2中的方法JexlBuilder jb = new JexlBuilder();jb.namespaces(functionMap);JexlEngine je = jb.create();evaluator.setJexlEngine(je);// 必须要这个,否者表格函数统计会错乱jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);}public static void exportExcel(File xls, File out, Map<String, Object> model)throws FileNotFoundException, IOException {exportExcel(new FileInputStream(xls), new FileOutputStream(out), model);}public static void exportExcel(String templatePath, OutputStream os, Map<String, Object> model) throws Exception {File template = getTemplate(templatePath);if (template != null) {exportExcel(new FileInputStream(template), os, model);} else {throw new Exception("Excel 模板未找到。");}}// 获取jxls模版文件public static File getTemplate(String path) {File template = new File(path);if (template.exists()) {return template;}return null;}// 日期格式化public String dateFmt(Date date, String fmt) {if (date == null) {return "";}try {SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);return dateFmt.format(date);} catch (Exception e) {e.printStackTrace();}return "";}// if判断public Object ifelse(boolean b, Object o1, Object o2) {return b ? o1 : o2;}public static ByteArrayOutputStream fileToBos(File file) throws IOException {BufferedInputStream br = new BufferedInputStream(new FileInputStream(file));ByteArrayOutputStream bos = new ByteArrayOutputStream();int ch = 0;while ((ch = br.read()) != -1) {bos.write(ch);}return bos;}public static File getResource(String path) {if (path.contains("classpath")) {return new File(path.replace("classpath:", getClassPath()));}return new File(path);}public static String getClassPath() {return Thread.currentThread().getContextClassLoader().getResource("").getPath();}public static void main(String[] args) throws Exception {
//        String template = "classpath:template.xlsx";String output = "E:/事业部品牌推广费用(1).xlsx";Map<String, Object> map1 = new HashMap<String, Object>();map1.put("cc", "**事业部品牌部");map1.put("dd", "推广费用");map1.put("ee", "加盟推介会");map1.put("ff", 260000);map1.put("gg", 206701);map1.put("hh", 53000);map1.put("ii", 259701);Map<String, Object> map2 = new HashMap<String, Object>();map2.put("cc", "**事业部品牌部");map2.put("dd", "推广费用");map2.put("ee", "旗舰店开业推广");map2.put("ff", 200000);map2.put("gg", "");map2.put("hh", 150000);map2.put("ii", 150000);Map<String, Object> map3 = new HashMap<String, Object>();map3.put("cc", "**事业部品牌部");map3.put("dd", "推广费用");map3.put("ee", "**百店省推广");map3.put("ff", 200000);map3.put("gg", 70000);map3.put("hh", "");map3.put("ii", 70000);Map<String, Object> map4 = new HashMap<String, Object>();map4.put("cc", "**事业部品牌部");map4.put("dd", "专业服务费");map4.put("ee", "**品牌策略");map4.put("ff", 400000);map4.put("gg", 400000);map4.put("hh", "");map4.put("ii", 400000);List<Map<String, Object>> data = Lists.newArrayList();data.add(map1);data.add(map2);data.add(map3);data.add(map4);Map<String, Object> model = new HashMap<String, Object>();model.put("dataLs",data);model.put("title1","成本中心");
//        InputStream is = JxlsUtils.class.getResourceAsStream(template);InputStream is = new FileInputStream(JxlsUtils.getTemplate("C:/Users/85450/Desktop/aa.xlsx"));OutputStream os = new FileOutputStream(output);JxlsUtils.exportExcel(is, os, model);os.close();}
}

这里之前的evaluator.getJexlEngine().setFunctions(functionMap);是有问题的,从下载下来的例子中也可以看到此句话是被注释的。因为这里的jexlEngine使用的setFunctions是jexl2中的方法,而2.6.0后开始使用的是jexl3。我用的version是2.10.0

jexl3:        JexlBuilder jb = new JexlBuilder();
        jb.namespaces(functionMap);
        JexlEngine je = jb.create();
        evaluator.setJexlEngine(je);

需要将1位置的代码换为2中代码段

maven依赖:

    <dependency><groupId>org.jxls</groupId><artifactId>jxls-poi</artifactId><version>2.10.0</version></dependency>

关于jxls2.6.0后的版本使用的jexl3学习使用相关推荐

  1. python3语法都相同吗_Python 3.3.0的语法和3.0以前的版本有什么不一样的吗?

    我刚刚下了一个Python3.3.0的Windowsx86MSI安装程序安装到WindowsXP的系统上安装完后想试下结果输入最简单的Helloworld都不行!Python3.3.0(v3.3.0: ...

  2. android 8.0手机无法更新版本,安卓手机升级安卓8.0后 系统以后可能都无法回退

    ­ 你升级安卓8.0了吗?从谷歌发布正式算起,已经4个月过去了,然而根据官方的统计,现在的渗透率甚至1%都还不到. ­ 为了推广升级,谷歌宣布安卓8.0之初就希望能推广Project Treble特性 ...

  3. 华为鸿蒙osbeta在哪看发布会,重磅消息!华为在发布鸿蒙OS2.0手机beta版本后,又发布搭载鸿蒙的新品!!...

    原标题:重磅消息!华为在发布鸿蒙OS2.0手机beta版本后,又发布搭载鸿蒙的新品!! 就在12月16号华为刚刚发布鸿蒙OS2.0beta系统手机版本后,就在今天华为又举行了一个新品发布会,他就 是华 ...

  4. android动态mac地址,Android 版本兼容 — Android 6.0 和 7.0后获取Mac地址

    Android 6.0 和 7.0后获取Mac地址 随着Android的版本迭代,获取设备的Mac地址也发生了改变.这里找到了最新的适配方案(适配当前的最新版本Android 9.0),并且记录了整个 ...

  5. gym包更新升级到0.26.2版本后炼丹炉的测试代码

    关于gym包升级到0.26.2版本后炼丹炉测试代码的修改 前两天电脑有问题,重装了系统.就有了关于安装了更新后的软件包跑环境测试代码遇到的问题. 本文包版本分别为--gym version:0.26. ...

  6. android apt最新版本,解决Android studio 2.3升级到Android studio 3.0 后apt报错问题

    解决Android studio 2.3升级到Android studio 3.0 后apt报错问题 发布时间:2020-09-16 19:59:42 来源:脚本之家 阅读:62 作者:哈特中尉 1. ...

  7. php 7.0 curl图片上传,PHP 升级到7.4.0后,通过curl上传文件http_code报412

    我将PHP环境升级到7.4.0后,使用curl向微信公众平台上传图片不能成功,代码如下所示,切换到php7.3.x版本运行正常.php7.4.0版本下,在http_post方法的倒数第二行打印相关信息 ...

  8. 如何修改MySQL8.0.5以上版本root密码

    2019独角兽企业重金招聘Python工程师标准>>> 如何修改MySQL8.0.5以上版本root密码 听语音 | 浏览:101 | 更新:2018-11-09 15:23 1 2 ...

  9. apache 版本_Apache Hudi 0.5.1版本重磅发布

    历经大约3个月时间,Apache Hudi 社区终于发布了0.5.1版本,这是Apache Hudi发布的第二个Apache版本,该版本中一些关键点如下 版本升级 将Spark版本从2.1.0升级到2 ...

最新文章

  1. python123百钱买百鸡_day01笔记-百钱买百鸡(100文钱,必须买100只鸡,有几种方式)
  2. 百度AI实力响应“新基建”号召 Q1财报智能交通成绩亮眼
  3. 子类重载父类函数_Python面向对象之继承、重写与重载
  4. ActiveMQ 消息游标(Message Cursors)
  5. 高斯数据库-GaussDB
  6. 在WPF中嵌入WebBrowser可视化页面
  7. 使用DISM++精简windows系统
  8. 基于Python的Fisher二分类判别模型实现
  9. python代码表达失恋_利用python程序浪漫安慰失恋妹纸
  10. [RFID]射频识别技术基础
  11. Hi3861 ADC驱动 如何使用开发板上的3个按键
  12. 手机怎么修改视频的封面?这三个方法和步骤让你实现
  13. peewee-async使用描述
  14. emem今天再记一道套路whalectf pwn3
  15. np.meshgrid()函数 以及 三维空间中的坐标位置生成 以及 numpy.repeat()函数介绍
  16. DeepPath: A Reinforcement Learning Method for Knowledge Graph Reasoning
  17. 2022全国中职网络安全比赛正式赛题
  18. 解决There is no PasswordEncoder mapped for the id “null“问题
  19. [MRCTF2020]千层套路1
  20. WPF与3D 模型(二)实现鼠标的视角控制

热门文章

  1. MFC串口调试工具教程
  2. Symbian HTTP
  3. JavaScript单步调试
  4. 转 胡适《独立评论》,给自己的激励
  5. 互联网运营到底是做什么的?要做的事情,其实就是这四个模块
  6. 转回原来服务器物品带锁吗,梦幻西游转服后转角色,转服后寄售角色条件
  7. 【机器学习概率统计】02 事件的关系:深入理解独立性
  8. vis.js的研究之路
  9. 多功能超级计算机,联合Fermi与Bulldozer,Cray推出新世代超级计算机XK6
  10. ElasticSearch之处理深度分页