IReport + JasperReport(上)
关键字: ireport + jasperreportiReport 笔记(一) 序
iReport是用于定义JasperReport报表的可视化工具,JasperReport使用XML来定义一个报表的结构,iReport可以让用户很方便地定义报表,而不需要手工去写这些XML文件。
iReport的官方网址为 http://www.jasperforge.org ,iReport是免费的,不过其教程却是收费的(好像是30美刀,贵了点,不过我相信即使是30人民币,在中国也没几个人去买,除非是做成纸质的),不过这一点还真难不到中国人,因为网上好心人比较多(例如我,脸皮比较厚,呵呵)。
iReport提供所谓的中文版本,不过建议大家还是安装英文版,因为中文版的汉化是繁体版,而且不完整,中英混排,而且没有使用专门的中文字号, 极其难看。如果不幸安装了中文版,那也不要紧,点击菜单中的“Options”-“Settings...”,将“General”面板中的 “Language”项设为“English”即可。
我平时使用iReport的步骤如下所示:
- 使用iReport定义报表格式
- 编程生成报表数据源
- 使用报表数据源和报表模板文件生成用户报表
我平时只用JasperReport生成PDF报表,虽然它也提供其它格式的输出,但输出结果通常不太理想,例如,使用JasperReport生 成Excel报表时,如果用户是想再拿来自己作数据处理的话,通常是没法用的,因此,如果用户对Excel报表有强烈要求的话,那么用 JasperReport通常是费力不讨好,建议大家还是直接用POI的好。
在使用JasperReport以前,我一直是用iText来生成PDF报表,实际上,JasperReport也是通过使用iText来生成 PDF报表,但使用JasperReport,可在很大程度上提高程序的可读性及报表开发效率。因此,在使用JasperReport开发报表 时,iText包也要加到项目中,如果要使用中文,还要加入iTextAsian包。
iReport支持多种数据源格式,这个可以从新建数据源的对话框中看得出来,如下所示:
是不是有点晕,实话实说,里面有好多东西我也不知道该怎么用,不过只要能够满足平时的应用就足够了,不是吗?我重点讲一下“JavaBeans set data source”,这个可以满足我的全部需求,附带也讲一下“Database JDBC connection”,因为我平时JDBC用的多一些。
使用iReport编辑生成的文件为.jrxml文件,通常要编译生成.jasper文件,我们在项目中即使用.jasper文件,以加快生成速度 (省略了编译时间),但如果需要动态编译报表,那么,还是需要直接使用.jrxml文件的。有关动态编译报表的使用环境,我会在相关章节中进行说明。
按照惯例,我将先写出一个最基本的例子,能够生成一个报表,然后再对其中的代码进行详细解释。
iReport 笔记(二) iReport 的设计界面
iReport的设计界面比较简单,大家看看也就基本能够琢磨明白怎么回儿事,这里只做最简单的讲述。
最常用的两个控件分别是工具栏按钮上的
表示静态文本,用作报表中的标题、列标题等标签,
表示要显示的动态文本。将控件放置到报表上后,可以通过右键菜单“Properties”修改其属性。
其它的配合下面的例子,应该不是很难使用。
iReport 笔记(三) 使用JavaBean集合作为数据源
使用JDBC作为报表数据源其实是有很多缺陷的,例如,它要求使用SQL查询作为数据来源,但有时报表的内容并不能由一条SQL语句完成。因此,使 用JavaBean集合作为数据源才是终极的解决之道,用户只需要将数据整理到一个JavaBean集合之中就可以了,无论用什么方法,数据源为何物。
3.1 定义Bean
定义一个最简单的Bean,只包含一个属性,如下所示:
package
lld.test.ireport;
public
class
ProductBean
{
private
String productName;
public
String getProductName()
{
return
productName;
}
public
void
setProductName(String productName)
{
this
.productName
=
productName;
}
}
3.2 在iReport中设定数据源及创建报表
要在iReport中使用JavaBean作为数据源,首先要定义好Classpath,以使iReport能够找到我们定义的Bean,使用菜单 “Options”-“Classpath”定义Classpath,定义的路径为编译后的.class文件所在路径,例如,我定义的Classpath 为“D:\Work\Java\ireport_test\WebContent\WEB-INF\classes”。
在菜单“Data”-“Connections/Datasources”菜单中,添加数据源,将数据源类型设为“JavaBeans set data source”,设定的数据源属性如下图所示:
按道理而言,上图中的“Factory class”和 “The static method to call to retrieve the array or the collection of javaBeans”中,应该填写相应的工厂类及方法,然后,我们就能够在iReport集成环境中测试输出结果,但就我测试结果而言,发现在我赋上实际 的工厂类后,按下Test按钮后,总是提示“The method doen't return a valid array or java.util.Collection”。所以,我们就只把iReport作为一个报表编辑器好了,不要对它报太大奢望,毕竟不花钱,有点bug(或 者是我猪头没找对方法)也就原谅一下了。
将其设为当前数据源,然后到菜单“Data”-“Report Query”中定义需要用到的 Bean属性,在“Class name”中输入自定义Bean的名称,本例中为“lld.test.ireport.ProductBean”,然后点击“Read attributes”按钮,获取Bean属性,点击“Add Selected Field(s)”添加要用的属性,如下图所示:
秉承本人所作笔记的一贯风格,只作最主要的功能描述,用最简单的代码描述最核心的功能,因此定义的报表非常之简单,各位如果有兴趣的话,可以加上边框线之类的美化元素,如下图所示:
该文件名为report_2.jrxml,编译即可获取report_2.jasper
3.3 编程导出PDF
对于Web应用,以PDF格式导出报表是最常见的应用,另外如果是使用C/S模式的话,还可以导出来JRViewer格式。至于其它格式,例如Excel、HTML、Java2D图形等,基本上是自找麻烦,因为导出来的格式很难看,用户会有意见,不如自己去手工生成的好。
对于JavaBean集合,最终仍然要转化成为JRDataSource以供JasperReport使用,不过这个转换很简单,一行代码即足够,示例代码如下所示:
List
<?>
data
=
new
ArrayList
<?>
();
...(填充数据)
//
生成JRDataSource
JRDataSource dataSource
=
new
JRBeanCollectionDataSource(data);
下面的代码是一个生成PDF的完整示例(Servlet):
package
lld.test.ireport;
import
java.io.IOException;
import
java.io.OutputStream;
import
java.net.URLEncoder;
import
java.util.ArrayList;
import
java.util.List;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
net.sf.jasperreports.engine.JRDataSource;
import
net.sf.jasperreports.engine.JRExporterParameter;
import
net.sf.jasperreports.engine.JasperFillManager;
import
net.sf.jasperreports.engine.JasperPrint;
import
net.sf.jasperreports.engine.JasperReport;
import
net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import
net.sf.jasperreports.engine.export.JRPdfExporter;
import
net.sf.jasperreports.engine.util.JRLoader;
import
net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;
public
class
BeanReportServlet
extends
HttpServlet
{
private
static
final
long
serialVersionUID
=
348226870594216833L
;
@Override
protected
void
doGet(HttpServletRequest req, HttpServletResponse resp)
throws
ServletException, IOException
{
this
.doPost(req, resp);
}
@Override
protected
void
doPost(HttpServletRequest req, HttpServletResponse resp)
throws
ServletException, IOException
{
try
{
//
生成测试数据
ArrayList
<
ProductBean
>
data
=
new
ArrayList
<
ProductBean
>
();
for
(
int
i
=
1
; i
<=
100
; i
++
)
{
ProductBean bean
=
new
ProductBean();
bean.setProductName(
"
Product
"
+
i);
data.add(bean);
}
JRDataSource dataSource
=
new
JRBeanCollectionDataSource(data);
//
获取报表模板文件
String root_path
=
this
.getServletContext().getRealPath(
"
/
"
);
root_path
=
root_path.replace(
'
\
'
,
'
/
'
);
String reportFilePath
=
root_path
+
"
WEB-INF/classes/lld/test/ireport/report_2.jasper
"
;
System.out.println(
"
jasper file is
"
+
reportFilePath);
//
生成JasperPrint
JasperReport report
=
(JasperReport)JRLoader.loadObject(reportFilePath);
JasperPrint jasperPrint
=
JasperFillManager.fillReport(report,
null
, dataSource);
//
设定输出格式
OutputStream ouputStream
=
resp.getOutputStream();
resp.setContentType(
"
application/pdf
"
);
resp.setCharacterEncoding(
"
UTF-8
"
);
resp.setHeader(
"
Content-Disposition
"
,
"
attachment; filename="
"
+
URLEncoder.encode(
"
PDF报表
"
,
"
UTF-8
"
)
+
"
.pdf"
"
);
//
使用JRPdfExproter导出器导出pdf
JRPdfExporter exporter
=
new
JRPdfExporter();
//
设置JasperPrintList
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);
exporter.exportReport();
ouputStream.close();
}
catch
(Exception e)
{
e.printStackTrace();
}
}
}
在上例中,我生成数据源的方式很简单,只是顺序成生了100个ProductBean对象。
JasperReport生成报表时使用的参数传递方式比较奇怪,它不是使用常规的函数参数传递方式,而是需要调用相应Exporter对象的setParameter方法,设定各个参数值,怎一个BT了得,莫非是为了配合它的文档收费计划?
实话实说,上例中的好多代码也是从网上copy来的,在些感谢各位在网上无私奉献的同仁。
3.4 报表生成方式
目前我知道两种报表的生成方式,一种是使用JRPdfExporter对象,上面的例子即是使用的该方法,还有一种方法是使用JasperRunManager对象,示例代码如下所示:
byte
[] bytes
=
JasperRunManager.runReportToPdf(reportFilePath,
null
, dataSource);
outputStream.write(bytes,
0
, bytes.length);
outputStream.close();
发表评论
最近加入圈子
最新评论
-
IReport + JasperReport( ...
[u][/u][i][/i]引用[b][/b] [img][/img][u ...
-- by wqmain -
Struts2拦截器
:oops:
-- by irobot -
这就是传说中的地震
slaser 写道ddandyy 写道唯一幸运的就是中心点不是大城市...... ...
-- by slaser -
这就是传说中的地震
ddandyy 写道唯一幸运的就是中心点不是大城市......... 否则就是第 ...
-- by slaser -
这就是传说中的地震
唯一幸运的就是中心点不是大城市......... 否则就是第2个唐山
-- by ddandyy







评论排行榜