API编辑报表直接将数据取出放入单元格

业务需求

通过在页面点击一个按钮,启动远程设计器,远程设计器中自动打开对应的报表,该报表名为:ApiEditRaq.raq,原型如下图:

但是通过远程设计器打开之后,需要将“类别名称列”自动填上跟ID相对应的值,并另存为一张新报表,名为:remote.raq,如下图:

 

解决办法:

先通过API读取该报表,循环遍历A2-A8格子里面的值,将这些值作为sql语句的条件,到数据库查询出“类别”表中相对应的“类别名称”的值,然后将这些“类别名称”的值一个个放到B2-B8里面。

 

具体代码如下:

package ApiTest;

 

import com.runqian.report4.model.*;

import com.runqian.report4.usermodel.INormalCell;

import com.runqian.report4.util.ReportUtils;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.sql.*;

import com.runqian.report4.model.ReportDefine;

import com.runqian.report4.model.engine.ExtCellSet;

import com.runqian.report4.usermodel.Context;

import com.runqian.report4.usermodel.Engine;

import com.runqian.report4.usermodel.IReport;

 

public class ApiEditRaq {

 

public void ApiEditRaq() throws Exception{

String raqName=”remote.raq”;//定义报表名,此处可接受页面参数,根据页面参数不同动态生成报表名

String raqPath=”D:/”;

String readPath = “D:\\ApiEditRaq.raq”;

int c;

ReportDefine rd = (ReportDefine) ReportUtils.read(readPath);//读取报表模版

c=rd.getRowCount();//获取报表总行数

System.out.println(“报表总行数:“+rd.getRowCount());

for(int i=2;i<=c;i++){

String value = (String) rd.getCell(i, (short)1).getValue();//获取单元格的值

System.out.println(“单元格值:“+rd.getCell(i, (short)1).getValue());

Class.forName(“org.hsqldb.jdbcDriver”).newInstance();

Connection conn= DriverManager.getConnection(“jdbc:hsqldb:hsql://localhost/runqianDB”,”sa”,”");

Statement stmt=conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

String sql=”select distinct 类别名称 from 类别 where 类别ID=”+value; //从数据表中取字段值

ResultSet rs=stmt.executeQuery(sql);

 

while(rs.next()){

INormalCell icell_11 = rd.getCell(i, (short) 2);//从第二行的第二列开始,i表示第二行,short(2)即第二列

icell_11.setValue(rs.getString(1));//将从数据库中取出数据放到单元格中

}

OutputStream os = new FileOutputStream( raqPath+”/”+raqName );

ReportUtils.write(os,rd);//保存报表模板在D盘根目录下

}

 

}

 

public static void main (String [] args) throws Exception{

ApiEditRaq aer = new ApiEditRaq();

aer.ApiEditRaq();

}

}

热门文章