zoukankan      html  css  js  c++  java
  • 报表 PDF Java报表 JasperReports IReport

    1.报表模板设计器

    报表设计器IReport :https://sourceforge.net/projects/ireport/files/?source=navbar
    注意:该设计器如果打不开,则检查一下IReport的ireport.conf 文件,将里面的#jdkhome=""改为自己的jdk7的路径(即:jdkhome="C:\Program Files\Java\jdk1.7.0_80\jre"),注意是“jdk7”,不支持jdk8。 

    iReport也是开源组织sf.net中的一款免费软件,是为JasperReport设计的强大的,直观的,易于使用的可视化报表设计器,采用纯Java开发。这个工具允许用户可视化编辑包含charts、图片、子报表等的复杂报表。iReport 还集成了JFreeChart图表制作包,允许用户可视化地编辑XML(JasperDesign)文件。用于打印的数据可以通过多种方式获取包括:JDBC,TableModels, JavaBeans, XML,Hibernate(支持HQL查询语言), CSV等。它支持多种输出格式包括:PDF,RTF,XML,XLS,CSV,HTM。

    iReport报表绘制

    不同版本的iReport在界面上会存在一些差异,以下文档基于iReport-5.6.0编写

    1) 新建报表

    【文件】à【New…】

    \

     


    选择一个模版,【Openthis Template】

    \

     

     


    通过【Browse】选择文件保存位置,并填写报表名称【Report name】

     

    \

     

     

     


    完成

     

     \

     

     

     

     

     

     

     

    2) 创建Database Sources


    点击【ReportDatasources】图标

    \

     

    【New】

     \

     

     


    选择一个datasourcetype,这里选【Database JDBC connection】

    \

    填写数据库连续的相关信息,并保存

    \

     

     

    勾选默认Datasources,并关闭窗口

    \

     

    3) 
    设置报表主要SQL \

    输入主要SQL,相应的结果集的列会出现在下方

     \

     

    4) 报表结构

    \

    5) 在Detail中使用SQL结果

    \

     

     

    6) 使用iReport内置变量

     \

     

    7) 使用报表外部参数

    右键【Parameters】,选择【添加Parameter】

     \

     

     

    通过右侧的【属性面板】修改参数名称,并拖动到报表中

    \

     

     

    8) 使用Dateset 创建汇总报表 (次要SQL)

     

     

     右键【报表名称】(比如report_test002),选择【Add Dataset】 

    \

     

    填写Dataset名称,【下一步】

     

    \

     选择DataSources,并填写SQL语句

     

    \

     

     

     

    选择要使用的列,并【下一步】

    \

     

     

    使用Group组自动Group up,也可通过SQL进行Group up

     \

     

     

    通过【窗口à组件面板】打开组件面板

    \

     

     


    拖动Chart图标到报表中

    \

     

     


    选择一个图表类型,【OK】

     \

     

     


    选择要使用的DataSet(比如上文刚刚创建的myDataSet1)

     

     \

     

     

    填写Series描述

    \

     

     

     

    通过右侧按钮填写横坐标分组组名,即分组值

    \

     

    9) 预览报表


    通过【预览】图标查看报表结果

    \

     

    如果有外部参数,将会弹出提示框要求录入

    \

     


    看到报表结果,可以通过【Designer】图标返回到设计界面

     \

     

     

    10)编译报表


    通过【编译】图标,可以对报表进行编译

    \

    编译后,同个目录下,可以找到编译后的文件:

    比如,report_test002.jasper

     

     

     

    接入到Spring mvc项目中

     由于jasperreports的主包,直接用gradle去maven repository拿会出现olap4j.jar找不到的问题。所以,这里直接去jasperreports的官网下载 http://community.jaspersoft.com/project/jasperreports-library 

    然后将olap4j-0.9.7.309-JS-3.jar和jasperreports-6.2.1.jar 放到项目里面的文件夹(新建lib/jasperreports文件夹),再在gradle的build文件里面进行配置,如下:

    fileTree(dir: "${rootProject.projectDir}/lib/jasperreports", include: '*.jar'),
    "commons-digester:commons-digester:1.7",
    "org.codehaus.groovy:groovy-all:2.4.7",
    "com.lowagie:itext:4.2.1",
    "com.itextpdf:itextpdf:5.4.3",
    "com.itextpdf:itext-asian:5.2.0",

    这里凭证完成后,还会出现中文不显示的问题,jasperreports6之前的版本用itext-asian.jar就可以解决,但是6.0以上的就只能手动添加字体问题,步骤如下:

    找到刚刚下载的jasperreports-6.2.1.jar,用解压工具查看字体目录(jasperreports-6.1.1\demo\fonts\net\sf\jasperreports\fonts\dejavu),将下载好的simsun.ttf和simsun.ttc文件copy到dejavu目录,并修改fonts文件夹下的jasperreports-fonts.xml文件。加入下列配置(用IReport设计报表时,font name要设置成“宋体”):

    <fontFamily name="宋体">
            <normal>net/sf/jasperreports/fonts/dejavu/simsun.ttf</normal>
            <bold>net/sf/jasperreports/fonts/dejavu/simsun.ttf</bold>
            <italic>net/sf/jasperreports/fonts/dejavu/simsun.ttf</italic>
            <boldItalic>net/sf/jasperreports/fonts/dejavu/simsun.ttf</boldItalic>
            <pdfEncoding>Identity-H</pdfEncoding>
            <pdfEmbedded>true</pdfEmbedded>
            <exportFonts>
                <export key="net.sf.jasperreports.html">'宋体', Arial, Helvetica, sans-serif</export>
                <export key="net.sf.jasperreports.xhtml">'宋体', Arial, Helvetica, sans-serif</export>
            </exportFonts>     
        </fontFamily>

    JAVA代码如下:
    package com.glory.venus.admin.controller;

    import net.sf.jasperreports.engine.*;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import javax.servlet.http.HttpServletResponse;
    import javax.sql.DataSource;
    import java.sql.SQLException;
    import java.util.HashMap;
    import java.util.Map;

    @RequestMapping("/pdf")
    @RestController
    public class PDFGeneratorController {
    @Autowired
    DataSource dataSource;

    @RequestMapping(value = "/build", method = RequestMethod.GET)
    public void buildPDF(HttpServletResponse response) {
    try {
    //设定报表所需要的外部参数内容
    Map<String, Object> rptParameters = new HashMap<>();
    rptParameters.put("id", 32L);
    rptParameters.put("archive_no", "161103001");
    //传入报表源文件绝对路径,外部参数对象,DB连接,得到JasperPring对象
    JasperPrint jasperPrint = JasperFillManager.fillReport("C:\\Users\\Administrator\\MentalReport.jasper", rptParameters, dataSource.getConnection());
    //导出PDF文件
    JasperExportManager.exportReportToPdfFile(jasperPrint, "F:\\192.168.2.231\\source\\trunk\\venus\\venus V2.0\\admin\\src\\main\\resources\\jasperReport\\test.pdf");
    } catch (JRException ex) {
    //执行结束
    System.out.println("Export failed!!");
    }catch (SQLException ex){
    System.out.println("Export failed!!");
    }
    //执行结束
    System.out.println("Export success!!");
    }
    }


    用JAVABean做数据源

    1、创建一个javabean对象

    import Java.io.Serializable;
    public class GoodPrint implements Serializable{
       ...............................................

    ......................

    ..............................
    }

    2、工具--》选项--》classpath--》Add JAR,导入JavaBean和工厂方法所在的jar包,编译一定要选择一致的jdk版本,当前IReport用的是jdk1.7,所以新建一个项目,然后把主项目里面的类文件copy到新项目,专门作为生成IReport模板用。



    3、创建域字段,如下:



    一、用ireport创建数据源,如下:

    创建一个工厂类,如下:

    public class GoodsFactory {
    private static GoodPrint[] data={new GoodPrint("GOO1","A","GOO1A",new BigDecimal(10),"M"),
    new GoodPrint("GOO2","B","GOO2B",new BigDecimal(20),"PCS")}; 
    public static Object[] getBeanArray() {
         return data;
    }
    public static Collection<?> getBeanCollection() {
            return Arrays.asList(data);
        }
    }

    导入工厂类


    创建Text报表,如下:



    二、后台创建数据源如下,如下:

                               String root_path=request.getRootPath();
      String reportFilePath = root_path + "report/Test.jasper";
      List goodList=new ArrayList<Goods>();
      goodList.add(new GoodPrint("GOO1","A","GOO1A",new BigDecimal(10),"M"));
      goodList.add(new GoodPrint("GOO2","B","GOO2B",new BigDecimal(20),"PCS"));
    //   JRDataSource dataSource = this.createDataSource();
      JRDataSource dataSource = new JRBeanCollectionDataSource(goodList);;
    //   Map<String, Object> parameters = new HashMap<String, Object>();
    //   List dataList =new ArrayList();
    //   parameters.put("dataList", dataList);
      JasperReport report = (JasperReport)JRLoader.loadObject(reportFilePath);
      JasperPrint jasperPrint = JasperFillManager.fillReport(report, null, dataSource);
      String repTpl="123";
      JasperExportManager.exportReportToPdfFile(jasperPrint,root_path+"report/123.pdf");
    // JasperRunManager.runReportToHtmlFile(root_path+"report/123.pdf",null,null);
    //如果创建报表成功,则转向该报表,其实可以把报表套在框架内,这样实现比较有意义的报表格式。
    response.sendRedirect("report2.html");
    //   JasperFillManager.fillReport(report, parameters, dataSource);
    // OutputStream ouputStream = response.getOutputStream();  
    // response.setContentType("application/pdf");
    // response.setCharacterEncoding("UTF-8");  
    // String repName=URLEncoder.encode("物料报表", "UTF-8");
    // response.setHeader("Content-Disposition", "attachment; filename=\""+repName+"\".pdf"); 
    //              
    //         // 使用JRPdfExproter导出器导出pdf  
    //         JRPdfExporter exporter = new JRPdfExporter();  
    //         exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    //         exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream);  
    //         exporter.exportReport();
    // ouputStream.close(); 




    复杂类型的JAVABean作为数据源





  • 相关阅读:
    SQL Server 索引结构及其使用(四)
    正确配置和使用SQL mail
    2进制、8进制、10进制、16进制...各种进制间的轻松转换(c#)
    配置远程服务器
    SQLServer基本函数
    将人民币的数字表示转化成大写表示(C#版)
    SQL Serer 索引全攻略
    亿众国际点对点文件传输程序
    表的相关操作
    windows文件副檔名說明
  • 原文地址:https://www.cnblogs.com/tonyzeng/p/7429067.html
Copyright © 2011-2022 走看看