报表制作完成后,还可进行各种运算。如读入报表、计算报表、展现报表等。
必须通过ReportUtils.read()读入报表,read()方法提供两种读入报表的方式,第一种直接传入报表的绝对路径,另一种为构建一个文件输入流,如下:
◆ 文件方式读入:
String reportFile = “C:/api/reportFiles/wangge.rpx”; //该文件名可以为绝对路径,也可以相对当前程序启动路径
ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
◆ 文件流方式读入:
InputStream is = ……. ; //获取一个报表输入流,如new FileInputStream(“报表路径”);
ReportDefine rd = (ReportDefine)ReportUtils.read(is);
◆ 核心计算代码:
Context cxt = new Context(); //构建报表引擎计算环境
//.......................... //其它辅助代码,例如往报表引擎传递参数,传递数据库连接参数等,见后面的介绍
ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
Engine engine = new Engine(rd, cxt); //构造报表引擎
IReport iReport = engine.calc(); //运算报表
◆ 参数传递:
ParamMetaData pmd = rd.getParamMetaData(); //从报表定义中取得参数元对象ParamMetaData
String paramOrMocrName = "";
if(pmd != null){
for(int i = 0, count = pmd.getParamCount(); i < count; i ++ ) { //讲究优化的写法
paramOrMocrName = pmd.getParam(i).getParamName(); //获取参数名
cxt.setParamValue(paramOrMocrName, request.getParameter(paramOrMocrName)); //设参数值
}}
◆添加JNDI的数据源配置
ReportServlet.addJNDIDsConfig("sqlsvr,sqlsvr,1,iso8859-1,GBK,0", "java:comp/env", true);
◆ 直接传递con,改变数据源连接:
//取得数据源
Connection connection = null;
try{
Driver driver = (Driver) Class.forName("org.hsqldb.jdbcDriver").newInstance();
DriverManager.registerDriver(driver);
con= DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/demo","sa","");
}catch (Exception e){
e.printStackTrace(); }
String defDsName = cxt.getDefDataSourceName ();
if (defDsName != null) cxt.setConnection(defDsName, con); //这样设定默认数据源
cxt.setConnection("dsName",con); //也可以直接指定某个已经的数据源,设置其con
◆ 指定另一个系统数据源名称,从而改变数据源连接
cxt.setDefDataSourceName("demo"); //改变缺省数据源名称
◆ 通过数据源工厂改变数据源连接
IConnectionFactory connFactory=......; //构造数据源工厂类,一般为自定义类
cxt.setConnectionFactory(sourceName,connFactory);
//其中connFactory这个类必须实现IConnectionFactory接口,并且实现他的public //java.sql.Connection getConnection() throws Exception 方法
◆ 直接传递数据库连接参数,改变数据源连接
DataSourceDefine dsoc=new DataSourceDefine();
dsoc.setDriver(......); //设置jdbc的驱动
dsoc.setCaseSentence(......); //设置sql的大小写是否无关,指表名字段名等
dsoc.setDSType(......); //设置数据源类型,如DataSource.TYPE_RELATIONAL, DataSource.TYPE_ODBC等
dsoc.setExtend(......); //设置数据库的扩展属性
dsoc.setName(......); //设置数据源名
dsoc.setPassword(......); //设置数据库连接密码
dsoc.setUser(......); //设置数据库访问用户名
dsoc.setUrl(......); //设置Jdbc的url
dsoc.setUseSchema(......); //设置是否使用模式
dsoc.setClientCharset(......); //设置客户端的字符集
dsoc.setDBCharset(......); //设置数据库的字符集
dsoc.setDBType(......); //设置数据库类型,如DBTypes.ORACLE, DBTypes.SQLSVR等
dsoc.setNeedTranContent(......); //设置数据库返回值是否需要转码
dsoc.setNeedTranSentence(......); //设置sql是否需要转码
cxt.setDataSourceConfig("jdbc/default", dsoc);
◆ 集算器数据源的连接
DBConfig dc=new DBConfig();
dc.setDriver(……); //设置jdbc的驱动
dc.setUrl(……); //设置Jdbc的url
dc.setUser(……); //设置数据库访问用户名
dc.setPassword(……); //设置数据库连接密码
dc.setUseSchema(……); //设置是否使用模式
dc.setInfo(……); //设置属性
dc.setCaseSentence(……); //设置sql的大小写是否无关,指表名字段名等
dc.setAddTilde(……); //设置是否使用代字号
dc.setExtend(……); //设置数据库的扩展属性
ISessionFactory SessFactory= new DBSessionFactory(dc);
Env.setDBSessionFactory(dsName, SessFactory); //设置数据源名称以及数据库连接工厂
报表计算完后,返回的是一个IReport对象,可以将该对象保存为rat文件。下次需要时,可以直接读取,然后输出展现。
if (fileName.endsWith(GC.FILE_RAT)) { //根据文件名判断是否是rat文件
FileInputStream in = new FileInputStream(fileName); //根据文件名新建文件输入流
ObjectInputStream ois = new ObjectInputStream(in); //新建对象输入流
IReport r = (IReport) ois.readObject(); //强制转换为IReport实体对象
in.close(); //关闭文件输入流
…
}
◆ 分页
PageBuilder pb = null;
IReport iReport =......; //计算报表的相关代码,获得一个IReport
pb = new PageBuilder(iReport,800,100); //对报表进行分页,PageBuilder还有别的构造方法
int currentPage=......; //获得当前页号
IReport iReporTemp = pb.getPage(currentPage); //根据当前页号返回当前页对象
String htmlText = ReportUtils.toHTMLString(iReporTemp,"report2",request); //把当前页对象输出html语法
out.println(htmlText); //输出html语法至网页
◆ 输出到网页
String htmlText = ReportUtils.toHTMLString(iReport,"report1",request); //生成html语法
out.print(htmlText); //输出报表到网页
◆ 缓存
背景说明:
润乾报表提供了先进的缓存机制,正常的使用中,tag标签自动进行处理。如果调用API接口计算报表,如何使用缓存呢?
代码示例1:
Context ctx = new Context();
ctx.setMainDir("C:\\......\\reportFiles\\ "); //报表模板的存放路径
CacheManager manager = CacheManager.getInstance(); //获取系统缓存管理器
manager.setCachePath("C:\\Temp"); //设置缓存报表在硬盘中的存放路径
//manager.setCompressMode(false); // 默认压缩,压缩主要是为了提高存盘效率
//manager.setRealtimeReload(true); // 设置实时读取报表定义, 默认不实时读取报表定义
ReportCache rc = manager.getReportCache("1.rpx", ctx, 0); //把报表模板名赋给缓存管理器,系统即自动加载该报表,并建立一系列的缓存管理机制
IReport report = rc.getReport(ctx); //从缓存中获取报表对象
代码示例2:
String reportFile = “C:/api/reportFiles/wangge.rpx”; //必须为绝对路径
ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
//...... //其它代码,例如对rd动态设置一系列属性等
CacheManager manager = CacheManager.getInstance(); //获取系统缓存管理器
//................. //其它代码,例如对manager设置各种属性等
ReportEntry re=manager.cacheReportDefine("reportName", rd); //将ReportDefine赋给缓存管理器
Context ctx = new Context(); //构建报表运算环境
//...... //其它代码,例如对ctx设置各种属性等
long timeout=10000;
ReportCache rc=re.getReportCache(ctx, timeout);
IReport report = rc.getReport(ctx); //从缓存中获取报表对象
代码示例3:
Context cxt = new Context(); //构建报表引擎计算环境
//.......................... //其它辅助代码,例如往报表引擎传递参数,传递数据库连接参数等
ReportDefine rd = (ReportDefine)ReportUtils.read( reportFile );
Engine engine = new Engine(rd, cxt); //构造报表引擎
IReport iReport = engine.calc(); //运算报表
CacheManager manager = CacheManager.getInstance(); //获取系统缓存管理器
//................. //其它代码,例如对manager设置各种属性等
ReportCache rc=manager.cacheReport("reportName",iReport); //将结果报表缓存起来
String cacheId=rc.getId(); //取报表缓存号,以便下次从缓存中调用时利用该号获取缓存报表
◆ swing中展现
背景说明:
java应用有不少是C/S的模式,在C/S的模式下,同样可以调用API接口运算报表,并且把结果报表在JFrame窗口中进行展现,还可以进行打印。
代码示例:
ExtCellSet.readLicense(xml); //设置润乾报表授权文件
//................ //其它代码
IReport iReport = ......; //运算代码,获得一个IReport对象
CSReport csReport = new CSReport(iReport); //构造CSReport控件
JFrame jf = new JFrame("润乾报表"); //构造JFrame界面
jf.getContentPane().add(csReport.getDisplayPane()); //设置JFrame的相关属性并展现
jf.setSize(600, 400);
jf.setLocation(200, 100);
jf.show();
//................ //其它代码
//csReport.print(); //打印,该代码可以写在某个按钮的相关事件中
注意:
如下情况也需要通过API设置授权:
1. 不重启服务器,在应用正常运行过程中,修改授权文件,则不会自动重新装载,此时需要调用API手动设置授权
2. 在C/S应用中,没有授权文件的配置机制,此时必须调用API接口,进行装载
参考文件:CalculateReport.java
◆ 自定义Swing报表打印属性
背景说明:
基于Swing开发项目的用户,不仅仅满足于把结果报表在JFrame窗口中展现、打印,他们还希望自己能够设置从指定页打印、指定范围页打印,调整页面的页边距,细化打印比例,调整默认的打印显示比例等等以实现灵活的进行打印。为了满足用户的需求润乾报表提供了报表打印对话框API供用户调用以实现以上功能。
代码示例:
IReport iReport = ......; //运算代码,获得一个IReport对象
CSReport csReport = new CSReport(iReport); //构造CSReport控件
JFrame jf = new JFrame("润乾报表"); //构造JFrame界面
jf.getContentPane().add(csReport.getDisplayPane()); //设置JFrame的相关属性并展现
......
PrintFrame pf=new PrintFrame(iReport,jf); //定义一个报表打印对话框类对象
pf.setColumns(2); //设置报表的分栏数为2
//pf.setPrintablePages(2); //设置要打印的页号为:2
pf.setPrintablePages(2,6); //设置要打印的页号范围为:第2页到第6页
……
关于PrintFrame包含的方法介绍请参考打印。
计算字间距
背景说明:
由于不同的字体与字号对应不同的浏览器字间距不同。导致web端展现与报表出现误差。调用此方法可调整字间距。需在raqsoftConfig.xml中进行配置,指定用户这个类的名称(包括包名)。
代码示例:
package api;
import com.raqsoft.report.usermodel.ILetterSpacing;
public class LetterSpacing implements ILetterSpacing
{
int browser;//浏览器
String font;// 字体名称
int fontSize;// 字体大小,单位象素
int cellWidth;// 单元格大小,单位象素
public int calc(int browser, String font, int fontSize, int cellWidth)
{
//浏览器为IE
if(browser==0){
if(font=="宋体"||fontSize%2==0){
return 0;
}
if(font!="宋体"||fontSize%2==1){
return -1;
}
}else{
//其他浏览器
return 0;
}
return 0;
}
}
参考文件:LetterSpacing.java
普通导出报表
背景说明:
报表制作完成后,不仅能够实现展现及打印的功能,还能够根据用户的不同需求,以不同的形式导出。润乾报表为用户提供的导出方式有Excel, PDF,Text,Xml,Word,html,csv,OFD,方便了用户的使用。
代码示例:
◆ 导出Excel
IReport ireport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_EXCEL); //导出为Excel
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_EXCEL_PAGE); //导出为分页的Excel
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_EXCEL_FORMULA); //导出为带公式的Excel
re.export(ireport ); //导出
◆ 导出Pdf
IReport iReport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_PDF); //导出为PDF
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_PDF_PAGE); //导出为分页的PDF
re.export(ireport ); //导出
◆ 导出OFD
IReport iReport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_OFD); //导出为OFD
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_OFD_PAGE); //导出为分页的OFD
re.export(ireport ); //导出
◆ 导出Text
IReport iReport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_TEXT); //导出为txt
re.export(ireport ); //导出
◆ 导出xml
IReport iReport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_XML); //导出为xml
re.export(ireport ); //导出
◆ 导出html
IReport iReport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_HTML); //导出为html
re.export(ireport ); //导出
◆ 导出Word
IReport iReport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_WORD_OPENXML); //导出为Word
re.export(ireport ); //导出
◆ 导出图片
IReport iReport = ......; //运算代码,获得一个IReport对象
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_PICTURE); //导出为不分页的图片
ReportExporter re = new ReportExporter(java.lang.String fileName,ReportExporter. EXPORT_PICTURE_PAGE); //导出为分页的图片
re.setPictureFormat("JPG"); //设置导出的图片格式,默认为PNG,支持的图形格式有PNG、JPG、GIF、SVG、TIFF
re.export(ireport ); //导出
注意:程序会将图片(集合)压缩为zip格式,导出的文件名后缀要使用zip。
◆ 导出csv
TextFile tf = new TextFile( IReport report, String separator, String lineBreak ); //设置分隔符和换行符,一般是: \t \n和空格。
tf.setType("csv"); //两种type,还可以是txt。
tf.fileWrite( java.ioFile f, java.lang.String exportDisp); //导出到文件f。exportDisp是否导出显示值。
导出报表到服务器
背景说明:
报表制作完成后,不仅可以导出到本地,还可以导出到服务器中的某个目录下。
页面中展现报表时,会生成一个导出到服务器的js函数,函数名为save2server (reportName, saveClass),[reportName]是tag标签中指定的报表name,参数saveClass是用户写的保存类全名,此类要实现接口com.raqsoft.report.usermodel.ISave2Server。
用户可在页面中放一个按钮来调用此js函数,或者在tag的userFuncBarElements属性中添加按钮到报表的工具条中。
示例:
JSP页面:
<report:html name="report1" reportFileName="<%=file%>"
……
modifiable="yes"
userFuncBarElements="<input type=button value='导出Excel到服务器' onclick=save2server ('report1','test.MySave2Server')>"
/>
参考文件:SavetoServer.jsp
MySave2Server类代码:
package api;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import com.raqsoft.report.usermodel.IReport;
import com.raqsoft.report.usermodel.ISave2Server;
import com.raqsoft.report.util.ReportUtils;
public class MySave2Server implements ISave2Server {
public void save(IReport report, String fileName, ServletContext application, HttpServletResponse response ) throws Throwable {
... ...
fileName = application.getRealPath( "/export/" + fileName + ".xls" );
FileOutputStream fos = null;
try {
fos = new FileOutputStream( fileName );
ReportUtils.exportToExcel (fos, report, true);
}
finally {
... ...
}
... ...
}
}
参考文件:MySave2Server.java
◆ 输出报表到Excel
ReportUtils.exportToExcel(java.io.OutputStream os, IReport report, boolean pageBroken);
ReportUtils.exportToExcel(java.io.OutputStream os, IReport report, boolean pageBroken, int dispRatio);
ReportUtils.exportToExcel(java.lang.String fileName, IReport report, boolean pageBroken);
ReportUtils.exportToExcel(java.lang.String fileName, IReport report, boolean pageBroken, int dispRatio);
◆ 输出报表到Excel2007
ReportUtils.exportToExcel 2007(java.lang.String fileName,IReport report,boolean pageBroken);
ReportUtils.exportToExcel 2007(java.io.OutputStream os,IReport report,boolean pageBroken);
◆ 输出报表到html
ReportUtils.exportToHTML(java.lang.String fileName, IReport report);
ReportUtils.exportToHTML(java.lang.String fileName, IReport report, float scale);
ReportUtils.exportToHTML(java.lang.String fileName, IReport report, java.lang.String encode, float scale);
◆ 输出报表到PDF
ReportUtils.exportToPDF(java.io.OutputStream os, IReport report);
ReportUtils.exportToPDF(java.io.OutputStream os, IReport report, boolean pageBroken, boolean graphicOut);
ReportUtils.exportToPDF(java.lang.String fileName, IReport report);
ReportUtils.exportToPDF(java.lang.String fileName, IReport report, boolean pageBroken, boolean graphicOut);
◆ 输出报表到text
ReportUtils.exportToText(java.io.OutputStream os, IReport report);
ReportUtils.exportToText(java.io.OutputStream os,IReport report,boolean exportEmptyHLine);
ReportUtils.exportToText(java.io.OutputStream os, IReport report, java.lang.String separator, boolean dispValue);
◆ 输出报表到Word
ReportUtils.exportToDOCX (java.io.OutputStream os, IReport report);
ReportUtils.exportToDOCX (java.lang.String fileName,IReport report);
◆ 输出报表到图片
ReportUtils.exportToPicture (OutputStream os, IReport iReport, boolean pageBroken, String type_ext);
注意:程序会将图片(集合)压缩为zip格式,导出的文件名后缀要使用zip。
◆ 输出报表组到文件
ReportUtils.exportReportGroup (String fileName, ReportGroup rg, Context ctx, byte type, int ratio);
ReportUtils.exportReportGroup(OutputStream os, ReportGroup rg, Context ctx, byte type, int ratio);
◆ 输出报表组到图片
ReportUtils.exportReportGroupToPicture (OutputStream os, ReportGroup group, Context ctx, boolean pageBroken, String type_ext);
注意:程序会将图片(集合)压缩为zip格式,导出的文件名后缀要使用zip。
◆ 更加灵活的输出方法:这里仅以Excel为例
ExcelReport er = new ExcelReport ();
er.export(report); //输出不分页报表,sheet名称自动生成
er.export(sheetName, report); //输出不分页报表并定义sheet名称
er.export(pb); //输出一个报表的PageBuilder,sheet名称自动生成,按照pb的页数输出多个sheet
er.export(sheetName, pb); //自定义sheet名称输出PageBuilder,如PageBuilder有多页,则系统会自动在sheetName后面加上1、2、3
//以上几种方式可以单独调用,也可以在一个ExcelReport中多次使用各种方式,多次调用时,报表输出
//多个sheet的Excel。
er. saveTo(java.io.OutputStream os); //输出到文件流
er.saveTo(String filename); //输出到指定文件
//其它几种输出方式类似,只是无定义sheet名称接口。
背景说明:
报表制作完成后,不仅能实现展现及导出等功能,还能够根据用户需求,通过指定模板文件中的书签名称确定插入位置,然后将报表、图片、文本内容插入到新的Word文件中。根据实际业务需求,提供了如下两种方式以供参考。
单个书签内容一一插入Word
try {
//设置报表授权文件
String fraq = "D:/report.xml";
ExtCellSet.readLicense(fraq);
File f = new File("E:/test.docx"); // 模板文件
File of = new File("D:/out.docx"); // 输出文件
… …
FileOutputStream fos = new FileOutputStream(of);
DocxChanger dc = new DocxChanger(f, fos); //实例化DocxChanger
//替换文字
dc.replaceText("标题文字", "润乾报表", "楷体", 16f);
//书签处插入文字
dc.insertText("a", "Hello world!", "黑体", 20f);
//书签处插入图片文件
File f1 = new File("D:/test.jpg");
dc.insertImageDirectly("b", f1);
//书签处插入图片文件,自适应单元格大小
dc.insertImageAdjustCell("b1", f1);
//书签处插入图片文件,按照给定的厘米参数设定宽高
dc.insertImageWithWH("b2", f1, 5, 3);
//书签处插入Image对象
BufferedImage bi = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
g.setBackground(……);
… …
dc.insertImageDirectly("c", bi);
//书签处插入Image对象,自适应单元格大小
dc.insertImageAdjustCell("c1", bi);
//书签处插入Image对象,按照给定的厘米参数设定宽高
dc.insertImageWithWH("c2", bi, 8, 6);
//书签处插入报表
File f2 = new File("D:/api/wangge.rpx");
FileInputStream fis =new FileInputStream(f2);
IReport report = ReportUtils.read(fis);
fis.close();
Context context = new Context();
……
Engine engine = new Engine((ReportDefine) report, context);
report = engine.calc();
dc.insertReport("report1", report);
//执行所有修改动作,然后关闭输出文件流
dc.execute();
fos.close();
……
参考文件:InsertWord.java
注意事项:
根据实际情况设计模板文件,保证报表宽度不要超过Word模板的宽度,统计图不要位于分页处,否则会导致显示不全。
多个书签内容一起插入Word
我们可以将文本,Image对象或文件,报表一一插入到Word中,同样,我们也可以将这些对象一次性的插入更新到Word中。那么首先,我们需要将要插入的对象在一个xml文件中配置好,这个xml文件名可以任意取,格式参考下面batch.xml 的介绍:
该文件中可配置多个书签和插入对象,当对象来源于内存时,可配置成map,通过key从内存中取值,key值可以是IReport、byte[]、Image、String,值的类型程序会自动判断。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- file表示模板docx文件名,可配置绝对路径或相对路径(加载ide配置是相对于应用资源路径,加载web端配置时相对于raqsoftConfig.xml文件下<Report>里的<home>属性所对应的路径) -->
<docx file="D:/test.doc">
<!-- name表示docx书签,为空则不会插入。 file表示图片文件名,可配置绝对路径或相对路径(加载ide配置是相对于应用资源路径,加载web端配置时相对于raqsoftConfig.xml文件下<Report>里的<home>属性所对应的路径) -->
<bookmark name="f" type="image" file="D:/test.jpg"/>
<!-- name表示docx书签, text要插入的文本文字 -->
<bookmark name="c" type="text" text="测试的XML specified text."/>
<!-- key表示给定map中的key(未填时跟name相同,对应的value只能是IReport、byte[]、Image、String) -->
<bookmark name="a" type="map" key="f"/>
<!-- reportFile表示报表模板文件名,可配置绝对路径或相对路径(加载ide配置是相对于应用资源路径,加载web端配置时相对于raqsoftConfig.xml文件下<Report>里的<home>属性所对应的路径)-->
<bookmark name="b" type="report" reportFile="D:/student.rpx">
<!-- value表示报表参数值(串) -->
<reportParam name="arg1" type="value" value="设定参数1"/>
<!-- type为map时会从内存中根据name读取key,key未填写时跟name相同,key=""时会取map中key为空的值-->
<reportParam name="arg2" type="map"/>
<!-- key表示给定map中的key(未填时跟name相同)-->
<reportParam name="" type="map" key=""/>
</bookmark>
</docx>
2) 同时将多个书签内容插入Word
try {
// 输出文件
File of = new File("D:/out.docx");
……
FileOutputStream fos = new FileOutputStream(of);
//加载xml,batch.xml内容如上一小节所示
String xmlConfig = DocxChanger.xmlFile2String("D:/batch.xml");
// 准备环境,加载ide中配置的数据源信息和应用资源路径信息,如加载web端配置信息如下内容可省略
System.setProperty("report.home", "D:/Program Files/raqsoft/report");
System.setProperty("start.home", "D:/Program Files/raqsoft/report");
com.raqsoft.report.ide.base.ConfigOptions.load();
GV.dsModel =new com.raqsoft.report.ide.base.DataSourceListModel();
com.raqsoft.report.ide.RPX.loadDataSources();
Context rootCtx = GV.prepareContext();
Context.setInitCtx(rootCtx);
……
//当插入的对象来自内存,比如IReport对象
File f4 = new File("d:/product.rpx");
FileInputStream fis = new FileInputStream(f4);
IReport report = ReportUtils.read(fis);
fis.close();
Context context = new Context();
…… //假如需要的数据源信息在ide数据源配置中存在,则可省略
Context.setInitCtx(rootCtx);// 假如需要的数据源信息在ide数据源配置中存在,则可省略
Engine engine = new Engine((ReportDefine) report, context);
report = engine.calc();
HashMap map = new HashMap();
map.put("f", report); //设置xml中key为f的值
//当插入的对象来自内存,比如String,设置xml中key为arg2的值
map.put("arg2", "2014-12-15 12:00:23");
DocxChanger.insert(map, xmlConfig, fos);
fos.close();
} catch (Throwable x) {
x.printStackTrace();
}
参考文件:InsertWords.java
背景说明:
报表制作完成后,不仅可以将计算后的报表导出为各种类型的文件,还可以将计算前的报表源文件导出为.json文件或将.json文件转为.rpx报表源文件。导出.json文件可方便用户批量查找文件中的表达式等操作。
代码示例:
//将报表源文件java对象转成Json串
File f3 = new File("D:/01网格式报表.rpx");
FileInputStream fis = new FileInputStream(f3);
IReport report = ReportUtils.read(fis);
fis.close();
String json=JsonUtil.getJSONString(report);
System.out.print("Json串内容为:"+json);
… …
//从输入流读取json文本,文件字符集必须是UTF-8
File f3 = new File("D:/01网格式报表.json");
FileInputStream fis = new FileInputStream(f3);
String json=null;
json = JsonUtil.readJson(fis);
System.out.print("Json文件内容为:"+json);
… …
//将指定的目录下的文件,转换到同目录下
String target = "D:/Test";
JsonUtil.transfer(new File(target));
… …
//将指定的文件或者目录srcFile转换到目标目录targetPath下
String src = "D:/Test";
String target = "D:/targetTest";
JsonUtil.transfer(new File(src),new File(target));
… …
参考文件: RpxtoJsonTest.java
背景说明:
访问报表有时需要验证参数值中是否含有某些特殊字符或者是想要通过限定参数名来实现对部分参数的验证,为满足这类需求润乾报表提供了访问报表时对参数值的校验功能。使用该功能后,访问有参数的报表时则会自动对参数进行验证。
代码示例:
package api;
import com.raqsoft.report.util.IParamChecker;
/*
* 验证报表参数的实现类
* 用户可以自定义验证,然后通过WEB-INF/raqsoftConfig.xml配置来加载到项目中
*/
public class DisabledCharChecker implements IParamChecker{
/*
* @paramName 验证的参数名
* @inputValue 验证的参数值
*/
public boolean check(String paramName, String inputValue) {
… …
if(inputValue == null || inputValue.length() == 0){
return true;
}
for(int i = 0; i < disabledCharArr.length; i++){
if(inputValue.indexOf(disabledCharArr[i]) >= 0){
this.cause = "Sorry,校验未通过," + paramName + "参数中含有以下字符:" + disabledCharArr[i];
return false;
}
}
return true;
}
/*
* 验证的返回信息
*/
public String getCause() {
… …
String tmp = this.cause;
return tmp;
}
… ...
}
● 注意:
实现润乾报表提供的com.raqsoft.report.util.IParamChecker接口后,需在WEB-INF/raqsoftConfig.xml中添加paramCheckClass属性配置,属性值为类路径:
<Server>
… …
<property name="paramCheckClass" value="api.DisabledCharChecker"/>
</Server>
参考文件:DisabledCharChecker.java