java调用报表

和帆软的FineReport有个别分歧,帆软是将报表服务器的servlet封装在了jar包中我们只供给在web.xml中引用就能够,但JasperReports就供给大家和煦来写了,思路都以同一的,直接看代码:

package net.xnzz.servlet;


import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.util.Enumeration;
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;
import net.xnzz.util.DBUtils;

public class JRPDFServlet extends HttpServlet 
{
    private static final long serialVersionUID = 1L;

    public void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException 
    {
        Connection connection = DBUtils.getDBInstance().getInitDBConnection();
        try 
        {
            //据据jasper文件生成JasperPrint对象
            ServletContext context = this.getServletConfig().getServletContext();
            String fileName = request.getParameter("fileName");//ireport编译文件:*.jasper(由模板文件*.jrxml文件编译生成)
            File reportFile = new File(context.getRealPath("/WEB-INF/jaspers/"+fileName));
            HashMap<String, Object> parameters = new HashMap<String, Object>();//给报表模板文件传参

            //得到枚举类型的参数名称,参数名称若有重复的只能得到第一个--获取页面传来的参数,和模板中文件的sql参数名称一一对应
            Enumeration<?> temp = request.getParameterNames();
               while (temp.hasMoreElements()) 
               {
                String paramName = (String) temp.nextElement();
                String paramValue = request.getParameter(paramName);
                parameters.put(paramName, paramValue);
               }
            byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters,connection);
            response.setContentType("application/pdf");
            response.setContentLength(bytes.length);
            ServletOutputStream out = response.getOutputStream();
            out.write(bytes, 0, bytes.length);
            out.flush();
            out.close();
        } 
        catch (JRException e) 
        {
            e.printStackTrace();
        }       
    }
}

思路很简短,正是经过IO流先读取到项目中的编写翻译后的.jasper文件,然后再经过JasperRunManager向客户端输出多个格式为pdf的表格文件就能够,由于参数和文书名等等都做了参数化的封装所以那么些servlet能够供全部JasperReports复用。服务器端代码达成了,上面再看一下客户端是何许调用报表的,看一下上面这段jsp代码:

<body>
    <iframe id="reportFrame" width="100%" height="88%" frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="yes"></iframe>
</body>

<script type="text/javascript">
    function getSearch() {
        var path = "${pageContext.request.contextPath}/servlet/JRPDFTYServlet?fileName=report222.jasper"
        $("#reportFrame").attr("src", path);
}

相当粗略吗!笔者这边定义了一个iframe,仅仅只要求将报表servlet路线设置给iframe的src属性就能够,当然借使报表有参数的话能够用js字符串拼接再串到servlet地址前面就能够,到此甘休全数工作就曾经完成了,最终看一下程序中的报表效果。谷歌浏览器的效力:
图片 1

IE浏览器的效果与利益:
图片 2

还不易啊~
那样的表格用户无论是打字与印刷照旧导出PDF都特别有利,关于JasperReports的牵线到此就是全数了却了,当然那只是个大要的源委,感兴趣的同班能够友善通过合克罗地亚(Croatia)语档再进一步详细学习,下载官方文书档案

到Linux公社1号FTP服务器下载

——————————————分割线——————————————

FTP地址:ftp://ftp1.linuxidc.com

用户名:ftp1.linuxidc.com

密码:www.linuxidc.com

在 2016年LinuxIDC.com\9月\Java报表学习笔记之 JasperReports & iReport\

下载格局见
http://www.linuxidc.com/Linux/2013-10/91140.htm

——————————————分割线—————————————— 

总结

轻易记录一下JasperReports以及它的可视化报表编辑器——iReport的应用方法,希望对那上头感兴趣的同窗有所辅助,
The End。

正文永远更新链接地址:http://www.linuxidc.com/Linux/2016-09/135551.htm

图片 3

图片 4

图片 5

