填充Jasper Report时出现Null值问题求助
Jasper报表参数显示Null问题排查与解决
问题背景
我使用JasperFillManager.fillReport填充Jasper报表,jrxml中的字段变量格式为$F{myVarName}。jrxml里有3个<textField>节点,其中一个的<textFieldExpression>如下:
<textFieldExpression class="java.lang.String"><![CDATA[$F{param1}]]></textFieldExpression>
我搭建了生成Base64格式PDF的服务,核心代码片段:
PdfTemplate template = templateRepo.findByTemplateId(templateId); JasperReport jasperReport = JasperCompileManager.compileReport(new ByteArrayInputStream(template.getTemplateXml().getBytes())); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters); // 也尝试过下面的方法: // JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
参数定义:
Map<String, Object> parameters = new HashMap<>(); parameters.put("param1", "Value of param1"); parameters.put("param2", "Value of param2"); parameters.put("param3", "Value of param3"); // param1-3 对应 jrxml 中的 $F{param1-3}
但生成的报表中所有参数都显示Null:
Parameter 1: null
Parameter 2: null
Parameter 3: null
问题原因与解决方法
核心误区:字段($F)与参数($P)的区别
JasperReports中,$F{xxx}代表数据源字段,是从数据集(比如数据库查询结果、JavaBean集合)中获取的字段值;而$P{xxx}才是报表参数,对应你传入的parametersMap中的键值对。
你的代码里把参数放到了parametersMap中,但jrxml里用了$F{param1},两者不匹配,导致报表无法找到对应值,显示Null。
解决方式二选一:
修改jrxml,使用参数语法:
将所有<textFieldExpression>中的$F{param1}改为$P{param1},同时确保jrxml中已定义对应的<parameter>节点,示例:<parameter name="param1" class="java.lang.String"/> <textFieldExpression class="java.lang.String"><![CDATA[$P{param1}]]></textFieldExpression>修改代码,使用数据源传递字段值:
如果坚持使用$F{xxx},需要构造包含这些字段的数据源,比如使用JRMapDataSource:// 用Map作为数据源,每个键对应$F{xxx}的字段名 Map<String, Object> dataMap = new HashMap<>(); dataMap.put("param1", "Value of param1"); dataMap.put("param2", "Value of param2"); dataMap.put("param3", "Value of param3"); JRDataSource dataSource = new JRMapDataSource(dataMap); // 填充报表时传入数据源 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);同时确保jrxml中已定义对应的
<field>节点:<field name="param1" class="java.lang.String"/>
额外注意点
- 无论哪种方式,jrxml中的
name属性必须和代码中传入的键名完全一致(大小写敏感)。 - 使用
JREmptyDataSource时,报表只能使用参数($P),因为空数据源没有任何字段数据。
内容的提问来源于stack exchange,提问作者Ben Fourie
相关产品推荐
相关产品推荐

