读书人

jasperReport开源表格管窥(续一)

发布时间: 2012-11-05 09:35:12 作者: rapoo

jasperReport开源报表管窥(续一)

4、建张报表
?当上面的配置都完成后,接下来做我们最想做的事:建报表。
a、从菜单“档案-->开启新档”点开,在弹出框中输入报表名称,名称还是阿猫阿狗随便填,纸张我就用默认的A4纸了,反正先A3,我们的破打印机也打不出来,呵呵。其他选项都不用改,直接“OK”就行了。出来空报表是这样滴:
?
jasperReport开源表格管窥(续一)
??
b、从菜单“Data→报表查询”点开,设定查询语句。在“Report query”框中,点“query designer”按钮,出来查询设计窗口,在其中选中我们建的表“Product”,双击,设计器右边就会出来表结构,每个字段前有复选框用以选择要处理的字段(这个地方有一点不爽的就是需要一个个选字段,没有一个全选)。然后就“OK”了。
?
再返回到“Report query”设计器上来,刚才生成的SQL已经填充到这里面了,如果没什么要改的,就OK返回了。返回到报表设计窗口,还是白白的一片,刚才生成的SQL去哪里了?
c、给报表添加字段。从工具栏上选择“report fields, variables and parameters”那个按钮(别说找不到),点开。把Fields里面的字段一个个拖到报表设计区。
d、报表设计过程(这里省略xxx字),设计后效果如下:
?

e、从菜单“建立→执行报表(使用动态连接)”点开,预览一下我们的杰作。当然,也可以点开“建立→执行报表”,区别就是后者不带数据预览,预览的效果是这样的:
?
f、到这里,报表基本完成了,接下来,只要把生成的XXX.jrxml和XXX.jasper放到我们的应用中去,再写几句代码调用一下就可以了,至于代码如何写,下面接着讲。
5、在应用中使用报表
?报表设计好了,如何在程序中使用报表呢,代码挺简单的,而且基本是流程化的,我做的测试代码如下:
package com.javaeye.demo.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import com.lowagie.text.pdf.PdfWriter;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.export.JRPdfExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;

/**
?* <p>Title: ShineTax纳税申报辅助系统</p>
?*
?* <p>Description: ShineTax纳税申报辅助系统</p>
?*
?* <p>Copyright: Copyright (c) 2008</p>
?*
?* <p>Company: WSGroup</p>
?*
?* @author ShengYoufu(wdmsyf@yahoo.com)
?* @version 1.0
?*/
public class JasperReportJDBCTest {
? public JasperReportJDBCTest() {
? }

? protected Connection getConnection() {
??? Connection conn = null;
??? try {
????? Class.forName("com.mysql.jdbc.Driver");
????? conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/keyshop", "root", "");
??? } catch (SQLException ex) {
????? ex.printStackTrace();
??? }catch(ClassNotFoundException ex){
????? ex.printStackTrace();
??? }
??? return conn;
? }

? protected void close(Connection conn) {
??? if (conn != null) {
????? try {
??????? if (!conn.isClosed()) {
????????? conn.close();
??????? }
????? } catch (SQLException ex) {
??????? ex.printStackTrace();
????? }
????? conn = null;
??? }
? }

? protected byte[] genReport(Connection conn) {
??? if (conn == null)
????? throw new RuntimeException("Generate PDF report failed. Database connection is null.");
???
//获取报表模板
??? URL url = this.getClass().getResource("/reports/product.jasper");
??? System.out.println("测试报表模板: " + (url == null ? "未取到" : url.getPath()));
??? if (url == null || url.getPath() == null) {
????? throw new RuntimeException("Generate PDF report failed, the report templet file not found.");
??? }
??? String path = url.getFile();
??? path = path.substring(0, path.lastIndexOf("/"));
??? File reportFile = new File(url.getFile());
??? if (!reportFile.exists()) {
????? throw new RuntimeException("Generate PDF report? failed, the report templet file not exist.");
??? }
?
?//构造生成PDF所需要的参数,这些参数根据需要自行决定选择哪些
??? Map parameters = new HashMap();
??? parameters.put(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);??? //设定PDF需要加密
??? parameters.put(JRPdfExporterParameter.IS_128_BIT_KEY, Boolean.TRUE); //使用128位加密
??? parameters.put(JRPdfExporterParameter.USER_PASSWORD, "");???????????? //查看PDF的所需的密码
??? parameters.put(JRPdfExporterParameter.OWNER_PASSWORD, "www.xm-l-tax.gov.cn");??? //PDF所有者的密码
??? parameters.put(JRPdfExporterParameter.METADATA_TITLE, "XXX商场货物库存日报表"); //PDF的META标题
??? parameters.put(JRPdfExporterParameter.METADATA_SUBJECT, "XXX商场");???????????? //PDF的META主题
??? parameters.put(JRPdfExporterParameter.METADATA_KEYWORDS, "商场,货物,库存,日报表");//PDF关键字
??? parameters.put(JRPdfExporterParameter.METADATA_AUTHOR, "wdmsyf@yahoo.com");????? //PDF的作者
??? parameters.put(JRPdfExporterParameter.METADATA_CREATOR, "wdmsyf@yahoo.com");   //PDF创建者
??? parameters.put(JRPdfExporterParameter.PERMISSIONS, PdfWriter.AllowFillIn);?????? //PDF允许填写

??? byte[] reportData = null;
try {
? //载入报表模板
????? //JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
????? //生成PDF文件的byte数组
????? reportData = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, conn);
??? } catch (JRException ex) {
????? throw new RuntimeException("Generate PDF report failed.", ex);
??? }
??? return reportData;
? }
?
? protected void saveReport(byte[] data, String fileName){
??? if(data==null || data.length<1)
????? throw new RuntimeException("Generate PDF report failed. No data found.");
??? try{
????? FileOutputStream fos = new FileOutputStream(fileName);
????? fos.write(data);
????? fos.flush();
????? fos.close();
??? }catch(FileNotFoundException ex){
????? ex.printStackTrace();
??? }catch(IOException ex){
????? ex.printStackTrace();
??? }
? }
?
? public void genAndSaveReport(){
??? Connection conn = this.getConnection();
??? byte[] reportData = this.genReport(conn);
??? saveReport(reportData, "c:/货物库存日报表.pdf");
? }

? public static void main(String[] args) {
??? JasperReportJDBCTest test = new JasperReportJDBCTest();
??? test.genAndSaveReport();
? }
}
大家注意红色部分,就是调用报表模板生成PDF的代码。生成PDF如下:

1 楼 xyzhi_521 2009-04-16 我也在做jasperreport报表,我用3.5.0+struts2做的,程序一切正常,但是就是不显示从数据库里面读出来的数据,只是显示Null,用了博主的一部分代码,还是不行,请楼主帮忙解决下,如果有写好的例子更好,我的e-mail:xyzhi_521@126.com,qq:393213144

读书人网 >开源软件

热点推荐