其余报表都是页面包车型地铁款型展现,因而作为壹个平凡的功用模块,报表中的数据能够导出为Excel、Word、PPT、PDF等格式的公文物保护留。

Detail 1

是的,那个区域正是报表的主数据体现区,首先依次将Text Field拖放至Detail
1区并和列头对齐,然后设置边框,效果如下:
图片 6

能够看来各种Text
菲尔德都有三个暗中同意值$F{field},那些是怎么样意思吧?大家在法定文书档案中得以找到答案:
图片 7

没错,$F是引用二个域(田野)的情致,那怎么又是Fields?综上说述,大家刚刚写查询SQL语句再次来到的查询结果的每一列就是多个菲尔德,那点大家也能够在左侧的Inspector区中看到:
图片 8

有了这么些概念接下去的难点就轻便了,大家只须求依照田野同志name来所有人家修改每二个Text Field里的表明式就能够,比如修改准考证号这一列:
图片 9

上边是修改好的简短浏览一下:
图片 10

有几点要求注重注意一下:

  1. 率先点也是最要紧的一点在上海体育场面已经注解了,正是Detail
    1区域的冲天要和Text
    菲尔德的行高保持一致,那样循环行生成报表的时候才会并未有行间距。
  2. 富有蕴涵普通话的Text 菲尔德或Static
    Text都须求统一安装中文字体(STSong-Light)和国语编码(UniGB-UCS2-H
    (Chinese Simplified))。
  3. 鉴于我们尚无用table组件而是用三个个的Text
    Field拼成的表格所以最佳放大看一下面框细节和对齐细节等等:
    图片 11
  4. 集结安装富有Text Field和Static
    Text的原委对齐格局,最佳是程度居中(图片 12)和垂直居中(图片 13)。
  5. 还应该有一个亟需注意的内情便是纵然SQL语句询问为空的字段要是不做拍卖那么暗中认可在表格中会展现NULL,所以不太美丽,但消除方案也很轻便,正是将装有极大希望出现空值的格子(Text
    Field)均安装为Blank When Null,即:为null时用空格子替代:
    图片 14
  6. 末段应当在iReport中预览一下报表效果,点击Peview步向预览视图:
    图片 15
    下一场就可以看到大家的表格预览效果了:
    图片 16

完全还算完美呢!预览的同不经常间注意一下底层的iReport
output窗口,可以见到这么的提示新闻:
图片 17

是的,是对源文件report1.jrxml张开了编写翻译而生成了report1.jasper文件,在JasperReports中,jrxml是源文件,而能运转的则是源文件编写翻译后的jasper文件。大家预览的还要会活动编写翻译,当然在编写源文件的同时我们也足以手动编写翻译,编写翻译开关在此间:
图片 18

再回过头来看预览的报表,注意到序号这一列乱掉了,由于大家的SQL是比照准考证号asc升序排列,所以用Oracle的rownum做序号就如有个别不合适,不过没什么,iReport也自带了临近的序号成效!大家透过丰盛变量(Variables)来完毕。首先大家要求先创设多个新的变量,在左臂的Inspector区域找到Variables并new一个Variable命名字为rownumber:
图片 19

至于变量(Variables)大家得以在合意大利语档的Chapter 6中找到它的有关表明:
图片 20

率先我们定义这一个变量的门类为java.lang.Integer,Caculation设置为Count,Reset
type设置为Report:
图片 21

可以看到Reset type设置为Report时变量只会为起先化1次,并且是运用intital
value expression的值作为初阶值,那么我们将intital value
expression设置为1就能够,如下图:
图片 22

最后设置变量表明式(Variable
Expression)为$V{rownumber}.valueOf(1)就可以。未来涂改序号的Text
Filed,将本来援用域改为援用变量rownumber,之后再度预览看看效果:
图片 23

能够看到序号可以平常展现!至此大家的报表部分正是开荒成功了,接下去看看如何在Java程序中调用报表。

