JasperReports,Jasper .[dʒæspə]碧玉html
16.1 JasperReports简介java
JasperReport是一个强大、灵活的报表生成工具,可以展现丰富的页面内容,并将之转换成Excel、PDF、HTML或者XML格式。这个工具是开源的,彻底使用java编写。mysql
JasperReport由一份XML格式的报表设计文件开始,通过编译、填充、导出或预览,能够产生多种格式的报表文件。除此以外,它还提供了一个iPeport的开发工具,该工具能以所见即所得的方式来开发报表定义文件。spring
使用JasperReports开发报表的核心工做就是编辑一个报表设计文件。这个文件可使用手工方式编辑,这种方式效率低下,也可使用iReport。sql
16.1.1下载和安装JasperReport数据库
到官方站点:http://jasperreports.sourceforge.net下载(目前站点改成http://jasperforge.org/了,读者注)。下载解压后在dist文件夹内找到它的API文档和JAR包apache
下载其余开源项目框架
JasperReports框架生成一些格式的文档可能依赖另一些开源项目,例如生PDF文档依赖于iTest项目;生成Excel文件则依赖POI项目。eclipse
16.1.2 JasperReports初探jsp
以开发一个静态报表为例。
首先把jasperReports JAR包复制到工程的lib中
1、定义一个报表设计文件(.jrxml)
包含大量的JasperReports标签,可使用iReport工具生成,读者不要花太多时间在这份文件上
二、把报表设计文件编译成报表文件(.jasper)
public static void main(String[] args)throws JRException {
JasperCompileManager
.compileReportToFile("static.jrxml","static.jasper");
System.out.println("成功编译成JasperReport文件(*.jasper)");
}
三、填充数据(.jsprint)
public static void main(String[] args)throws JRException {
JasperFillManager
.fillReportToFile("static.jasper", null, new
JREmptyDataSource());//使用空参数,空的数据源
System.out.println("成功填充了一个报表文件(.jrprint)");
}
.jsprint文件已是一个能够显示的报表了,可是这份报表是格式无关的,它既能够生成PDF格式,也能够生成Excel格式
四、浏览报表
JasperReports使用JRViewer类浏览报表,这个类继承了java里的Jpanel.
public static void main(String[] args)throws JRException {
JRViewer jrv=new JRViewer("static.jrprint",false);
//C/S结构使用Jframe来装载JRViewer。B/S则使用Applet来装载
JFrame jf=new JFrame("报表预览");
jf.add(jrv);
jf.pack();
jf.setVisible(true);
}
五、导出Excel文档
这时要POI项目支持,下载网址:http://poi.apache.org/
public static void main(String[] args)throws JRException {
JasperPrint print=(JasperPrint)JRLoader
.loadObject("static.jrprint");
//excel文件导出器
JRXlsExporter exporter=new JRXlsExporter();
//导出的目标文件
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
//设置每张报表都写在不一样的文件里
exporter.setParameter(JRXlsExporterParameter
.IS_ONE_PAGE_PER_SHEET, true);
exporter.exportReport();
System.out.println("成功建立了一个excel文档");
}
除了JRXlsExporter导出器外,JasperReports还提供了以下文件导出器
JRCsvExporter:用于导出CSV格式文件
JRHtmlExporter:导出HTML文件
JRPdfExporter:导出PDF文件
JRRtfExporter:导出RTF格式文件
JRTextExporter:导出文本文件
JRXmlExport:导出XML格式文件
除此以外,JasperReports还提供了一个导出管理器:JasperExportManager,能够将JasperPrint文件导出成HTML、PDF、XML格式的报表文件(没有excel格式)。还提供了一个运行管理器:JasperRunManager,只能够导出HTMl和PDF格式的文件
六、导出成PDF文件
须要iText项目支持,下载网点:http://itextpdf.com/
public static void main(String[] args) throws JRException{
JasperExportManager
.exportReportToPdfFile("static.jrprint","static.pdf");
System.out.println("成功建立一个PDF文件");
}
16.1.3JasperReports的开发流程
1、定义报表设计文件(.jrxml)
2、使用JasperCompileManager编译.jrxml文件成.jasper文件
三、使用JasperFillManager工具填充.jasper文件成.jrprint文件
四、使用导出管理器JasperExportManager或各类格式的文件导出器(JRXxxExport)或JasperRunManager将.jrprint文件导出成各类格式。也可使用JRViewer直接浏览报表
16.1.4解决PDF报表的中文问题
在报表设计文件中(.jrxml)有中文字符的地方设置中文字符所用的PDF编码,以及PDF字体。
在文件内容前增长如下元素:
<textElement>
<font pdfFontName=”STSong-Light” pdfEncoding=”UniGB-UCS2-H”/>
</textElemtnt>
也能够在文件中定义style对象,如
<style pdfFontName=”STSong-Light” pdfEncoding=”UNIGB-UCS2-H”/>
16.2动态报表
1、定义报表设计文件(.jrxml)
能够在设计报表时使用<parameter>元素定义一些传入参数,如:
<parameter name=”book3” isForPrompting=”false”
class=”java.lang.String”/>
定义以后,可使用$P{book3}输出参数内容
二、编译,同上
三、填充
经过Map对象传入,如
Map<String, String> params=new HashMap<String, String>();
params.put("author", "李刚");
params.put("book1", "spring2.0宝典");
JasperFillManager.fillReportToFile("static.jasper", params,
new JREmptyDataSource());
四、浏览或导出文件,同上
16.2.2带查询的的报表
即系统的报表显示来自数据库里的数据。
一、 定义报表设计文件
<!--定义一个参数 -->
<parameter name=”id” isForPrompting=”true” class=”java.lang.Integer”/>
isForPrompting:表示输入参数是不是用于查询语句
<!--定义查询 -->
<queryString><![CDATA[select * from bool_table where book_id>$P{id}]]/>
<!--将查询的字段定义成Field -->
<field name=”book_id” class=”java.lang.Integer”/>
<!--输出book_id的Field -->
$F{book_id}
建立报表设计文件时引用动态数据的方式
a、$V{variablesName}:访问变量
b、$P(parameterName):访问参数,参数经过Map对象填充
c、$F{fieldsName}:访问字段,经过查询数据库返回
二、 编译,同上
三、 填充
public static void main(String[] args)throws Exception {
Map<String, String> params=new HashMap<String, String>();
params.put("id", "1");
JasperFillManager.fillReportToFile("simpleQuery.jasper",
params, QueryFill.getConnection());
System.out.println("成功填充了一个报表文件(.jrprint)");
}
private static Connection getConnection()throws
ClassNotFoundException,SQLException{
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost/jee";
String user="root";
String password="123";
Class.forName(driver);
Connection conn=DriverManager
.getConnection(url,user,password);
return conn;
}
16.3使用iReport设计报表
iReport是一个所见即所得工具,能够快速地编辑出精美的报表设计文件(.jrxml)
16.3.1下载和安装iReport
下载网站:http://jasperforge.org/ (官方已有中文版的)
16.3.2使用iReport
以带条件查询的报表设计文件为例,iReport的版本是3.7.1,版本不一样菜单会有所不一样
1、文件->new…->Report 新建文件.
2、创建数据库链接
把数据库驱动程序复制到iReport的lib路径下,重启iReport.(3.7版本已经有Mysql驱动,在目录iReport-3.7.1\ide10\modules\ext下)
点击”Report Datasources ”工具按钮,再new一个新的数据库链接,如图:
三、编写SQL查询语句
若是SQL语句没有错误,会查询出表单字段,单击OK,iReport会自动添加Fields。
4、设计报表布局
在Report Elements中选择元素添加到.jrxml,再把Fields元素拉到合格的位置。设计好.jrxml后,就可使用上面介绍的步骤生成须要格式的文档
16.4安装JasperReports插件
struts2项目中有这个插件,myeclipse 8中也有,名称为
struts2-jasperreports-plugin-x.jar,能够到http://struts.apache.org/下载
使用解压缩软件打开其中的struts-plugin.xml文件,发现
<package name="jasperreports-default" >没有扩展原有的struts-default,李刚老师已经向struts2项目组反映(在struts2.1.8版中,已经发现插件配置文件扩展了extends="struts-default")
16.5使用JasperReports报表
16.5.1建立生成报表的Action
生成报表的Action和大部struts2的Action同样,但该Action使用List封装大量VO(value object,也就是要在页面显示的javaBean)
1、VO
public class Book {
private int id;
private String name;
private String author;
public int getId() {
return id;
}
public Book(int id,String name,String author){
this.id=id;
this.name=name;
this.author=author;
}
}
2、Action
public class JasperAction extends ActionSupport {
public List getBookList(){
List<Book> result=new ArrayList<Book>();
result.add(new Book(1,"Spring2宝典","李刚"));
result.add(new Book(2,"轻量级J2EE企业应用实战","李刚"));
result.add(new Book(3,"基于J2EE的Ajax宝典","李刚"));
return result;
}
}
16.5.2配置生成JasperReports报表的Action
须要增长一个类型为jasper类型的Result,故应该让该Action所在包继承jasperreports default包。定义jasper类型的Result时,须要配置如下3个属性:
1、 location:指定报表设计文件(.jasper)的位置
2、 format:指定生成报表文件的格式,如HTMl、PDF
3、 dataSource:指定一个集合属性名,让报表自动迭代输出该集合中的VO对象
<package name="lee" extends="jasperreports-default">
<action name="export"
class="com.rain.shop.jasperreports.JasperAction">
<result name="sucess" type="jasper">
<param name="location">jasper\sample_report.jasper</param>
<param name="format">PDF</param>
<param name="dataSource">bookList</param>
</result>
</action>
</package>
16.5.3生成JasperReport报表
通过上面步骤,只要提供系统所需的报表设计文件便可,这个文件可使用iReport工具设计。按照上面VO的设计,在报表设计文件中增长3个字段,如:
<field name=”id” class=”java.lang.Integer”/>
能够直接在iReport添加,如:
有了field,就能够在iReport上设计它们的位置和样式。
最后向export.action发送请求,将会得到一份PDF文档。系统会下载一份文件,后缀是
action。若是但愿让系统自动使用该报表文件的后缀是pdf,应该在Struts2拦截请求后缀中增长pdf,而后直接向export.pdf请求,将获得一份名为export.pdf文件。