如何在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




