1)定制报表格式。
  有二种方式,一种就是写jrxml文件,其实就是xml文件,只不过是后缀名不一样罢了。另一种方式更直接,就是生成一个JasperDesign类的实例,在japsperDesign中自己定义模板。jrxml文件也是通过一个JRXmlLoad加载过来,转成JasperDesign类的实例。也就是说写jrxml文件还需要进行解析,加载。现实中我们使用的报表一般格式比较固定,因而可以通过先使用iReport工具生成模板,再加载解析的方式。这种方式简单,而且可见性强。
2)填充数据。
  在最新版(2007.4.30发布)的jasperReports1.3.3中,支持了很多的格式,包括了对于Hibernate的支持。填充数据对于我们经常使用的来说,一般是二种方式,一种方式是通过JDBC连接提供数据源,一种就是通过javaBean的集合提供数据源。当然还有web Service的xml文件提供的。我的建议是,如果你的程序中的统计直接使用Jdbc就可以完成,那么就使用jdbc数据源的方法,反之,使用javaBean的集合是不错的选择,因为这样不会在意你的数据的来源,你也可以任意处理,比如说,要通过权限检查的数据才在报表中生成的话,就可以过滤到不符合权限的数据。
3)显示或打印。
  显示,即将JasperReport生成的文件直接显示出来,打印所使用的方式其实就是生成文件,然后调用打印来对文件进行打印。
看起来是不是很简单,对,确实很简单。
笔者主要从事基于B/S模式的开发,相信大部分人的使用也是基于web进行使用。故笔者对于基于web的开发进行详细讲述。

1、工程环境配置。
  将以下包加入WEB-INF/lib中。
  commons-beanutils-1.7.jar;commons-collections-2.1.jar;commons-digester-1.7.jar;commons-logging-1.0.2.jar;commons-logging-api-1.0.2.jar;itext-1.3.1.jar;jasperreports-1.3.3.jar;jdt-compiler-3.1.1.jar;jxl-2.6.jar;png-encoder-1.5.jar;poi-2.0-final-20040126.jar
   以上包是jasperReport必须。
2、iReport的安装
   这个很简单,直接下一步就可以了。
3、使用iReport生成 .jasper文件
  .jasper是经过编译的japserReport模板,即.jrxml编译后的。
  对于iReport的使用网络上已经有了详细的中文的文档,具体可以下载附件查看。使用.jasper文件可以避免在系统中再进行编译,增加系统的压力。
4、数据填充
  数据填充是相对于比较重要的一步,数据填充的目的是为了将数据填充进去,生成一个JapserPrint对象。笔者在之前已经阐述过,现在主要是基于关系型数据库(比较简单的,没有权限控制的),以及基于JavaBean Collection进行数据填充。进行数据填充的基本就是一定要实现JRDataSource,JRDataSource定义了二个方法,一个是指针移动的方法next(),另一个是取值的getFieldValue()方法,用来取值填充。
  对于关系型数据库,即直接利用数据库的表来生成报表的,只需要传入一个Java Connection即可。JasperReport已经有了个默认的实现的JRDataSource的接口了。对于Java Conncetion的获得,笔者建议使用工厂方法或者使用Spring方式来获得。可以参照笔者写的如下:

