我们上一次成功的利用iReport工具制作了一张报表,并且预览了报表最后的效果,也生成了格式为“jrpxml”、“jrxml”与“jasper”的文件。这次,我们使用jasper提供的java的api去利用在iReport中制作的报表jasper文件来生成真正的报表文件。

本文以生成pdf格式的报表文件为例,该报表文件包含所有男用户的信息。

首先我们打开MyEclipse,在其中创建一个java工程:

新建一个lib文件夹,然后在lib中加入我们准备好的jar包:

然后将这些jar包全部添加到环境中(右键build path)

然后编写获取数据库连接的类,用于连接数据库并获取相应连接对象,以便于后期操作数据库:

  1. package com.cn.org.ireport.test;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. public class JDBCConnection {
  5. public static Connection getConnection(){
  6. try {
  7. String url = "jdbc:mysql://localhost:3306/db_film";
  8. Class.forName("org.gjt.mm.mysql.Driver");
  9. Connection con = DriverManager.getConnection(url, "root", "1234");
  10. return con;
  11. }catch(Exception e){
  12. e. printStackTrace();
  13. }
  14. return null;
  15. }
  16. }

接下来编写dataSource类(也就是数据填充类),实现JRDataSource接口,通过放在list里面的Map对象迭代实现数据对应:

  1. package com.cn.org.ireport.test;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Map;
  6. import net.sf.jasperreports.engine.JRDataSource;
  7. import net.sf.jasperreports.engine.JRException;
  8. import net.sf.jasperreports.engine.JRField;
  9. /**
  10. *  dataSource类(也就是数据填充类),实现JRDataSource接口
  11. *  通过放在list里面的Map对象迭代,实现数据对应
  12. */
  13. public class ReportDataSource implements JRDataSource{
  14. private Iterator iter;
  15. //创建一个,map对象用与数据对应
  16. Map map = new HashMap();
  17. //无参的构造函数
  18. public ReportDataSource(){
  19. }
  20. //以sex为参数的有参构造函数,用于数据初始化
  21. public ReportDataSource(String sex){
  22. //通过性别获取相应用户的数据
  23. List datas=DateSourceBaseFactory.createBeanCollection(sex);
  24. //要将List中的数据迭代,需要使用Iterator迭代对象
  25. iter=datas.iterator();
  26. }
  27. //通过key获取value值
  28. public Object getFieldValue(JRField arg0) throws JRException {
  29. return map.get(arg0.getName());
  30. }
  31. //接口JRDataSource的方法,判断是否有下一个数据
  32. public boolean next() throws JRException {
  33. if(iter.hasNext()){
  34. map=(Map)iter.next();
  35. return true;
  36. }
  37. return false;
  38. }
  39. }

