JasperReport的使用

环境和工具

在java7和java8两个环境上分别进行了测试,不同的java版本,对jasperreports版本的要求不同。
涉及工具包括:jasperreports 5.6、jasperreports 6.7、ireport 5.6、jaspersoftstudio

版本的工具对应情况

Java7:jasperreports 5.6  ireport 5.6,如果选择用jaspersoftstudio进行表格编辑是可用的,但是需要在ireport 5.6中编译得到*.jasper文件。
Java8:jasperreports 6.7jaspersoftstudio,工具上是可以兼容java7用到的工具的。

JasperReports介绍

JasperReports是一个基于Java的开源报表工具,它可以在Java环境下像其它IDE报表工具一样来制作报表。JasperReports 支持PDF、HTML、XLS、CSV和XML文件输出格式。JasperReports是当前Java开发者最常用的报表工具。

(1)新建报表

【File】——【New】——【Jasper Report】


新建报表

选择一个模板:


选择模板

填写报表名称,如“Blank_A4_1.jrxml”,点击“Finish”。


报表名称

(2)界面说明

界面区域
  • 区域1:数据源编辑区域,用于选择使用的数据源;
  • 区域2:报表内容列表,包括报表所有的Dataset、Fields、Parameters、分区域放置的组件等信息;
  • 区域3:可视化报表内容;
  • 区域4:组件列表;
  • 区域5:属性编辑区域。

(3)报表文件的外部调用

JasperReports的几种文件格式:.jrxml、.jasper,其中.jrxml为编辑文件,.jasper为编译后的文件。当完成报表编辑后,执行编译,可生成*.jasper文件,当报表被外部调用时,相关的方法会将jasper文件路径作为参数。

//读取*.jasper文件
File reportFile = new File("D:/test.jasper");
if (!reportFile.exists())
    throw new JRRuntimeException("File WebappReport.jasper not found. The report design must be compiled first.");
System.out.println(reportFile.getPath());
//JasperReport jasperReport = (JasperReport)JRLoader.loadObjectFromFile(reportFile.getPath());
System.setProperty("java.awt.headless", "true");

JasperReport jasperReport = null;
jasperReport = (JasperReport)JRLoader.loadObjectFromFile("C:/Users/nanhao/JaspersoftWorkspace/MyReports/StationDailyTable.jasper");
Connection conn = DBUtils.getConnection();
//定义参数
Map params = new HashMap();
String Ex_Year = new String("2018");            
String Ex_Month = new String("08");         
String Ex_Day = new String("08");           
String Ex_Month_Eng = new String("Aug");
params.put("Ex_Year", Ex_Year);
params.put("Ex_Month", Ex_Month);
params.put("Ex_Day", Ex_Day);
params.put("Ex_Month_Eng", Ex_Month_Eng);
//String file = JasperRunManager.runReportToHtmlFile("D:/test.jasper", params, conn);
//根据模型填写报表参数,注意要传入数据库连接,这样可以执行写在jasper模型里的sql语句
JasperPrint jasperPrint = 
    JasperFillManager.fillReport(
        jasperReport, 
        params, 
        conn
        );
//输出html
HtmlExporter exporter = new HtmlExporter();
req.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
SimpleHtmlExporterOutput output = new SimpleHtmlExporterOutput(out);
output.setImageHandler(new WebHtmlResourceHandler("image?image={0}"));
exporter.setExporterOutput(output);

(4)java调用时,需要的jar包

commons-beanutils-1.8.0.jar
commons-collections-3.2.2.jar
commons-digester-1.7.jar
commons-javaflow-20060411.jar
commons-logging.jar
groovy-all-2.4.7.jar
iText-2.1.7.jar
iTextAsian.jar
iTextAsianCmaps.jar
jackson-core-2.3.2.jar
jackson-databind-2.3.2.jar
jasperreports-5.6.0.jar
jasperreports-6.7.0.jar
jasperreports-applet-5.6.0.jar
jasperreports-fonts-5.6.0.jar
jasperreports-fonts-6.7.0.jar
jasperreports-javaflow-5.6.0.jar
jasperreports-javaflow-6.7.0.jar
jcommon-1.0.15.jar
jfreechart-1.0.12.jar
jxl-2.6.jar
说明:5.6.0和6.7.0按版本选取。

基于数据集制作报表

(1)单一数据集的情况

单一数据集就是整张报表就用到一个SQL查询,得到一个大的数据集,我们可以叫它Main Dataset。这个数据集全表只有一个,Main Dataset绑定的查询语句是报表首先执行的查询。
Main Dataset设置的位置在主界面编辑去上方,点击打开Dataset and Query edit dialog,在里面填写SQL查询语句。


检索出的各个字段信息会出现在窗口中,Main Dataset会将检索出的字段放到Fields中。Fields中的字段可用用于报表数值展示(后文介绍)。


6.png

下面列表中点页签“Data Preview”则可预览检索数据。

(2)多个数据集的情况

当报表生成需要多条SQL查询语句才能实现,或者报表格式复杂时,则需要对应多个Dataset实现功能。通常每个Dataset都要配合Table组件一起使用。
每个Table组件可用绑定一个Dataset,每个Dataset用一条Query语句查询,查询的结果字段又会放到Fields中以便进行数据展示。其关系如下图:


Dataset关系图

每个Dataset中都包含局部有效的Query、Fields以及Parameters(Parameters后文详细说)。
了解这个结构有助于后面理解参数传递的过程。

主界面各区域的功能

