iReport报表实战-图文详解

陈科肇

1.设计报表

官网地址:http://community.jaspersoft.com/

在开始之前设计报表之前,我们总得有工具来设计报表吧,这时我们就可以在官网地址里查找并下载

安装完报表设计工具后,启动工具

数据源:数据源有两种,JDBC数据源和List数据源。

首先,我们使用的是List数据源,也就是说是通过后台SQL语句查询到值后,封装到List集中,再将List集的数据传给报表充当数据源。

使用List集做为数据源的好处:报表设计的数据和SQL语句没有直接的关联,也可以说,这样比较安全。

a.配置要显示的字段

Fields->右键->...,可参照下图

b.接收传递过来的参数

Parameters->右键->添加,配置相关属性,即可!

c.添加子报表

注:

1.可以右键设置子报表的相关参数(属性);

2.如果要为子报表传入List集做为数据源,选中子报表->展开属性窗口->

设置connection type:Use a datasource expression,

设置Data Source Expression:newnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{sub1Ds})。

其中sub1Ds是接收传递过来的List集。

d.添加图片显示

组件面板->Image,再配置图片相关属性

比如:要显示图片的路径的属性Image Expression设置为$P{imageUrl}

2.集成到WEB项目并加载显示

@Controller层-EntryBillController.java

/**
	 * 打印pdf报表
	 * ckz
	 * @param modelandview
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/doPdf")
	public void doReportPdf(String billcode,String where,
		HttpServletRequest req,HttpServletResponse resp) throws Exception{
		entrybillService.doReport(billcode,where,req,resp);
	}

@Service层-EntryBillService.java

/**
	 * 打印报表
	 * ckz
	 *
	 * @param billcode
	 * @param req
	 * @param resp
	 * @throws Exception
	 */
	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Transactional(readOnly=true)
	public void doReport(String billcode,String where, HttpServletRequest req,
			HttpServletResponse resp){
		try{
			List data = null;// = entrybillDao.getPrintEntryBillDs(billcode);
			List list_sub1 = null;//entrybillDao.getPrintSub1Ds(billcode);
			List list_sub2 = null;//entrybillDao.getPrintSub2Ds(billcode);
			//获取工程路径
			String root_path=req.getSession().getServletContext().getRealPath("");
			//获取.jasper文件路径
			String reportFilePath = root_path;//+"\\webresource\\reports\\report_entrybill_print_look_all_cn.jasper";
			//报表logo图片路径
			String imageUrl=root_path+"\\webresource\\reports\\xxx.png";
			//设置report参数
			Map params = new HashMap();
			String username = (String) req.getSession().getAttribute("employeename");
			params.put("username", username);
			//++++++++++
			data = entrybillDao.getPrintEntryBillDs(billcode);
			list_sub1 = entrybillDao.getPrintSub1Ds(billcode);
			list_sub2 = entryBillBinDao.getPrintSub2Ds(billcode);
			reportFilePath+="\\webresource\\reports\\entrybill\\report_entrybill_print_look_all_cn.jasper";
			params.put("sub1Ds", list_sub1);
			params.put("sub2Ds", list_sub2);
			params.put("entrybillmasTitle", "入库单详细表");
			params.put("SUBREPORT_DIR", root_path+"\\webresource\\reports\\entrybill\\");
			//++++++++++
			//获取数据源
			JRDataSource dataSource = new JRBeanCollectionDataSource(data);
			params.put("imageUrl", imageUrl);
			Map<String,Object> map = (Map) data.get(0);
			if("1".equals(map.get("BILLSTATE").toString())){
				params.put("billStateImage", root_path+"\\webresource\\reports\\audit-yes.png");
			}
			if("1".equals(map.get("DISUSESTATE").toString())){
				params.put("billStateImage", root_path+"\\webresource\\reports\\disuse-yes.png");
			}
			//获取jasperPrint对象
			JasperPrint jasperPrint = ReportUitl.getJasperPrint(reportFilePath, params, dataSource);
			ReportUitl.exportPdf(req, resp, jasperPrint);
		}catch(Exception ex){
			PrintWriter out = null;
			try {
				resp.setCharacterEncoding("UTF-8");
				out = resp.getWriter();
				out.write("<h1 style='position: absolute;left: 50%;top: 50%;margin-left: -180px;margin-top: -10px;'>打印报表出错,请重试!</h1>");
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				out.close();
			}
			ex.printStackTrace();
		}

		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=UTF-8");

	}

其中,exportPdf(req, resp, jasperPrint)及getJasperPrint(reportFilePath, params, dataSource)方法的类,ReportUitl.java

package com.wms.common;

import java.io.File;
import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

/**
 * 实现打印报表的常用方法
 * @author ckz
 *
 */
@SuppressWarnings("deprecation")
public class ReportUitl {
	/**
	 * 获取 JasperPrint 对象
	 * ckz
	 *
	 * @return
	 * @throws Exception
	 */
	public static JasperPrint getJasperPrint(String reportFileName,Map<String, Object> params,JRDataSource dataSource) throws Exception{
		File file = new File(reportFileName);
		if(!file.exists())
			throw new Exception("系统找不文件  " + reportFileName);
		JasperReport report = (JasperReport) JRLoader.loadObjectFromFile(file.getPath());
		JasperPrint print = JasperFillManager.fillReport(report, params, dataSource);
		return print;
	}