java 代码
  1. /**
  2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.
  3. * @author Jimmy.Shine 2007-5-11
  4. */
  5. package cn.com.reachway.framework.report;
  6. import java.sql.Connection;
  7. import java.sql.DriverManager;
  8. import cn.com.reachway.framework.exception.JasperReportException;
  9. /**
  10. * Used for get a JDBC connection for Jasper Report
  11. */
  12. public class JDBCConnection {
  13. /**
  14. * Which Jdbc driver were used. Like: "net.sourceforge.jtds.jdbc.Driver"
  15. */
  16. private String jdbcDriver;
  17. /**
  18. * The jdbc url,define which database server,which db. Like:
  19. * "jdbc:jtds:sqlserver://192.168.1.50:1433;DatabaseName=JAVA5;SelectMethod=Cursor"
  20. */
  21. private String jdbcUrl;
  22. private String dbUser;
  23. private String dbPassword;
  24. public String getDbPassword() {
  25. return dbPassword;
  26. }
  27. public void setDbPassword(String dbPassword) {
  28. this.dbPassword = dbPassword;
  29. }
  30. public String getDbUser() {
  31. return dbUser;
  32. }
  33. public void setDbUser(String dbUser) {
  34. this.dbUser = dbUser;
  35. }
  36. public String getJdbcDriver() {
  37. return jdbcDriver;
  38. }
  39. public void setJdbcDriver(String jdbcDriver) {
  40. this.jdbcDriver = jdbcDriver;
  41. }
  42. public String getJdbcUrl() {
  43. return jdbcUrl;
  44. }
  45. public void setJdbcUrl(String jdbcUrl) {
  46. this.jdbcUrl = jdbcUrl;
  47. }
  48. public JDBCConnection() {
  49. super();
  50. }
  51. /**
  52. * Get the Connection
  53. * @return connection
  54. * @throws JasperReportException
  55. */
  56. public Connection getConnection() throws JasperReportException {
  57. Connection con;
  58. try {
  59. check();
  60. Class.forName(this.jdbcDriver);
  61. con = DriverManager.getConnection(this.jdbcUrl, this.dbUser, this.dbPassword);
  62. return con;
  63. catch (Exception e) {
  64. e.printStackTrace();
  65. throw new JasperReportException("Get JDBC Connection Error");
  66. }
  67. }
  68. /**
  69. * Check the Configure
  70. * @throws JasperReportException
  71. */
  72. private void check() throws JasperReportException {
  73. if (this.jdbcDriver == null || this.jdbcDriver.equals("") || this.jdbcUrl == null || this.jdbcUrl.equals("")
  74. || this.dbUser == null || this.dbUser.equals("") || this.dbPassword == null) {
  75. throw new JasperReportException("Jdbc Configure error!");
  76. }
  77. }
  78. }
java 代码
  1. /**
  2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.
  3. * @author Jimmy.Shine 2007-5-14
  4. */
  5. package cn.com.reachway.framework.report.dataSource;
  6. import net.sf.jasperreports.engine.JRDataSource;
  7. import net.sf.jasperreports.engine.JRException;
  8. import net.sf.jasperreports.engine.JRField;
  9. /**
  10. * 报表的dataSource的基类,所有利用DataSource产生报表的继承此类
  11. */
  12. public abstract class ReportDataSource implements JRDataSource {
  13. /**
  14. * 取值
  15. */
  16. public abstract Object getFieldValue(JRField jrField) throws JRException;
  17. /**
  18. * 指针移动
  19. */
  20. public abstract boolean next() throws JRException;
  21. }

  这样可以共用配置文件中的jdbc连接的相关参数。
  对于其它的数据源,JavaBean Collection,笔者采用了一个抽象类,使用抽象类的目的,是为了使开发者尽可能不用直接接触jasperReport(此为笔者自己的方式,笔者是PM,为了考虑底下的人的开发)。以下为抽象类以及笔者提供的一个sample:

  1. /**
  2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.
  3. * @author Jimmy.Shine 2007-5-14
  4. */
  5. package cn.com.reachway.framework.report.dataSource;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import net.sf.jasperreports.engine.JRException;
  9. import net.sf.jasperreports.engine.JRField;
  10. /**
  11. * 利用JavaBean Collection生成ReportDataSource的例子
  12. */
  13. public class ReportDataSourceSample extends ReportDataSource {
  14. private List docs = new ArrayList();
  15. private int index = -1;
  16. public ReportDataSourceSample() {
  17. for (int i = 0; i < 10; i++) {
  18. Document doc = new Document("ViewTimes is:" + i, i);
  19. this.docs.add(doc);
  20. }
  21. }
  22. // 内部类,作为demo时使用
  23. private class Document {
  24. private String name;
  25. private int viewTimes;
  26. public String getName() {
  27. return name;
  28. }
  29. public void setName(String name) {
  30. this.name = name;
  31. }
  32. public int getViewTimes() {
  33. return viewTimes;
  34. }
  35. public void setViewTimes(int viewTimes) {
  36. this.viewTimes = viewTimes;
  37. }
  38. public Document() {
  39. }
  40. public Document(String name, int viewTimes) {
  41. this.name = name;
  42. this.viewTimes = viewTimes;
  43. }
  44. }
  45. public List getDocs() {
  46. return docs;
  47. }
  48. public void setDocs(List docs) {
  49. this.docs = docs;
  50. }
  51. @Override
  52. public Object getFieldValue(JRField jrField) throws JRException {
  53. String fieldName = jrField.getName();
  54. Document doc = this.docs.get(index);
  55. if ("name".equals(fieldName)) {
  56. return doc.getName();
  57. }
  58. if ("viewTimes".equals(fieldName)) {
  59. return doc.getViewTimes();
  60. }
  61. return null;
  62. }
  63. @Override
  64. public boolean next() throws JRException {
  65. index++;
  66. return (index < this.docs.size());
  67. }
  68. }
java 代码

以上的例子应当很清楚的写明了如何生成数据源。
对于数据源的填充,笔者使用了二个类,分别用来对应使用Connction及JavaBean Collection进行填充。

java 代码
  1. /**
  2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.
  3. * @author Jimmy.Shine 2007-5-12
  4. */
  5. package cn.com.reachway.framework.report.jasperPrint;
  6. import java.io.File;
  7. import java.sql.Connection;
  8. import java.util.Map;
  9. import net.sf.jasperreports.engine.JRException;
  10. import net.sf.jasperreports.engine.JasperFillManager;
  11. import net.sf.jasperreports.engine.JasperPrint;
  12. import net.sf.jasperreports.engine.JasperReport;
  13. import net.sf.jasperreports.engine.util.JRLoader;
  14. import cn.com.reachway.framework.exception.JasperReportException;
  15. /**
  16. * 使用报表模板及数据等来生成JapserPrint
  17. */
  18. public class JasperPrintWithConnection {
  19. /** 传入的参数 */
  20. private Map params;
  21. /** 模板文件的地址 */
  22. private String reportFilePath;
  23. /** JDBC connection */
  24. private Connection con;
  25. public Connection getCon() {
  26. return con;
  27. }
  28. public void setCon(Connection con) {
  29. this.con = con;
  30. }
  31. public Map getParams() {
  32. return params;
  33. }
  34. public void setParams(Map params) {
  35. this.params = params;
  36. }
  37. public String getReportFilePath() {
  38. return reportFilePath;
  39. }
  40. public void setReportFilePath(String reportFilePath) throws JasperReportException {
  41. if (reportFilePath == null || !reportFilePath.endsWith(".jasper"))
  42. throw new JasperReportException("您传入的模板文件格式不对,请传入以.jasper为后缀的文件!");
  43. this.reportFilePath = reportFilePath;
  44. }
  45. public JasperPrintWithConnection() {
  46. super();
  47. }
  48. public JasperPrintWithConnection(String reportFilePath, Map params, Connection con) throws JasperReportException {
  49. if (reportFilePath == null || !reportFilePath.endsWith(".jasper"))
  50. throw new JasperReportException("模板文件格式不对,请传入以.jasper为后缀的文件!");
  51. if (con == null)
  52. throw new JasperReportException("Conncetion不应当为null!");
  53. this.setReportFilePath(reportFilePath);
  54. this.setParams(params);
  55. this.setCon(con);
  56. }
  57. /**
  58. * 取得JasperPrint
  59. * @return
  60. * @throws JasperReportException
  61. */
  62. public JasperPrint getJasperPrint() throws JasperReportException {
  63. File reportFile = new File(this.reportFilePath);
  64. if (!reportFile.exists())
  65. throw new JasperReportException("传入的模板文件不存在!");
  66. try {
  67. // Load编译好的模板
  68. JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
  69. // 进行数据填充
  70. JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, this.params, this.con);
  71. return jasperPrint;
  72. catch (JRException jre) {
  73. jre.printStackTrace();
  74. throw new JasperReportException("在进行数据填充时发生了错误中,请检查是否是数据库连接错误或者是用来填充的参数map有误!");
  75. }
  76. }
  77. }
  1. /**
  2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.
  3. * @author Jimmy.Shine 2007-5-14
  4. */
  5. package cn.com.reachway.framework.report.jasperPrint;
  6. import java.io.File;
  7. import java.util.Map;
  8. import net.sf.jasperreports.engine.JRDataSource;
  9. import net.sf.jasperreports.engine.JRException;
  10. import net.sf.jasperreports.engine.JasperFillManager;
  11. import net.sf.jasperreports.engine.JasperPrint;
  12. import net.sf.jasperreports.engine.JasperReport;
  13. import net.sf.jasperreports.engine.util.JRLoader;
  14. import cn.com.reachway.framework.exception.JasperReportException;
  15. /**
  16. *
  17. */
  18. public class JasperPrintWithDataSource {
  19. /** 传入的参数 */
  20. private Map params;
  21. /** 模板文件的地址 */
  22. private String reportFilePath;
  23. /** dataSrouce */
  24. private JRDataSource dataSource;
  25. public JRDataSource getDataSource() {
  26. return dataSource;
  27. }
  28. public void setDataSource(JRDataSource dataSource) {
  29. this.dataSource = dataSource;
  30. }
  31. public Map getParams() {
  32. return params;
  33. }
  34. public void setParams(Map params) {
  35. this.params = params;
  36. }
  37. public String getReportFilePath() {
  38. return reportFilePath;
  39. }
  40. public void setReportFilePath(String reportFilePath) throws JasperReportException {
  41. if (reportFilePath == null || !reportFilePath.endsWith(".jasper"))
  42. throw new JasperReportException("您传入的模板文件格式不对,请传入以.jasper为后缀的文件!");
  43. this.reportFilePath = reportFilePath;
  44. }
  45. public JasperPrintWithDataSource() {
  46. super();
  47. }
  48. public JasperPrintWithDataSource(String reportFilePath, Map params, JRDataSource dataSource)
  49. throws JasperReportException {
  50. if (reportFilePath == null || !reportFilePath.endsWith(".jasper"))
  51. throw new JasperReportException("模板文件格式不对,请传入以.jasper为后缀的文件!");
  52. if (dataSource == null)
  53. throw new JasperReportException("DataSource不应当为null!");
  54. this.setReportFilePath(reportFilePath);
  55. this.setParams(params);
  56. this.setDataSource(dataSource);
  57. }
  58. /**
  59. * 取得JasperPrint
  60. * @return
  61. * @throws JasperReportException
  62. */
  63. public JasperPrint getJasperPrint() throws JasperReportException {
  64. File reportFile = new File(this.reportFilePath);
  65. if (!reportFile.exists())
  66. throw new JasperReportException("传入的模板文件不存在!");
  67. try {
  68. // Load编译好的模板
  69. JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
  70. // 进行数据填充
  71. JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, this.params, this.dataSource);
  72. return jasperPrint;
  73. catch (JRException jre) {
  74. jre.printStackTrace();
  75. throw new JasperReportException("在进行数据填充时发生了错误中,请检查是否是数据库连接错误或者是用来填充的参数map有误!");
  76. }
  77. }
  78. }
java 代码

其中使用的JasperReportException为笔者定义的异常,用来统一处理报表异常。

5、报表产生
  报表产生是程序中最终可见的一部分,在jasperReport的demo中,大部分中使用了jasperReport的net.sf.jasperreports.j2ee.servlets.*中的类来生成。其实这也算是开源的产品的一个问题,其实jasperReport提供的report的工具,只能算是demo级别的,不能算是产品级别的。相信很多的朋友在使用的时候就碰上无法生成的问题。笔者在此基础上封装了一下。
具体参见以下:

java 代码
  1. /**
  2. * @copyRight Beijing Tsing-Tech Reachway Software Co.,Ltd.
  3. * @author Jimmy.Shine 2007-5-12
  4. */
  5. package cn.com.reachway.framework.report.export;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. import java.sql.Connection;
  9. import java.util.Map;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import net.sf.jasperreports.engine.JRDataSource;
  13. import net.sf.jasperreports.engine.JRExporterParameter;
  14. import net.sf.jasperreports.engine.JasperPrint;
  15. import net.sf.jasperreports.engine.export.JRHtmlExporter;
  16. import net.sf.jasperreports.engine.export.JRHtmlExporterParameter;
  17. import net.sf.jasperreports.j2ee.servlets.ImageServlet;
  18. import cn.com.reachway.framework.exception.JasperReportException;
  19. import cn.com.reachway.framework.report.jasperPrint.JasperPrintWithConnection;
  20. import cn.com.reachway.framework.report.jasperPrint.JasperPrintWithDataSource;
  21. /**
  22. * 利用报表生成HTML格式报表
  23. */
  24. public class HTMLExport {
  25. /**
  26. * 导出报表
  27. *
  28. * @param request
  29. * @param response
  30. * @param reportFilePath
  31. * @param params
  32. * @param con
  33. * @throws JasperReportException
  34. */
  35. public void export(HttpServletRequest request, HttpServletResponse response, String reportFilePath, Map params,
  36. Connection con) throws JasperReportException {
  37. try {
  38. PrintWriter out = response.getWriter();
  39. try {
  40. response.setContentType("text/html;charset=UTF-8");
  41. JasperPrint jasperPrint = new JasperPrintWithConnection(reportFilePath, params, con).getJasperPrint();
  42. // 使用JRHtmlExproter导出Html格式
  43. JRHtmlExporter exporter = new JRHtmlExporter();
  44. request.getSession().setAttribute(ImageServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
  45. exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
  46. exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
  47. exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "./servlets/image?image=");
  48. exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
  49. // 导出
  50. exporter.exportReport();
  51. catch (Exception e) {
  52. e.printStackTrace();
  53. throw new JasperReportException("在导出Html格式报表时发生错误!");
  54. finally {
  55. if (out != null) {
  56. try {
  57. out.close();
  58. catch (Exception e) {
  59. }
  60. }
  61. }
  62. catch (IOException ioe) {
  63. ioe.printStackTrace();
  64. throw new JasperReportException("")
  65. }

JasperReport报表设计总结相关推荐

  1. JasperReport报表设计4

    在JRXML模板(或JRXML文件)中的JasperReport 都是标准的 XML文件,以.JRXML扩展.所有JRXML文件包含标签<jasperReport>,作为根元素.这反过来又 ...

  2. jasperreport mysql_JasperReport报表设计

    在JRXML模板(或JRXML文件)中的JasperReport 都是标准的 XML文件,以.JRXML扩展.所有JRXML文件包含标签,作为根元素.这反过来又包含许多子元素(所有这些都是可选的).J ...

  3. 使用ireport设计jasperreport报表模板

    1.了解ireport与jasperreport的区别. 2.怎样使用ireport绘制报表模板. 3.了解ireport的几个概念. 4.ireport的深入探讨. 1.ireport 是一个专门用 ...

  4. 使用ireport设计jasperreport报表模板,以及简单的设计使用案例

    1.了解ireport与jasperreport的区别. 2.怎样使用ireport绘制报表模板. 3.了解ireport的几个概念. 4.ireport的深入探讨. 1.ireport 是一个专门用 ...

  5. jasperReport Studio java报表设计(详细)

    一.环境搭建 在spring-mvc.xml加入 <!-- jasperReports--><import resource="classpath*:spring-mvc- ...

  6. PHP通过PHP/JAVA Bridge调用JasperReport报表

    本文说到的是用PHP-Java-Bridge技术实现JasperReport web报表的输出. JasperReport(http://jasperforge.org/),是一个强大.灵活的报表生成 ...

  7. 使用Jaspersoft Studio制作JasperReport报表(三)简单的学生分数统计报表

    前面介绍了新建一个报表的基本流程和报表工具的基本使用,现在就不啰嗦了,直接来个简单的报表实战一下 数据准备 1.数据库数据源准备:新建student数据库表,数据包括id,班级,生日,分数,姓名字段, ...

  8. 如何实现报表设计中的高精度报表套打?

    在许多行业中票据具有严格的行业规范,格式是无法修改的,一旦格式有所改动,票据数据就会失效无效.因此通常情况下,我们会在预先设计好格式的报表的打印版中,手动填写数据信息,如常见的各类账本,报销单等填写数 ...

  9. 基于VB和EXCEL的报表设计及打印

    基于VB和EXCEL的报表设计及打印           文/朱诗兵 高栓               在现代管理信息系统的开发中,经常涉及到数据信息的分析.加工,       最终还需把统计结果形成 ...

最新文章

  1. java贪吃蛇不能回头,儿时回忆!泪流满面,Java 实现贪吃蛇游戏的示例(附代码)...
  2. python中的装饰器有哪些-python中的装饰器
  3. Silverlight 3 Tools 中文版地址
  4. 单防区扩展模块怎么用_Zens推出模块化可扩展无线充电器 可为6台设备同时供电...
  5. CentOS安装和配置FTP
  6. c#队列取值_在队列的开头获取对象– C#中的窥视操作
  7. 其他大神的配置 nginx 配置参考
  8. 强制浏览器重定向到另一页
  9. MIUI11新版本推送,小米10 Pro跑分轻松突破60万
  10. python encode和decode函数说明
  11. 使用python制作字符视频(蔡徐坤唱跳rap字符视频)
  12. 【问题记录】pip 安装报错 Failed to establish a new connection
  13. php表格显示成绩,学生成绩表格展示
  14. vue + echarts 之饼形图
  15. C#调用第三方dll生成exe被dep拦截
  16. 练习4-7 求e的近似值
  17. python 写个网页爬虫
  18. 【EFS】NV65633-LTE搜网能力的NV值、格式、配置
  19. html在线表单生成,html在线编辑表格
  20. python中的序列是什么_Python中的序列

热门文章

  1. 排除表_【收藏】常见电气故障及排除故障方法
  2. pytorch对数据集进行重新采样
  3. 《大型网站架构技术》系列分享专栏
  4. GNS3全面详解系列-GNS3的前世今生
  5. 从714里连续减去6减几次得0_小学数学1—6年级基础知识整理 ,预习复习都能用...
  6. android shell强制删除文件夹_原来手机中的这些文件可以删除,难怪手机越用越卡!...
  7. SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.解决方法
  8. vue切换路由的时候,如何让右侧滚动条滚动到顶部呢?
  9. Perl -- 使用Perl 读取和发送邮件
  10. java 分布式事务处理