• JAVA调用IReport模板生成PDF文件及常见的几个问题解决


    转载:http://cache.baiducontent.com/c?m=v14RCBGrkK42yz2FeanXqBoajYiAJ_4DRfR4Nf4hLHBWypeB9bh7NcTa1kmpVXg4BJ3p8xYUEVVoCpe4uaQyv7Bg_Ve0PgPHceNv6yNBw8uuwZ0LI9qiNQSdHZtCFqlfK5ZAweI7EciLEB12Pc6cxKuL3Zab9LlzThf9CQucpzarnXAQLFecPUZlHP7hV1GLz5yzQ2m8Fg-nN_m27I_3ba&p=9c638915d9c040a92ab98c2d02148d&newp=8a6ec54ad5c247b70be2966d5c55cf231610db2151d6d4176b82c825d7331b001c3bbfb423291406d8c57d6c00a94a5eebf63777370923a3dda5c91d9fb4c5747990&s=747d392acfc03cab&user=baidu&fm=sc&query=ireport%C4%A3%B0%E5%C9%FA%B3%C9PDF%CE%C4%BC%FE&qid=c3cbbf4a0009d9ab&p1=2

    先生成一个空白模板
    在这里插入图片描述

    然后先不要急着拼组件,先来大致了解一下这个工具的使用方法和模板的构造
    在这里插入图片描述
    title:只在报表的第一页显示,后面的就不在显示,常用来放置报表名称。
    page header :相当于页眉,在第一页位于title的下面,而后的页中是位于最上部。
    page footer :相当于页脚,和page header是想对应的。
    detail :报表内容显示的部分,这部分内容是重复的,相当于迭代的过程,常用于放置类似表格中列的内容。
    column header :针对Detail Band 的表头段,一般情况下在这个段中画报表的表头,用于放置表头内容
    column footer :和column header 相对的。
    summary :出现在整个报表的最后一页的detail的下面,统计总值结果。

    下面下来做个测试,了解一下这个模板的各个位置,首先把各个构件的高度都调到最高,让这个页面放到最大,如果不放大的话,所有的构件都在同一页上了,看不出来效果,现在我把每个构件的中间都放了一个staticText,写上他们的名字,再把背景图也加上,看下效果,
    在这里插入图片描述
    在这里插入图片描述

    如果你不知道背景图怎么展开,先点一下构件的名字,然后把属性高度调到最高,也就是802,你就可以看到他了,然后再从组件里拖一个image过来,放一个图片就OK了
    在这里插入图片描述

    然后准备就绪,编译一把,看看效果

    共有三页,
    第一页:
    在这里插入图片描述
    第二页
    在这里插入图片描述
    第三页:
    在这里插入图片描述

    然后可以总结下,这个title是只在第一页会有,summary是只在最后一页会有,背景图是每一页都有,detail除了第一页和最后一页都有,其他的组件都是除了最后一页都有,然后知道了这些以后就可以按照自己的需求去写这个页面了。

    主要就是有个list的遍历循环,我等会儿再写。

    list的循环,这里要结合java代码给塞数据

    先来看一下塞一个变量怎么塞:
    在这里插入图片描述
    点击效果预览,会提示让你输入这个参数内容
    在这里插入图片描述
    然后就看到了这个参数了
    在这里插入图片描述

    下面我们来看list是怎么搞的。
    先建一个list属性的参数,记得已定要改为list格式
    在这里插入图片描述
    然后在dataset1中添加参数和刚才的名称一致
    在这里插入图片描述
    在这里插入图片描述

    然后生成jasper文件模板以后我用java代码调用一下看看

    稍等会儿再写,,

    java调用jasper文件demo

    使用到的包:
    在这里插入图片描述

    <dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.0.0</version>
    </dependency>
    <dependency>
    <!-- 生成pdf所依赖的包 -->
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.11</version>
    </dependency>
    <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-pdfa</artifactId>
    <version>5.5.11</version>
    </dependency>
    <dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
    </dependency>
    <!--将.jrxml编译成.jasper.如果你不使用java编译,而使用ireport工具编译则无须导入该 包 -->
    <dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-all</artifactId>
    <version>2.4.13</version>
    </dependency>
    
    
    
    package com.lin.study.test;
    
    import com.lin.study.utils.JasperHelper;
    import net.sf.jasperreports.engine.*;
    import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
    import net.sf.jasperreports.engine.export.JRPdfExporter;
    import net.sf.jasperreports.engine.util.JRLoader;
    
    import java.io.*;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class JasperTest {
    
        public static void main(String[] args) throws Exception {
    
            JRDataSource jrDataSource = new JRBeanCollectionDataSource(null);//这个应该是给Jasper转化List的作用
            Map testMap=new HashMap();
    
            List<BenzBean> list = new ArrayList<BenzBean>();
            BenzBean bean1 = new BenzBean();
            bean1.setBenzListParamName("C100");
    
            BenzBean bean2 = new BenzBean();
            bean2.setBenzListParamName("C200");
    
            BenzBean bean3 = new BenzBean();
            bean3.setBenzListParamName("C300");
            list.add(bean1);
            list.add(bean2);
            list.add(bean3);
            testMap.put("benzListParam",list);
            testMap.put("benzParam","我是林俊杰");
            List jasperPrintList = new ArrayList();
    
            File BenzIReport = new File("D:/iReport/work/jasper/BenzIReport.jasper");
            if(BenzIReport.exists()){
                JasperReport Benz = (JasperReport) JRLoader.loadObject(BenzIReport); 
                JasperPrint protocolTemplate = JasperFillManager.fillReport(Benz,testMap,jrDataSource);
                jasperPrintList.add(protocolTemplate);
            }
    
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            JRPdfExporter exporter = new JRPdfExporter();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
            exporter.exportReport();
            byte[] bytes = baos.toByteArray();
    
            File file = new File("D:/iReport/work/benz.pdf");
    
            try {
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(bytes);
                System.out.println("写入成功");
                fos.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    

    bean对象

    package com.lin.study.test;
    
    public class BenzBean {
    
        private String benzListParamName;
    
        public String getBenzListParamName() {
            return benzListParamName;
        }
    
        public void setBenzListParamName(String benzListParamName) {
            this.benzListParamName = benzListParamName;
        }
    }
    
    

    效果如下,我给他放在titile里面展示出来了,放在Detail里面没展示出来,后面我再找找原因
    在这里插入图片描述

    还有这个jasper的数据连接,我之前一直用的Empty,因为我觉得这个无所谓的,我在代码里面查出来给他塞进去是一样的效果,
    我这里还是补充一下吧。

    如果你是Orcale数据库的话,先准备好这个jar包
    链接:https://pan.baidu.com/s/1HJXvEpiuiIQSm_2E747m3g
    提取码:uhzo
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    然后也是拖拖拽拽,这里也不多讲了

    常见的问题主要有
    1,空白展示为null;
    在这里插入图片描述
    2,文字内容太长,溢出了;
    在这里插入图片描述
    3,中文乱码;
    在这里插入图片描述
    在这里插入图片描述

    net.sf.jasperreports.awt.ignore.missing.font=true
    

    4,发布到linux服务器中文文字重叠,吃字;

    吃字也是字体的问题,因为linux没有安装中文字符集,所以展示中文乱码或者计算字符长度/宽度有问题,导致文字重叠

    5,生成pdf空白页问题;
    在这里插入图片描述
    6,commons-digester问题
    代码生成pdf的时候会报错少个什么digester/Rule这个类,这是因为少了这个jar包
    这个jar包我忘了从哪里搞了,我放在云盘上吧,直接拿去用得了
    链接:https://pan.baidu.com/s/1JWboJzpuOu6Ff96xGJ8baA
    提取码:u7ml
    pom里我是这么写的

    		<dependency>
    			<groupId>commons-digester</groupId>
    			<artifactId>commons-digester</artifactId>
    			<version>2.1</version>
    		</dependency>
    
    

    其他的我暂时想不起来了

  • 相关阅读:
    贷款计算公式
    P2P行业专业术语(最全)
    p2p投资理财入门篇(新手必备)
    2015年p2p网络借贷平台的发展现状
    MyEclipse中SVN的常见的使用方法
    linux下打开、关闭tomcat,实时查看tomcat运行日志
    Spring 向页面传值以及接受页面传过来的参数的方式
    Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
    PowerDesigner概述(系统分析与建模)以及如何用PowerDesigner快速的创建出这个数据库
    MySQL 8.x 函数和操作符,官方网址:https://dev.mysql.com/doc/refman/8.0/en/functions.html
  • 原文地址:https://www.cnblogs.com/lwh-12345/p/14768935.html
Copyright © 2020-2023  润新知