带 query 函数的润乾报表 API 后台导出 excel 空指针问题

 

一、问题描述:

报表动态参数表达式使用了 query 函数,在 api 运算导出报表的时候,该动态参数无法正常计算,具体报错如下:

imagepng

如果该动态参数不使用 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);

}

}