只说明一下用到的几个:Title、Column Header、Detail
其中Title、Column Header用于显示表名和列名,用Static Text组件就可以,配置上可使用“Title On A New Page”,决定是否在出现翻页时候重复Title。Detail则用于放置报表数据,是核心部分。
对于Detail,需要详细说明一下。
Detail有个性质是会自动循环打印Main Dataset中的查询结果,如果整个报表是单一数据集的情况,在此区域放置TextField组件,关联对应的Fields,就可以实现查询结果的自动填充,就像下图:


TextField

展示效果:


展示效果

但是如果报表含有多个Table,就会有一个问题,即Detail区域中Table显示内容会出现重复。产生的原因在于Main Dataset的查询结果会对Detail中元素重复次数产生影响。举个例子,如果Main Dataset的Query检索出了5条记录,那么Detail会进行5次重复,此时若在Detail区域中放了Table组件,则Table中也会被重复5次。所以,解决这个问题的方法就是在含有多个Table的报表的情况下,在Main Dataset写一个Query,使其返回记录只有1条,如此就不会出现Table内容的重复了。

Table组件的几个介绍

(1)Table和Dataset

JasperReports对于多数据集形成报表比较方便就体现在Table组件上,当简单的查询不能满足报表数据情况下,应选择Table-Dataset的模式。
用一个简图说明Table和Dataset的关系:


Table和Dataset

流程描述:
加Table组件到Detail区域→新增Dataset→编写SQL查询语句→选择需要加入到Fields的字段→Dataset分组(可忽略)→选择表格显示的列(可在Fields中挑选)→显示表格
说明:建议Fields选择字段大于表格显示列的内容,比如一条查询语句检索了id、name、score,列表中不现实id,但可用将id加到Fields中,这样方便出现问题后的调试。

(2)参数传递

当报表被外部程序调用时,如何传递参数?
先说Parameters,由上图可知,每个Table都有对应的Dataset,Dataset中包含Query语句和Parameters参数,其中Parameters中的参数可用实现将外部数据传递到Query语句中,举个例子说明:
如果在Dataset中写一条Query语句:select * from table2018;
其中的‘2018’想作为参数传递进来,那么需要新建一个parameter,取名叫做Year,之后将Query语句改写为:select * from table$P!{Year}
在Outline中的Parameter列表点右键,选择Creat Parameter,之后重命名即可定义Parameter,如下图:

通过这一步就实现了Parameter对Query的赋值,那么谁为Year赋值呢?
在Main Dataset中对应的增加一个Parameter,取名叫做Ex_Year,之后设置Year的表达式为$P{Ex_Year},即可实现Year的赋值。
左键点击Outline中的Table,在右侧Properties窗口配置参数,选择Dataset页签,下面有Parameter按钮,点击后,可进行parameter设置。


点击Parameters按钮,进行参数编辑。


Ex_Year的值可有外部程序实现赋值。(代码后面)
流程可简化描述为下图:


参数传递流程

(3)多行合并的报表

有些报表结构比较复杂,存在多行合并的情况,如下:


多行合并

此类报表制作过程需要有前提条件:一是明确树结构,保证列内容的从属关系是清晰的,数据库可检索;二是最后检索内容要按照列内容依次排序。
Jasperreports在做多行合并时,并非是真正将多个行合并为一个,而是通过更改表格属性,使其不打印重复内容,具体操作是:
双击Table组件,进入Table编辑界面;


点击表格中的TextField组件,并查看属性(可放大右下角属性编辑区域),去掉“Properties”页签下“Style and Print Details”的“Print Repeated Values”。



这样重复的信息将不再打印,但是表格边框也不会打印!所以需要调整TextFields的边框,只保留上、左、右,在属性列表中选择Borders页签,可用设置边框。同理,设置Table中表格的边框,只保留左、右;



这样设置后依旧会存在一个问题,最后的一行会没有下边线,解决方法就是在Table组件最下边加一个StaticText组件,删除文字内容,只保留上边框。

HTML生成的补充说明

(1)图层的说明:

图层说明

上图表示了带table组件情况下,各个元素的层级关系。
首先table中TextField的配置:
在Properties中的Color选项内可设置前景色、背景色和透明,在border中可设置线色。


Table组件的颜色在table的Properties内设置
前景色、背景色以及透明需要在inheritance页签中,查看Table所属的Style,然后在修改Style的属性。




Report默认背景为白色,但输出网页时往往需要根据需求改变颜色,所有在生成jasper模板时,应当不强制背景色为白色,设置位置为【Project】——【Properties】,之后弹出窗口如下图:



在Jaspersoft Studio——Exporters——HTML Exporter中去掉“White Page Background”
之后再代码中可更改html页面的风格,代码举例:

//修改html配置信息///////////////
SimpleHtmlExporterConfiguration config=new SimpleHtmlExporterConfiguration();
String header = 
    "\n" 
    + "\n" 
    + "  \n"
    + "  \n"
    + "  \n";
config.setHtmlHeader(header);
config.setBetweenPagesHtml("");//设置每页之间没有空行*/
//更改配置,输出到网页
exporter.setConfiguration(config);

(2)去除页间空白

因为Report默认都是有背景纸张的,所以当报表内容过多时,报表会自动翻页,如此页与页之间会有空白部分,同时在报表最后一页如果内容未占满,默认还是会补充大片空白。这种情况下将报表输出到html页面效果就很差,可采用以下手段:

  • 表头不在新一页重复
    在报表属性中,去掉“Title On A New Page”
  • 忽略页面间空白
    在报表属性中,勾选“Ignore Pagination”
  • 最后一页不留空白
    调整界面Detail的下边界,使之与Detail中最下面的组件的下边线重合即可。

你可能感兴趣的:(JasperReport的使用)