	/**
	 * 打印pdf文件
	 * ckz
	 *
	 * @param req
	 * @param resp
	 * @param jasperPrint
	 * @throws IOException
	 * @throws JRException
	 */
	public static void exportPdf(HttpServletRequest req,HttpServletResponse resp,JasperPrint jasperPrint) throws Exception{
		//获取JasperPrint流 对象
		JasperPrint print = jasperPrint;
		//使用pdf导出器
		JRPdfExporter exporter =new JRPdfExporter();
		//设置exporter的参数
		exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
		exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, resp.getOutputStream());
		exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
		//执行exporter
		exporter.exportReport();

	}
}

@Repository层-xxx.java

在这里,你向数据库检索的是你在报表中设置Fields的字段的数据List集

前台调用:

你只须访问@Controller层-EntryBillController.java类的方法

doReportPdf(String billcode,String where,HttpServletRequest req,HttpServletResponse resp)即可显示你设计的报表内容!

注:其中的*.jasper文件,是通过报表器工具生成的,点击Preview选项即可生成位于同目录(相对于当前编译的*.jrxml文件)下的*.jasper文件

时间: 2024-10-06 01:19:19

iReport报表实战-图文详解的相关文章

【图文详解】scrapy安装与真的快速上手——爬取豆瓣9分榜单

写在开头 现在scrapy的安装教程都明显过时了,随便一搜都是要你安装一大堆的依赖,什么装python(如果别人连python都没装,为什么要学scrapy-.)wisted, zope interface,pywin32---现在scrapy的安装真的很简单的好不好! 代码我放github上了,可以参考: https://github.com/hk029/doubanbook 为什么要用scrapy 我之前讲过了requests,也用它做了点东西,([图文详解]python爬虫实战--5分钟做

FineBI学习系列之FineBI官网提供的程序数据集(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-31.html 目录: 1.描述 2.实现原理 3.案例 1.描述 由上一节BI可能通过设计器远程服务器的方式,以服务器数据集的形式来连接数据. 这样其数据来源可以是数据库数据,还可以是其它任何类型的数据,因为BI是通过AbstractTableData抽象类来读取数据源的,而上述所有的数据来源都继承实现其抽象方法,因此BI可

FineBI学习系列之FineBI官网提供的SAP数据集(图文详解)

不多说,直接上干货! 这是来自FineBI官网提供的帮助文档 http://help.finebi.com/http://help.finebi.com/doc-view-32.html 目录: 1.描述 2.环境准备 3.SAP数据连接 1.描述 加SAP数据集也是服务器数据集的一种情况, 但是由于SAP数据集常用而且有较多需要注意的配置,因此单独做一节进行说明.那客户SAP系统集成时,如何将SAP中的数据导入BI的服务器数据集呢?FineReport8.0版本中,将SAP数据连接功能做成一个

Monitorix监控Linux主机图文详解

Monitorix监控Linux主机图文详解 Monitorix简介 Monitorix 是一款自由开源的轻巧型系统监视工具.使用 Monitorix你可以随时掌控 CPU 负载及温度.内存占用.活动进程.磁盘使用及温度.网络设备流量.网络服务等全方位的系统信息.Monitorix 需要 Apache Web 服务器来显示这些系统信息图表.所以它特别适合在 Linux 服务器上面使用. 下面是我安装的步骤 1.安装的环境和需要的rpm包 我是在CentOS 6.4下面安装的CentOS 5可以使

使用VS2015创建和使用动态链接库-图文详解

之前看过原创一篇<VS2010 动态库开发--第一章 演练:创建和使用动态链接库 (C++)>的帖子,地址是http://blog.sina.com.cn/s/blog_6fb3686501011ymn.html,感谢原创.这里我们使用VS2015创建和使用自己的动态链接库,配以图文详解. 我们先来演示如何使用VS2015创建一个动态链接库.1.新建一个"Win32控制台应用程序","名称"为MathFuncsDll,"解决方案名称"

图文详解如何搭建Windows的Android C++开发环境

原地址:http://www.apkbus.com/android-18595-1-1.html //=====================================================================//TITLE://    图文详解如何搭建Windows的Android C++开发环境(一)//AUTHOR://    norains//DATE://    Thursday  14-April-2011//Environment://    Cygw

图文详解远程部署ASP.NET MVC 5项目

原文:图文详解远程部署ASP.NET MVC 5项目 话外篇: 由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由于常不在实验室,所以在想能不能远程部署.因此今天专门研究了一下具体的过程,下面和大家分享一下.本人新手,还望大虾勿喷,有什么问题,还望高手指点. 一.本文实验环境: Windows Server 2012 R2 SQL Server 2012 Express Visual Studio 2013 项目为:ASP.NET MVC 5.0,使用的是L

LNMP编译安装之msyql安装--图文详解

LNMP编译安装之msyql安装--图文详解 1.前言 本次安装采用源码安装,主要资源包从官网下载,次要依赖则使用yum进行安装,本篇只涉及mysql的安装,msyql远程登录,不涉及mysql具体配置.该教程纯属安装,不涉及任何重要知识点,老少皆宜. 2.安装步骤 2.1.下载boost(只下载不安装) wget http://nchc.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz 2.2.解压bosot t

LNMP编译安装之nginx安装--图文详解

LNMP编译安装之nginx安装--图文详解 1.前言 本次安装采用源码安装,主要资源包从官网下载,次要依赖则使用yum进行安装,本篇只涉及nginx的安装,不涉及nginx的配置,对应nginx如何访问php,本篇也不涉及.该教程纯属安装,不涉及任何重要知识点,老少皆宜. 2.安装步骤 nginx官网:http://nginx.org/en/download.html 2.1.下载nginx wget http://nginx.org/download/nginx-1.12.0.tar.gz