如何通过Java API与Pentaho在.prpt文件中绘制图表?
在Pentaho报表中添加柱状图的实现方案
一、修改PRPT模板(核心步骤)
用Pentaho Report Designer打开你项目中的test2.prpt,按以下步骤添加柱状图:
- 从左侧工具栏拖拽柱状图组件到报表布局的合适区域。
- 绑定数据源:
- 选中图表,右侧属性面板切换到
Data标签页,选择数据集为default(和你Java代码中factory.setQuery("default", query)对应)。 - 设置X轴:选择字段
ID(对应HQL返回的sh.activityAsset.id)作为分类维度。 - 设置Y轴:选择字段
countHistory(对应HQL的统计值)作为数值指标,因为HQL已经完成分组统计,直接选择字段即可,无需额外聚合。
- 选中图表,右侧属性面板切换到
- 调整样式:在
Appearance标签页设置图表标题、轴标签、颜色等,确保在PRD预览中能正常显示图表。 - 保存模板,替换项目中原有
test2.prpt文件。
二、验证Java代码数据传递
你的现有代码已经完成HQL数据集和报表的绑定,只需确认两点:
- HQL返回的字段名(
ID、countHistory)和PRPT模板中图表绑定的字段名完全一致(大小写敏感)。 createReportDefinition方法中,HQLDataFactory正确设置了default查询,确保报表能获取到数据。
现有核心代码片段参考:
private MasterReport createReportDefinition(String reportUrl, EntityManager manager, String query, Map<String, Object> parametersMap) { try { final ClassLoader classloader = this.getClass().getClassLoader(); final URL reportDefinitionURL = classloader.getResource(reportUrl); ResourceManager managerRes = new ResourceManager(); managerRes.registerDefaults(); Resource res = managerRes.createDirectly(reportDefinitionURL, MasterReport.class); MasterReport report = (MasterReport) res.getResource(); DataRow dr = new ParameterDataRow(parametersMap.keySet().toArray(new String[0]), parametersMap.values().toArray()); report.getParameterValues().putAll(dr); Session session = (Session) manager.getDelegate(); session = session.getSessionFactory().openSession(); StaticSessionProvider sessionProvider = new StaticSessionProvider(session); HQLDataFactory factory = new HQLDataFactory(sessionProvider); factory.setQuery("default", query); // 对应模板中的default数据集 report.setDataFactory(factory); return report; } catch (Exception ex) { ex.printStackTrace(); } return null; }
三、测试与问题排查
调用接口生成PDF后,若图表未显示,按以下顺序排查:
- 先在PRD中预览报表,确认模板本身能正常渲染图表,排除模板配置问题。
- 检查项目依赖:确保Pentaho相关依赖包(如
pentaho-reporting-engine-classic-core、pentaho-reporting-libraries-pdf)版本完整,无缺失。 - 验证数据:打印
list变量确认HQL返回的数据格式和数量符合预期,确保数据能传递到报表。
内容的提问来源于stack exchange,提问作者Shima Nikkhooo
相关产品推荐
相关产品推荐

