² 下载
iReport- 0.4.0 (报表的可视化编辑工具)
iTextAsian.jar加入classpath,如果报表中含有亚洲字符,输出PDF文件时才能正常的显示。
² iReport的使用步骤
1、 选择工具栏上新建报表,设置基本信息,包括名称,打印纸大小,打印方向(纵向或者是横向),在more标签页选择XML编码方式,如果需要XML支持中文,那么XML ENCODING为GB2312,还可选择总标题和总结为单独一页打印。
2、 报表上主要的元素为静态文本(static text)、变量(variable)、动态域(Field)、参数(Parameter)。静态文本就是显示在报表上不变的文字。变量是指通过系统自带的计算得到的一些值(如当前页、总记录数等)。动态域可以是连接数据库时所的的字段,也可以是通过自定义数据源(可能是包含一组数据的实体类)。参数是程序运行时传到报表内部的变量,通常通过Map形式传入,可作为显示变量或者用于sql语句中变化的条件。
注:$P{param_name}代表参数,{}内是参数的名称,在报表中设定后,在运行的时候通过从外部传入的参数来动态生成标题等数据,并且可以作为查询条件传入sql语句使用(如果是使用JDBC直接连接数据库的话)
$V{PAGE_NUMBER}代表当前页数,$V代表variable,对现有的group,$V{groupname_COUNT}代表当前组的记录数
$F{Field_name}表示字段,是报表中最重要的部分。如果JDBC方式的连接,输入sql查询语句就可得到所有查询所得到的字段;如果是Custom Datasource方式,新建一字段,例如user_id。数据类中getFieldValue(JRField field),field就是报表中的$F{Field_name}。程序中根据JRField对象的name属性来确定返回哪个值
//代表返回当前行的第四个字段
if("user_id".equals(field.getName()))return data[index][3];
3、 拖拽上述元素到报表页面上后,需要设定他们的字体fontname是用ireport预览时使用的字体,如果可能含有中文,那么必须选择一个中文字体,否则无法正常显示。PDF font name选择STSONG_LIGHT,在PDF Embeded PDF Encoding复选框上打钩,并在下拉框中选择UniGB_UCS2_H(Chinese_simplified) 。这样输出的pdf文件才能正常显示中文。
注意:如果用ireport生成含中文的报表,则需要把iTextAsian.jar拷贝到iReport的lib文件夹下。
在TextField标签页里选择文本域的类,重新选择一下evaluation time为now(如果不激活该下拉框,运行时候会出现evaluation time 错误字样)。如果文本在某个组里,那么从Evaluation group里选择相应的组。勾选blank when null 。TextField expression是文本的表达式,能够完成一些如字符串连接等简单操作,比如”当前页”+$V{PAGE_NUMBER}。Pattern里点击create按钮可选择时间日期相关的格式化后的形式,便于报表打印时间等动态生成。
4、 在build菜单内能选择多种方式,默认的为编译以后用JRViewer在iReport中预览显示效果,选择pdf preview就是输出为一个PDF文件来预览显示效果。在实际的web打印中,使用jaseperreport提供的方法生成PDF。
5、 几种Datasource的方法
a) JDBC连接数据库。新建一个连接,选择类型为Database JDBC connection,给这个连接一个名字,填写driver,数据库连接的url,数据库用户名密码等信息后,测试通过即可建立连接。
b) Customer JRDatasource取得数据。首先写一个包含数据的类,它实现了JRDatasource接口,实现next()和getFieldValue(JRFeild field)两个方法。Next方法用于取得下一条记录,getFieldValue方法则根据jasper文件中定义的field的名称来取得对应列的数据。另外,为了在ireport中能预览效果,我们还需要构造取得该数据源类的方法,通常命名为XXXDatasourceFactory类,它提供了getTheDatasource类取得数据源类这个对象。在连接时,填上工厂类和取得数据源类的对应方法后即可得到数据。
然后在菜单上的build->set active connection选择连接,在datasource->report query里输入sql语句或javabean方式得到数据域。得到的数据域按名存放在Fields里,可拖拽到页面报表上。
6、 编译过程就是把 *.jrxml文件编译成jasperreport能使用的*.jasper文件。我们从ireport只需要得到一个jasper文件即可。
² WEB打印程序
1、 首先需要取的数据的类,形成对象数组的方法可以通过JDBC或其他方式计算获得。
Public Datasource implements JRDatasource{
Private Object[][] data={};
Public void next(){
//取得对象数组下一行
}
Public object getFieldValue(JRField field){
//逐个字符串匹配域的名称并返回相应的值
}
}
2、 调用jasperreport里生成PDF的方法
JasperRunManager.runReportToPdfFile
(String arg,String output,Map param,JRDatasource datasource)
//arg表示该报表使用的jasper文件目录, output指输入pdf文件的路径和文件名,param指报表中需要使用的参数的map,datasource就是包含数据的实体类。
注意:在Tomcat下运行时需要加入iTextAsian.jar到common/lib目录下。否则会出现STSONG_LIGHT或UniGB_UCS2_H无法找到的错误