jxls-poi 2.12.0自定义JEXLS函数无法解析问题求助
Jxls-POI 2.12.0 自定义函数调用失败及参数类型不匹配问题解决
一、自定义函数无法调用的修复
方案1:直接将工具类实例放入上下文(推荐)
无需替换JexlEngine,直接把XlsExportUtils实例加入模板上下文,是最稳定的方式:
Transformer transformer = TransformerFactory.createTransformer(template, outputStream); // 将工具类实例放入上下文 context.put("functions", new XlsExportUtils()); JxlsHelper.getInstance().processTemplate(context, transformer);
模板中使用${functions.test()}调用方法即可。
方案2:正确注册Jexl命名空间
若要使用命名空间格式${functions:test()},需确保JexlEngine注册逻辑正确,且在处理模板前完成设置:
Transformer transformer = TransformerFactory.createTransformer(template, outputStream); JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator) transformer.getTransformationConfig().getExpressionEvaluator(); Map<String, Object> namespaces = new HashMap<>(); namespaces.put("functions", new XlsExportUtils()); // 创建带命名空间的JexlEngine,开启严格模式便于排查问题 JexlEngine jexlEngine = new JexlBuilder() .namespaces(namespaces) .strict(true) .create(); evaluator.setJexlEngine(jexlEngine); JxlsHelper.getInstance().processTemplate(context, transformer);
模板中调用格式必须为${functions:test()}(冒号分隔命名空间与方法名)。
二、参数类型不匹配问题修复
Jxls会根据单元格格式将数值解析为Short/Long/Float等类型,导致方法参数不匹配,可通过以下方式解决:
方案1:使用Number作为参数类型
修改工具类方法,用Number兼容所有数值类型:
public String test(Number num) { int intValue = num.intValue(); return "处理结果:" + intValue; }
方案2:重载多类型参数方法
针对不同数值类型重载方法,覆盖所有可能的解析类型:
public String test(Integer num) { return "Integer参数:" + num; } public String test(Short num) { return "Short参数:" + num; } public String test(Long num) { return "Long参数:" + num; } public String test(Float num) { return "Float参数:" + num; }
方案3:模板中强制类型转换
在模板调用时,用Jexl语法强制转换参数类型:
${functions.test((int)1)} ${functions.test((int)yourIntegerVar)}
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

