Java开源报表JasperReport、iReport4.5.1使用详解(二)

2024-05-16 01:32

本文主要是介绍Java开源报表JasperReport、iReport4.5.1使用详解(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 上一节,我们介绍了Java开源报表JasperReport、iReport4.5.1使用详解(一) JasperReport、iReport4.5.1这两款开源软件,本节来个例子,实战下。

    一.数据源设计

    图1-1

    打开上图中红色部分所示:进行当前报表的数据源的设计,我们本节写的是Sql语句

    图1-2

    选择OK 之后,此语句涉及的字段都会显示在Fields下面:

     

    图1-3

    二.报表的结构介绍

     

    图1-4

    报表的结构包括如下部分:Title、Page Header、Column Header、Detail、Column Footer、Page Footer、Summary.下面一一的介绍各个部分。

    Title:为报表的标题部分,如果报表有多页,则只显示在第一页。

    Page Header :为报表每页的一个头部名称,如果报表有多页,则每页都会显示。

    Column Header:可以理解成表头,如果报表有多页,则每页都会显示。

    Detail:详细记录,迭代列出所有的查询结果,有多少数据都会显示出来(分页)。

    Column Footer:相当于表尾,如果报表有多页,则每页都会显示。

    Page Footer:与Page Header对应,每页都会显示。

    Summary:报表的一些统计信息。比如共有多少页,当前是第几页等信息。

    三、接下来,我们试着制作一份报表出来。

    改报表的要求是:列出所有用户的信息,(查询语句决定。)

    我们从组件面板中,拖出一个 Static Text 组件来,放置在报表的Title部分,输入“用户账户清单”。

     

    在Page Header 也同样拖入一个 Static Text 组件,输入“管理员”

    展开左侧的 Report Inspector,展开Fields子项,将图1-3所示的字段,拖入Detail项中,此时会发现,Column Header项中自动填充了Static Text的表头,也可以对表头进行编辑,重命名等操作。可以调整各组件的位置、大小等信息。

    如图所示:

     

    图3-1

    预览,选择Preview (图3-1红色框部分)即可。

    结果如下图所示:

     

    图4-1

    生成的文档信息如下:


     Compiling to file... G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.jasper  
    Compilation running time: 297!   Filling report...  Locale: 中文 (中国)  Time zone: Default  
    Report fill running time: 203! (pages generated: 2)   Exporting PDF (using iText) to file... G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.pdf!  
    Export running time: 94!   
    Executing: "E:\Adobe\Reader 10.0\Reader\AcroRd32.exe" "G:\Jaspersoft\iReport-4.1.1\ireport\fonts\report1.pdf" 

    与此同时,会自动弹出一个report1.pdf的文档,注意,这里可能有些同学会出现中文显示不了的情况,这里需强调一下的是,要想显示中文,需要需要进行一些配置

    在iReport的classpath里面导入包含了中文的字符的jar文件,还有供Pdf使用的字符jar包。

    工具-->选项-->font

    如果没有,则需加入到classpath中

    图4-1-1

    也可以添加自己所需要的字体。

    iTextAsian.jar的最新的jar包可以到下面的地址下载。

    http://sourceforge.net/projects/itext/files/extrajars/

    包含在 extrajars-2.2.zip 中

    图4-1-2

    文本框默认的是:SansSerif字体,需要改成我们中文的字体

     

    图4-1-3

    关于字体的安装,后面的部分会介绍到。

    本节我们将介绍,导出成Html、Excel、Pdf、以及从Scriptlet获取数据。

    一、导出成Html方式

    ①首先建立一个 web project

     

    图1.1.1

    ②导入相应的jar包到工程里面

    jasperreports-4.5.1\dist 下面所有jar包,共4个

    jasperreports-4.5.1.jar

    jasperreports-applet-4.5.1.jar

    jasperreports-fonts-4.5.1.jar

    jasperreports-javaflow-4.5.1.jar

    然后是jasperreports-4.5.1-project\jasperreports-4.5.1\lib 下面 com开头的所有jar包

    commons-beanutils-1.8.0.jar

    commons-collections-2.1.1.jar

    commons-digester-2.1.jar

    commons-javaflow-20060411.jar

    commons-logging-1.1.1.jar

    ③将我们第二节中生成的jasper 文件复制进我们的web目录下面

    ireport\fonts\report1.jasper

    ④编写jsp测试页面:


    <%@ page contentType="text/html;charset=utf-8"%>
    <%@ page import="net.sf.jasperreports.engine.*"%>
    <%@ page import="java.util.*"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%  
    String ctxpath = request.getContextPath();  
    Class.forName("net.sourceforge.jtds.jdbc.Driver");  
    String url="jdbc:jtds:sqlserver://server:1433/pcbsyn";  
    String user="sa";  
    String password="711";  
    Connection conn= DriverManager.getConnection(url,user,password);  
    //ireport生成的.jasper文件的存放位置,这里为了方便放置在根目录下面  
    File reportFile = new
    File(this.getServletContext().getRealPath("/report1.jasper"));  
    Map parameters = new HashMap();  
    try {  
    //执行报表程序  
    JasperRunManager.runReportToHtmlFile(reportFile.getPath(),parameters, conn);  
    response.sendRedirect(ctxpath+"/report1.html"); 
    }  
    catch (Exception e) {  
    System.out.println( e.getMessage() );  
    }  
    finally {  
    try {  
    conn.close();  
    }  
    catch (Exception ex) {  
    System.out.println( ex.getMessage() );  
    }  }  
    %>

    图1.4.1

    页面报错:

    java.lang.NoClassDefFoundError: org/codehaus/groovy/control/CompilationFailedException

    解决办法:导入lib下面的groovy-all-1.7.5.jar 包即可解决问题。

    这个是html的页面。

     

    二、导出成Pdf方式。

    ①建立generatePdf.jsp文件


    <%@ page contentType="text/html;charset=utf-8"%>
    <%@ page import="net.sf.jasperreports.engine.*"%>
    <%@ page import="java.util.*"%>
    <%@ page import="java.io.*" %>
    <%@ page import="java.sql.*" %>
    <%  
    //报表编译之后生成的.jasper文件的存放位置  
    File reportFile = newFile(this.getServletContext().getRealPath("report1.jasper"));  
    String url="jdbc:jtds:sqlserver://server:1433/pcbsyn";  
    Class.forName("net.sourceforge.jtds.jdbc.Driver");  
    Map parameters = new HashMap();  
    Connection conn = DriverManager.getConnection(url, "sa",  
    "711");  
    byte[]  
    bytes=JasperRunManager.runReportToPdf(reportFile.getPath(),parameters  
    ,conn);  
    response.setContentType("application/pdf");  
    response.setContentLength(bytes.length);  
    ServletOutputStream outStream = response.getOutputStream();  
    outStream.write(bytes,0,bytes.length);  
    outStream.flush();  
    outStream.close();  
    out.clear();  
    out = pageContext.pushBody();  
    %>

    运行
    http://localhost:8080/IreportTest/generatePdf.jsp
    之后报错:

     

    org.apache.jasper.JasperException: net.sf.jasperreports.engine.JRRuntimeException: Could not load the following font :   
    pdfFontName   : Helvetica  
    pdfEncoding   : UniGB-UCS2-H  
    isPdfEmbedded : true  org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491)  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)  org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)  org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)  javax.servlet.http.HttpServlet.service(HttpServlet.java:717)  

    出现这个错误主要是因为:没有导入iTextAsian.jar、iTextAsianCmaps.jar

    解决办法:

    1.导入iTextAsian.jar、iTextAsianCmaps.jar 包

    2.设置字体属性如下图所示:

    图2.1

    注意:如果使用的是自定义的字体,也就是自己安装的字体,则需要导入相应字体的jar包 本人使用的是simfang.jar。

     

     

    图2.2

    三、导出成Excel格式:

    测试代码如下:


    import java.io.File;  
    import java.io.FileOutputStream;  
    import java.sql.Connection;  
    import java.sql.DriverManager;  
    import java.util.HashMap;  
    import java.util.Map;  
    import net.sf.jasperreports.engine.JRAbstractExporter;  
    import net.sf.jasperreports.engine.JRExporterParameter;  
    import net.sf.jasperreports.engine.JasperFillManager;  import net.sf.jasperreports.engine.JasperPrint;  
    import net.sf.jasperreports.engine.export.JExcelApiExporter;  publicclass TestExcel {  
    publicstaticvoid main(String[] args) {  File reportFile = new File(  
    "WebRoot\\report1.jasper");  Map parameters = new HashMap();  Connection conn = null;  FileOutputStream output = null;  
    try {  String driver = "net.sourceforge.jtds.jdbc.Driver";  String url = "jdbc:jtds:sqlserver://server:1433/pcbsyn";  Class.forName(driver);  conn = DriverManager.getConnection(url, "sa", "711");  Map parameter = new HashMap();  JasperPrint report = null;  report = JasperFillManager.fillReport(reportFile.getPath(),  parameter, conn);  JRAbstractExporter exporter = new JExcelApiExporter();  output = new FileOutputStream("D:\\excel.xls");  exporter.setParameter(JRExporterParameter.JASPER_PRINT, report);  exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);  exporter.exportReport();  } catch (Exception e) {  e.printStackTrace();  } finally {  
    try {  output.close();  } catch (Exception e) {  e.printStackTrace();  }  
    try {  conn.close();  } catch (Exception e) {  e.printStackTrace();  }  }  }  
    } 

    运行的时候报错:
     

    java.lang.NullPointerException  at com.yaxing.excel.TestExcel.main(TestExcel.java:41)  
    Exception in thread "main" java.lang.NoClassDefFoundError: jxl/write/biff/RowsExceededException  at com.yaxing.excel.TestExcel.main(TestExcel.java:32)  
    Caused by: java.lang.ClassNotFoundException: jxl.write.biff.RowsExceededException  at java.net.URLClassLoader$1.run(URLClassLoader.java:202)  at java.security.AccessController.doPrivileged(Native Method)  at java.net.URLClassLoader.findClass(URLClassLoader.java:190)  at java.lang.ClassLoader.loadClass(ClassLoader.java:307)  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)  at java.lang.ClassLoader.loadClass(ClassLoader.java:248)  ... 1 more  

    这是因为没有导入所需要的jxl.jar包,这个包是用来处理Excel文件的。

    同样可以在lib目录下面查找。再运行一次,可以发现,已经生成了我们所需要的excel文件。

    最后生成的excel文件如图:

     

    图3.1

    四、使用使用Scriptlet来填充报表。

    ①编写Scriptlet类,需要继承自JRDefaultScriptlet(net.sf.jasperreports.engine.JRDefaultScriptlet),


    import java.util.Date;  import net.sf.jasperreports.engine.JRDefaultScriptlet;  
    import net.sf.jasperreports.engine.JRScriptletException;  publicclass ScriptLetDemo extends JRDefaultScriptlet{  
    long pageinitTime = 0;  
    public String getResult(){  
    return"Hello,Scriptlet";  }  
    @Override
    publicvoid beforePageInit() throws JRScriptletException {  
    // TODO Auto-generated method stub pageinitTime = new Date().getTime();  }  
    } 

    我们要制作的报表是,报表有个Text Field的值,是这个ScriptletDemo 里面返回的值。

    ②将此ScriptLetDemo 导出成jar文件

    myeclipse的导出方式很简单,选择这个ScriptLetDemo.java

    File-->Export-->Java-->Java\Jar file 选择保存路径即可。

    为什么要导出成jar文件呢,因为我们的iReport需要这个jar文件。

    ③从iReport的组件面板中拖拉一个Text Field放入Detail中,

    这个Text Filed 是表达式是:

    ((com.yaxing.excel.ScriptLetDemo)$P{REPORT_SCRIPTLET}).getResult()

    前面括弧里面是ScriptletDemo 的路径,后面的REPORT 是默认的Scriptname,

    如果我们的报表中有多个Script,则名字的规则是

    <scriptlet name>_SCRIPTLET (.for example, scritplet1_SCRIPTLET)

    预览下,即可:如图所示:Static Text 下面的值,即是我们程序中的值!

     

    图4.1

    文中有些代码不理解没关系,后文会有详细的介绍,只是先,我们熟悉下这个报表的使用方式、开发流程。

    整个项目使用的jar如图:

     

     

     


延伸阅读:

  • 1、Java开源报表JasperReport、iReport4.5.1使用详解(一)
  • 2、Java开源报表JasperReport、iReport4.5.1使用详解(三)
  • 3、JasperReportforServletDemo

这篇关于Java开源报表JasperReport、iReport4.5.1使用详解(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993488

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具