You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在TIBCO JasperSoft Studio中打印Jasper Report真实数据源名称?

解决Jasper报表中打印真实数据源名称的问题

我明白你现在遇到的困扰——直接调用$P{REPORT_DATA_SOURCE}输出的只是数据源对象的内存地址字符串,完全不是你想要的"SUNNYSZ"这类真实名称。下面给你两种可行的解决方案,优先推荐第一种,因为它简单且不依赖数据源类型:

方案1:单独传递数据源名称参数(推荐)

这是最直接、最可靠的方法,完全避开数据源对象的类型限制:

  • 在JasperSoft Studio里给报表新增一个字符串类型参数,命名为DATA_SOURCE_NAME(名字可以自定义),类型选择java.lang.String
  • 调用报表时(不管是Java代码调用还是通过Jasper Server),除了传入REPORT_DATA_SOURCE参数,同时把DATA_SOURCE_NAME参数的值设为你需要显示的数据源名称(比如"SUNNYSZ")。
  • 在报表需要展示名称的位置,直接使用表达式$P{DATA_SOURCE_NAME}就能准确打印出指定的名称。

方案2:从数据源对象中提取名称(依赖数据源类型)

如果你一定要从已有的数据源对象里获取名称,就得根据具体的数据源类型编写表达式,因为不同数据源的API逻辑差异很大:

情况A:数据源是JDBC类型(如JRResultSetDataSource

如果你的数据源基于JDBC连接,可以通过连接元数据获取数据库相关名称:

$P{REPORT_DATA_SOURCE} instanceof net.sf.jasperreports.engine.JRResultSetDataSource ? 
((net.sf.jasperreports.engine.JRResultSetDataSource)$P{REPORT_DATA_SOURCE}).getConnection().getMetaData().getDatabaseProductName() : 
"Unknown Data Source"

情况B:数据源是SortedDataSource(你当前看到的类型)

SortedDataSource是一个包装了底层数据源的装饰类,得先获取它的底层数据源再提取信息。如果底层是JDBC数据源,表达式可以写成:

$P{REPORT_DATA_SOURCE} instanceof net.sf.jasperreports.engine.fill.SortedDataSource ? 
((net.sf.jasperreports.engine.JRResultSetDataSource)((net.sf.jasperreports.engine.fill.SortedDataSource)$P{REPORT_DATA_SOURCE}).getDataSource()).getConnection().getMetaData().getDatabaseProductName() : 
"Unknown Data Source"

⚠️ 注意:这种方法局限性很强,不同数据源类型的获取逻辑完全不同,有些数据源甚至没有暴露名称属性。后续如果更换数据源类型,这个表达式大概率会失效,所以方案1才是更稳妥的选择。

内容的提问来源于stack exchange,提问作者Kevin Chui

火山引擎 最新活动