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();
}
}