留心:从大纲视图中大家开掘,二个表格满含众多确定地点的面板。在每三个报表中标题和汇总面板只打字与印刷贰回,页眉和页脚在表格的每一页都会单独打字与印刷。大家得以平昔在田野同志中新添、删除字段,还是可以将字段拖拽到报表的内部原因面板中,JasperStudio将会为大家成立三个文件字段(text
田野)成分,并安装其值为对应字段的数据。文本字段不应出现在除细节面板之外的别的地点。

解决方案一:

参考:
  1. Hap
    报表处理
  2. UReport
    合英文档

Column Header

看完了Page Header,接下去就是Column
Header了,那一个区域平常会放列头,所以也应有是静态文本,那几个表格的报表小编从没用table控件去做,而是通过多少个Static
Text和Text Field拼成的报表,如下图所示:
图片 24

ireport自带的拖动对齐线能够方便的让大家将控件拖拽至适宜的地点,满含调治它们的深浅,当然也足以透过Ctrl+鼠标左键选中多少个控件来为它们设置同一的属性值,关于Static
Text或Text
Field的边框(border)必要注意一下,因为在品质面板中并无法找到它们,我们须要选中央调节件然后点击鼠标右键在弹出的“Padding
and Borders”中来设置边框,如下图所示:
图片 25

咱俩逐条点击Borders中的4条边,然后将Line
width设置为1就能够,未来大家就足以观察边框了:
图片 26

配备并采取数据适配器之后,大家需求钦赐数量查询的语句,该语句询问出的字段将一贯用来报表中的数据字段。本例中我们选出city表中的全数字段:

方案二:

付出步骤

Create DataSource

到此结束大家的报表中有所静态的剧情主导算是顺理成章了,接下去便是注重的动态变化的一部分了,由于连串的悠久层接纳的是MyBatis框架,所以在这里大家采取SQL作为Query
language。首先需求认可数据源,最起始已经涉及了DB数据源设置的地方,点击那一个Logo:
图片 27

以后大家会映爱慕帘如下窗口:
图片 28

能够观察上海体育场所便是用来创建数据源的面板,前七个是ireport提前成立好的贰个空数据源和二个Sample数据源,第一个是本人早就创建好的,笔者在此间再度再成立叁个新的数据源,点击New:
图片 29

能够见到上海体育场所中提供了特别充分的数码源类型,诸如:JDBC、Hibernate、EJB等等,由于笔者的品种中的持久层用的是MyBatis框架,所以在那边采取第八个——Database
JDBC connection即可,然后点击next:
图片 30

确定,采取JDBC
Driver并逐条输入U翼虎L、Username和Password,最终点击Test,倘诺提醒成功,那么大家的数据源就算成功创制好了,接下去就可以写报表的查询语句了。

首先点击“New”,在弹出的向导页中选拔“Database JDBC
Connection”,然后点“Next”弹出下图所示的页面:

图片 31

报表定义

  1. 基本功配置
    报表编码: 不与已定义的表格重复就可以
    报表文件: 选用报表设计中生成的XML文件
    报表名称、报表描述: 本人定义
    点击保存
  2. 增加询问控件
    点击报表参数下的编排按键,进入查询控件添加分界面
    unitId对应输入框
    ,startDate、endDate对应日期框,分别从字段名下拉框选用在数额集定义中定义的参数,行号为控件出现的次第,保存,点击预览。