接下来实现上个类中的DateSourceBaseFactory(提供数据的数据源工厂),它是实际从数据库中取出相应数据,然后将其封装在map中,然后又将相应的map装在List容器中。

  1. package com.cn.org.ireport.test;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.SQLException;
  5. import java.sql.Statement;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. /**
  11. * Map中的键值要与模板中的file值对应
  12. * */
  13. public class DateSourceBaseFactory {
  14. public static List createBeanCollection(String sex) {
  15. int num=0;
  16. if(sex.equals("男")){
  17. num=1;
  18. }else{
  19. num=2;
  20. }
  21. ResultSet rs=null;
  22. Statement st=null;
  23. Connection con=null;
  24. List datas=new ArrayList();
  25. try {
  26. con=JDBCConnection.getConnection();
  27. st=con.createStatement();
  28. rs=st.executeQuery("select name,brithday,province,Email from user where sex="+num);
  29. while(rs.next()){
  30. Map attris=new HashMap();
  31. attris.put("name", rs.getString("name"));
  32. attris.put("brithday", rs.getString("brithday"));
  33. attris.put("province", rs.getString("province"));
  34. attris.put("Email", rs.getString("Email"));
  35. datas.add(attris);
  36. }
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }finally{
  40. try {
  41. if(rs!=null) rs.close();
  42. if(st!=null) st.close();
  43. if(con!=null) con.close();
  44. } catch (SQLException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. return datas;
  49. }
  50. }

接下来编写dataSource的javaBean类。用于创建模板

  1. package com.cn.org.ireport.test;
  2. import java.io.Serializable;
  3. public class DataSoruceBean implements Serializable{
  4. private static final long serialVersionUID = 1L;
  5. private String name;
  6. private String brithday;
  7. private String province;
  8. private String Email;
  9. public String getName() {
  10. return name;
  11. }
  12. public void setName(String name) {
  13. this.name = name;
  14. }
  15. public String getBrithday() {
  16. return brithday;
  17. }
  18. public void setBrithday(String brithday) {
  19. this.brithday = brithday;
  20. }
  21. public String getProvince() {
  22. return province;
  23. }
  24. public void setProvince(String province) {
  25. this.province = province;
  26. }
  27. public String getEmail() {
  28. return this.Email;
  29. }
  30. public void setEmail(String email) {
  31. this.Email = email;
  32. }
  33. }

接下来是重头戏,编写测试入口类,生成pdf文件。JasperFillManager中有多个生成文件的方法
,除了可以生成pdf文件外还可以生成ofice文档文件。这里我们就将取出的数据打印到报表中去:

  1. package com.cn.org.ireport.test;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import net.sf.jasperreports.engine.JRAbstractExporter;
  8. import net.sf.jasperreports.engine.JRException;
  9. import net.sf.jasperreports.engine.JRExporterParameter;
  10. import net.sf.jasperreports.engine.JasperFillManager;
  11. import net.sf.jasperreports.engine.JasperPrint;
  12. import net.sf.jasperreports.engine.export.JRPdfExporter;
  13. import net.sf.jasperreports.engine.export.JRPdfExporterParameter;
  14. public class TestReportHere {
  15. public static void main(String[] args) {
  16. Map parameters=new HashMap();
  17. ByteArrayOutputStream outPut=new ByteArrayOutputStream();
  18. FileOutputStream outputStream=null;
  19. File file=new File("F:/Temp/report.pdf");
  20. String reportModelFile="C:/Users/jack/report2.jasper";
  21. try {
  22. JasperPrint jasperPrint=JasperFillManager.fillReport(reportModelFile,
  23. parameters,new ReportDataSource("男"));
  24. JRAbstractExporter exporter=new JRPdfExporter();
  25. //创建jasperPrint
  26. exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
  27. //生成输出流
  28. exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, outPut);
  29. //屏蔽copy功能
  30. exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED,Boolean.TRUE);
  31. //加密
  32. exporter.setParameter(JRPdfExporterParameter.IS_128_BIT_KEY,Boolean.TRUE);
  33. exporter.exportReport();
  34. outputStream=new FileOutputStream(file);
  35. outputStream.write(outPut.toByteArray());
  36. } catch (JRException e) {
  37. e.printStackTrace();
  38. }catch (Exception e) {
  39. e.printStackTrace();
  40. }finally{
  41. try {
  42. outPut.flush();
  43. outPut.close();
  44. } catch (Exception e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. }
  49. }

我们点击右键“Run JavaAppliacrion”,来执行我们的报表生成样例。
运行结果,我们在F盘下的Temp下发现了新生成的pdf文件:

双击打开,就是我们之前需要的数据的报表信息。

注意:报表Pdf时,会出现中文无法显示问题,可以设置相关组件的以下属性。需同时设置,其他字体,可自行尝试。
1、Font name :宋体
2、pdf Font name is now deprecated:STSong-Light
3、pdf Encoding : UniGB-UCS2-H(China Simplified)

至此我们实现了使用jasper提供的java的api来实现封装数据打印报表的功能。

直接在网页上下载这个PDF格式文件

/**
* 输出jasper 报表
*
* @param reportHanderImpi
* @throws AppException
*/
public void exportReport(ReportHanderImpl reportHanderImpl)
throws AppException {
this.getRequest().setAttribute(ReportConstants.REPORT_FLAG, "0");
this.getRequest().setAttribute(ReportConstants.REPORT_PATH_SYMBOL,
reportHanderImpl.getReportFile());
if(reportHanderImpl instanceof CommonReportHandler){
// 报表文件的输入流
this.getRequest().setAttribute(ReportConstants.REPORT_INPUTSTREAM,
((CommonReportHandler)reportHanderImpl).getReportInputStream());
}

List datalist = reportHanderImpl.getDataList();
JRDataSource dataSource = null;
if (datalist != null && datalist.size()>0) {
dataSource = new JRBeanCollectionDataSource(datalist);// 获取数据集
} else {
dataSource = new JREmptyDataSource();
}

this.getRequest().setAttribute(
ReportConstants.REPORT_DATASOURCE_SYMBOL, dataSource);
this.getRequest().setAttribute(ReportConstants.DISPLAY_FIELDS_SYMBOL,
reportHanderImpl.getDisplayStr());
//获取报表类型(表格 or 图形)
this.getRequest().setAttribute( ReportConstants.REPORT_TYPE_SYMBOL, reportHanderImpl.getReportType());
//报表输出格式类型(PDF or EXCEL ,HTML)
this.getRequest().setAttribute( ReportConstants.REPORT_OUT_FORMAT_SYMBOL, reportHanderImpl.getFormatType());
this.getRequest().setAttribute(ReportConstants.REPORT_PARAMETER_SYMBOL,
reportHanderImpl.getParamMap());
try {
this.getRequest().getRequestDispatcher("/JReportServlet").forward(
ServletActionContext.getRequest(),
ServletActionContext.getResponse());
} catch (ServletException e) {
new AppException(e);
} catch (IOException e) {
new AppException(e);
}
}

EG2:

@SuppressWarnings("rawtypes")
public void exportReportList1(CommonReportHandler commonReportHandler)
throws AppException {

List lst = commonReportHandler.getDataSourceList();
List<Object> dataSourceList = null;
try {
if (lst != null && lst.size() > 0) {
dataSourceList = new ArrayList<Object>();
JRDataSource dataSource = null;
for (int i = 0; i < lst.size(); i++) {
List datalist = (List) lst.get(i);
if (datalist != null && datalist.size() > 0) {
dataSource = new JRBeanCollectionDataSource(datalist);// 获取数据集
} else {
dataSource = new JREmptyDataSource();
}
dataSourceList.add(dataSource);// 组装数据源集合

}
}
this.getRequest().setAttribute(ReportConstants.REPORT_FLAG, "1");
// 设置路径
this.getRequest().setAttribute(
ReportConstants.REPORT_PATHLIST_SYMBOL,
commonReportHandler.getReportFiles());
// 获取报表类型(表格 or 图形)
this.getRequest().setAttribute("ReportType", "GraphicsReport");
// 报表输出格式类型(PDF or EXCEL ,HTML)
this.getRequest().setAttribute(
ReportConstants.REPORT_OUT_FORMAT_SYMBOL,
commonReportHandler.getFormatType());
// 设置数据源LIST
this.getRequest().setAttribute(
ReportConstants.REPORT_DATASOURCELIST_SYMBOL,
dataSourceList);
// 设置MAP参数
this.getRequest().setAttribute(
ReportConstants.REPORT_PARAMETER_SYMBOL,
commonReportHandler.getParamMap());
this.getRequest()
.getRequestDispatcher("/JReportServlet")
.forward(ServletActionContext.getRequest(),
ServletActionContext.getResponse());
} catch (ServletException e) {
throw new AppException(e);
} catch (IOException e) {
throw new AppException(e);
}
}

打印信息,通过.jasper工具将集合输出到PDF文件 然后利用打印机打印文件的更多相关文章

  1. .net上传文件,利用npoi读取文件信息到datatable里

    整理代码,.net上传文件,利用npoi读取文件到datatable里,使用了FileUpload控件,代码如下: protected void Button1_Click(object sender ...

  2. Java开发工具类集合

    Java开发工具类集合 01.MD5加密工具类 import java.security.MessageDigest; import java.security.NoSuchAlgorithmExce ...

  3. linux 压缩解压打包工具大集合

    压缩.解压缩及归档工具有很多,今天小编就整理几个大家较为常用的. compress gzip  bzip2 xz zip tar cpio 一.压缩.解压工具 用法 压缩 工具 压缩后 压缩包格式 解 ...

  4. linux命令:压缩解压打包工具大集合

    目录 (1)zip 压缩.解压缩及归档工具有很多,今天小编就整理几个大家较为常用的. compress gzip  bzip2 xz zip tar cpio 一.压缩.解压工具 用法 压缩 工具 压 ...

  5. 集合类——集合输出、栈和队列及Collections集合

    1.集合输出 在之前我们利用了toString()及get()方法对集合进行了输出,其实那都不是集合的标准输出,集合输出有四种方式:Iterator.ListIterator.Enumeration. ...

  6. 干货!IT小伙伴们实用的网站及工具大集合!持续更新!

    1.Git 还在担心自己辛辛苦苦写的代码被误删了吗?还在担心自己改错了代码不能挽回吗?还在苦恼于多人开发合作找不到一个好的工具吗?那么用Git就对 了,Git是一个开源的分布式版本控制系统,用以有效. ...

  7. Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统

    前言 写这篇博客是为了给我的愚蠢和浪费的6个小时买单! 过程原因分析 我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github.在以前的拓扑创建过程中,我都是用 ...

  8. gc 辅助打印信息

    cat xx.xml|grep GC <jvm-arg>-XX:+PrintGCDetails</jvm-arg> <jvm-arg>-XX:+PrintGCDat ...

  9. OK335xS 网络连接打印信息 hacking

    /*********************************************************************** * OK335xS 网络连接打印信息 hacking ...

随机推荐

  1. dubbo超时优先级设置

    调用超时配置的优先级 可以在多个配置项设置超时,由上至下覆盖(即上面的优先),示例如下: # 其它的参数(retries.loadbalance.actives等)的覆盖策略也一样. 提供者端特定方法 ...

  2. linux 源码编译php的参数

    ./configure --prefix=/usr/local/php-5.3.5 --with-config-file-path=/usr/local/php-5.3.5/etc --with-co ...

  3. 【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2

    一. 接口方式 接口调用采用http协议,rest请求方式: 二. 接口安全 接口安全采用Json web token (JWT)机制,基于token的鉴权机制. 1. 机制说明 基于token的鉴权 ...

  4. MySQL主从同步机制及同步中的问题处理

    http://www.drupal001.com/2012/03/mysql-master-slave-troubles/ http://www.jb51.net/article/33052.htm

  5. css:在容器内文字超过容器范围,显示一行加省略号或者两行加省略号

    一.显示一行加省略号:各浏览器兼容 .box{ width: 100px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; } ...

  6. 使用mysqlbinlog恢复指定表

    从整库备份的sql文件中导出某个表的sql语句时,vim查找到表的第一条INSERT语句后,按上下换行键计数INSERT语句的条数,然后按n yy复制,退出vim后,再新建一个文件,按p粘贴刚才的n条 ...

  7. deb 和 rpm 后缀文件 区别和安装

    https://blog.csdn.net/u010977122/article/details/52986217 下载一个ATOM 的deb的安装包

  8. 18. socket io

    类似dataservice 我们socket io 和后端交互 我们也可以做成专门的service 我们先引入 为什么不是cdn呢? 因为client就是从我们的server端拿到的socket.io ...

  9. 如何查看Python对象的属性

    在Python语言中,有些库在使用时,在网络上找到的文档不全,这就需要查看相应的Python对象是否包含需要的函数或常量.下面介绍一下,如何查看Python对象中包含哪些属性,如成员函数.变量等,其中 ...

  10. swift视图的添加及层次变动和基本动画

    // 一般的我们添加一个视图到父视图都是通过 /* let v1 = UIView(frame:CGRectMake(100,200,30,50)) self.view.addSubview(v1) ...