带 query 函数的润乾报表 API 后台导出 excel 空指针问题
一、问题描述:
报表动态参数表达式使用了 query 函数,在 api 运算导出报表的时候,该动态参数无法正常计算,具体报错如下:
如果该动态参数不使用 query 函数,则可以正常导出
二、原因分析:
计算前没准备好环境,dsc=null 导致 query 函数无法正常计算,从而出现空指针的报错。
三、解决方案:
在 Java 文件中增加如下代码:
cxt.setDefDataSourceName(“oracle”);
cxt.setConnection(“oracle”, con);
DataSourceConfig dsoc = new DataSourceConfig(DBTypes.getDBType(“oracle”), true, “GBK”, “GBK”, false);
cxt.setDataSourceConfig(“oracle”, dsoc);
附完整代码示例:
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import com.raqsoft.dm.Sequence;
import com.raqsoft.report.base.DBTypes;
import com.raqsoft.report.model.ReportDefine;
import com.raqsoft.report.usermodel.Context;
import com.raqsoft.report.usermodel.Engine;
import com.raqsoft.report.usermodel.IReport;
import com.raqsoft.report.usermodel.ParamMetaData;
import com.raqsoft.report.util.ReportUtils;
import com.raqsoft.report.usermodel.DataSourceConfig;
public class Test {
public static void main(String[] args) throws Throwable {
// TODO Auto-generated method stub
// 第一步,读取报表模板
Context cxt = new Context(); // 构建报表引擎计算环境
String reportFile = “F:\\aaa.rpx”; // 该文件名可以为绝对路径,也可以相对当前程序启动路径
File flic = new File(“E:/ 授权文件 / 内部测试版 / 集算报表内部测试版.lic”);
FileInputStream lis = new FileInputStream(flic);
Sequence.readLicense(Sequence.P_RPT, lis);
// 设置数据源
ReportDefine rd = (ReportDefine)ReportUtils.read(reportFile);
Connection con = null;
try{
Driver driver = (Driver) Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
DriverManager.registerDriver(driver);
con= DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:orcl”,“test”,“runqian”);
}catch (Exception e){
e.printStackTrace();}
// 增加 DataSourceConfig 配置
cxt.setDefDataSourceName(“oracle”);
cxt.setConnection(“oracle”, con);
DataSourceConfig dsoc = new DataSourceConfig(DBTypes.getDBType(“oracle”), true, “GBK”, “GBK”, false);
cxt.setDataSourceConfig(“oracle”, dsoc);
System.out.println(“——-”+cxt.getDataSourceConfig(“oracle”)+“——–”);
// 参数传递
ParamMetaData pmd = rd.getParamMetaData(); // 从报表定义中取得参数元对象 ParamMetaData
String paramOrMocrName = "";
if(pmd != null){
paramOrMocrName = pmd.getParam(0).getParamName(); // 获取参数名
cxt.setParamValue(paramOrMocrName,“77777”); // 设参数值
}
// 第二步,运算报表
Engine enging = new Engine(rd, cxt);
IReport iReport = enging.calc();
ReportUtils.exportToExcel(“F:/test.xls”,iReport,false);
}
}