![](https://upload-images.jianshu.io/upload_images/2360626-7502958aae72e1dc.png)

配置查询控件.png

前言

聊起Java报表工具,我接触过的唯有FineReport(帆软)和JasperReports,那七个都用过,帆软是收取金钱的而JasperReports是无需付费的,首先第一认为帆软功能庞大,扶助导出的表格格式丰富,然则坑相当多(二个格子的属性设置不对全体表格都会乱掉,比如左父格什么的,并且有的时候一些些数据测量试验是没难点但数据量一大报表就乱掉了,不管什么样原因引起,首先那就一向造成不便于觉察标题,二〇一八年项目上线后就被那样坑过一遍),再来谈谈JasperReports,开源无需付费,使用方面和帆软比是比不上它强大,不能够导Excel,平常状态下只用来导PDF,但在大部情景下或许能知足要求的,终归无需付费的无法要求太高哈,So,本篇blog就总括一下JasperReports以及iReport的利用方法和细节。

在接下去的课程中,大家将促成贰个大致的JasperReports示例,表现其宗旨的开销、使用流程。小说十分短,可是是以图表居多,文字并相当少。

把每一页的内容单独置于二个子表格上,然后父表去调用6个子报表。每个子表前放三个分页符。那样算是圆满化解难题了。

上边以叁个简单易行报表的演示介绍Hap报表开采的流水生产线:

下载iReport

地方如下:

作者们能够看到眼下法定首要推荐的可视化报表设计工具是Jaspersoft
Studio(基于Eclipse),初期的iReport从5.5以往就不再提供立异了,但后边一贯用的是iReport开荒报表所以本篇blog就依据iReport那几个工具进行开拓,个人认为照旧蛮好用的(联想到了当时用Eclipse开垦Android打死都不换Android
Studio T_T),大家平素下载iReport
Designer可视化编辑器就能够,如下图所示:
图片 32

自然还非得要有JasperReports
Library技能经过Java程序来调用报表,由于只是二个jar包所以笔者就一直上传到CSDN供我们下载了,作者使用的版本是jasperreports-5.6.1,下载地址:

下载安装之后就能够行使它来创立报表文件了。

图片 33图片 34决不使用jsdperreports
6.4.3,因为spring-webmvc合作不上,会招致html格局失利

图片 35 本文用菊子曰发布

事务供给

图片 36

报表须要.png

该报表以订单头表为底蕴,关联了区域表等表。
里面,还要能够依照订单头表的事情实体字段,日期字段进行询问。

Page Header

标题相当粗略,接下去是页头,大家得以在页头放一些通用属性,诸如:学校、班级消息等等,如下图所示:
图片 37

笔者们在页头(Page
Header)中放了学院、班级和岁月,能够看到大家用了6个控件,3个Static
Text和3个Text Filed,就如之前说的,Static Text用来放静态文本,而Text
Filed用来放动态表明式,学校和班级是大家在DB中查出来的(前面再细说),而时间这里用了多少个动态表明式来成功,如下图:
图片 38

关于Expressions(表明式)是贰个值得深入商量的话题,iReport为我们提供了各类类型的表明式,比如:
图片 39

此处看到了作者们杰出纯熟的Java代码,Java语言约等于iReport官方推荐的首先言语(就算还帮衬Groovy、Javascript语言的表达式):
图片 40

iReport为大家提供了增加的表明式语法,上海教室能够看来依旧席卷三目表明式,能够让大家有利的展开有关操作,比如上边包车型客车设置钦点格式时间并出口:
图片 41

如此那般大家就足以把近来光阴根据钦定的格式突显在表格中了。

选择“SampleDB – Database JBDC Connection”,那是Jaspersoft
Studio安装时提供的三个示范数据库。

教客户采纳时又发掘难题了,因为是行使图片 42付出和调节和测量检验的,不过到了事实上的打字与印刷机上分页效果不均等。

报表设计

报表设计中的数据源包括数据库连接、Spring
Bean连接,内置数据源连接二种,本次开荒用到的是置于数据源连接,三者的界别参见UReport文书档案
报表存款和储蓄与数据源配置。
统一打算报表的率先步是开创数据集,数据集类似于数据库中央广播台图的定义,三个数据源可以涵盖多个数据集,完成本次要求能够挑选布署四个数据集(如区域表),在表格设计时开始展览关联,具备异常的大的灵活性,也足以定义三个数据集,在SQL中实行关联,开采难度非常的低,本次选拔了第二钟情势。

  1. 凭仗所需的字段编写基础的SQL

SELECT
 to_char(oooh.booked_date, 'yyyy-mm-dd') AS booked_date,
 oooha2.delivery_date,
 oooha2.suit_count,
 oooh.customer_po_number,
 ooot.order_type_name,
 oooha2.order_amount,
 mct.territory_name,
 mcra.region_name,
 mcra2.region_name city
FROM oms_oe_order_headers oooh
JOIN (
  SELECT 
    oool.header_id,
    oooha.suit_count,
    MIN(oool.delivery_date) delivery_date,
    ROUND(SUM(oooha.suit_count * oool.ordered_quantity * oool.unit_price),5) order_amount
   FROM oms_oe_order_lines oool
  JOIN oms_oe_order_header_atts oooha ON oool.header_id = oooha.header_id
  GROUP BY (oool.header_id, oooha.suit_count)
) oooha2 ON oooh.header_id = oooha2.header_id 
LEFT JOIN mdm_cust_territories mct ON oooh.territory_id = mct.territory_id 
LEFT JOIN oms_oe_order_types ooot ON oooh.order_type_id = ooot.order_type_id
LEFT JOIN mdm_cust_account_sites_all mcasa ON mcasa.account_site_id = oooh.account_site_id 
LEFT JOIN mdm_cust_regions_all mcra ON mcasa.province = mcra.region_code
LEFT JOIN mdm_cust_regions_all mcra2 ON mcasa.city = mcra2.region_code
  1. 布局数据源,生成数据集
    ${}回来的是一个sql字符串,个中能够使用UReport中的全数函数,类似与Mybaits的SqlProvider,建议用sql压缩工具对上述sql代码举办削减,
    删除多余的空格,
    否则编辑器恐怕出现不可能甄别字符串换行的主题素材,专注对字符串中的引号举行转义
    以下为示范代码。

${
  "SELECT to_char(oooh.booked_date, \'yyyy-mm-dd\') AS booked_date, oooha2.delivery_date, oooha2.suit_count , oooh.customer_po_number, ooot.order_type_name, oooha2.order_amount, mct.territory_name, mcra.region_name AS province , mcra2.region_name AS city FROM oms_oe_order_headers oooh JOIN ( SELECT oool.header_id, oooha.suit_count, MIN(oool.delivery_date) AS delivery_date , ROUND(SUM(oooha.suit_count * oool.ordered_quantity * oool.unit_price), 5) AS order_amount FROM oms_oe_order_lines oool JOIN oms_oe_order_header_atts oooha ON oool.header_id = oooha.header_id GROUP BY (oool.header_id, oooha.suit_count) ) oooha2 ON oooh.header_id = oooha2.header_id LEFT JOIN mdm_cust_territories mct ON oooh.territory_id = mct.territory_id LEFT JOIN oms_oe_order_types ooot ON oooh.order_type_id = ooot.order_type_id LEFT JOIN mdm_cust_account_sites_all mcasa ON mcasa.account_site_id = oooh.account_site_id LEFT JOIN mdm_cust_regions_all mcra ON mcasa.province = mcra.region_code LEFT JOIN mdm_cust_regions_all mcra2 ON mcasa.city = mcra2.region_code where 1=1 " 
}

分级增添查询参数,可以为查询参数钦定私下认可值

图片 43

充分查询参数.png

以工作实体为例,能够通过:unitId在sql中赢得查询参数的值,
注:查询参数最终以询问字符串的款型拼接到报表页面UCRUISERL前边

${
  "SELECT to_char(oooh.booked_date, \'yyyy-mm-dd\') AS booked_date, oooha2.delivery_date, oooha2.suit_count , oooh.customer_po_number, ooot.order_type_name, oooha2.order_amount, mct.territory_name, mcra.region_name AS province , mcra2.region_name AS city FROM oms_oe_order_headers oooh JOIN ( SELECT oool.header_id, oooha.suit_count, MIN(oool.delivery_date) AS delivery_date , ROUND(SUM(oooha.suit_count * oool.ordered_quantity * oool.unit_price), 5) AS order_amount FROM oms_oe_order_lines oool JOIN oms_oe_order_header_atts oooha ON oool.header_id = oooha.header_id GROUP BY (oool.header_id, oooha.suit_count) ) oooha2 ON oooh.header_id = oooha2.header_id LEFT JOIN mdm_cust_territories mct ON oooh.territory_id = mct.territory_id LEFT JOIN oms_oe_order_types ooot ON oooh.order_type_id = ooot.order_type_id LEFT JOIN mdm_cust_account_sites_all mcasa ON mcasa.account_site_id = oooh.account_site_id LEFT JOIN mdm_cust_regions_all mcra ON mcasa.province = mcra.region_code LEFT JOIN mdm_cust_regions_all mcra2 ON mcasa.city = mcra2.region_code where 1=1 " + 
  (param("unitId") == null || param("unitId") == "" ? "" : "and oooh.unit_id = :unitId ") +
  (param("startDate") == null || param("startDate") == "" ? "" : "and oooh.booked_date > :startDate ") +
  (param("endDate") == null || param("endDate") == "" ? "" : "and oooh.booked_date < :endDate ") +
   "order by oooh.booked_date asc" 
}

点击保存开关,将统一筹划的报表以XML的格式保存进数据库
数据集SQL编写成功后得以点击数据预览进行简短检查

  1. 将数据集放到表格中
    第一行设置报表的表头,第二行通过UReport
    数据集表明式选拔相应的字段,采取单元格,在数据集中对应的字段商双击就可以,选拔单元格可感到单元设置字体、前景象、背景观等体制。
![](https://upload-images.jianshu.io/upload_images/2360626-2147f2386e6c71ec.png)

调用数据源.png

在意:单元格有左父格和上父格的定义,单元格暗中同意随父格张开,单元格私下认可的集聚格局为分组。

图片 44

A2单元格默许集中.png

将A2单元格聚集格局调解为列表,操作如下图所示:

图片 45

切换为列表.png

图片 46

A2单元格分组集中.png

Title

留心一下那边最常用的两个零件正是Static Text和底下的Text Field了,Static
Text平日用于放静态文本,举例:标题、列名等等,而Text
Field日常用来放动态的表达式,举例数据库的询问结果,函数等等。上面从组件面板中拖动Static
Text到编辑区的Title中:
图片 47

如图上边的一排工具栏能够设置组件内容的对齐情势以及字体样式等等,但越多处境下我们依旧会在品质面板来设置那几个:
图片 48

有关属性这里有至极首要的一些就是要安装报表字体和编码,将品质面板滑动到底层可以看来这两特特性:
图片 49

如上图,因为大家的标题是华语,所以大家必须安装为汉语字体和编码:

  • STSong-Light
  • UniGB-UCS2-H (Chinese Simplified)

惟有如此我们在报表中本领正确显示普通话,包蕴后边全体包涵中文的控件都亟需此设置。

图片 50

抑或利用“自定义”纸张,采取“海报”格局打字与印刷,PDF会自动把一张不长的页面包车型客车剧情拆分到七个A4页面上,须求细心调节每页的开始和结果。

Report Query

首先大家供给通晓在哪个地方输入查询SQL,点击如下图标志的按键:
图片 51

然后就足以见到Query窗口了:
图片 52

如上图,大家勾选Automatically Retrieve
Fields之后,当我们输入完SQL语句后在上边会自行取回查询结果的有着列,同有的时候候大家在尾部能够观望数据预览:
图片 53

如此报表的查询SQL尽管成功完结,最后大家依据列名依次把每二个放置在表格Detail
1区域的Text Field中就可以。

图片 54

方案三:

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注