var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20738293-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script')"/>
jutleo
欢迎走进有风的地方~~
posts - 63,  comments - 279,  trackbacks - 0
 JasperFillManager.fillReport()这个方法在使用JDBC数据源时采用一个打开的数据库连接(getConn),除此之外jasperReport给我们提供了一个JRDataSource接口,用以实现我们自己的数据源
JRDataSource接口只有两个方法
public interface JRDataSource
{
   
/**
     * 针对当前的数据源返回游标指向的下一个
元素的值,
     *

     
*/
    
public boolean next() throws JRException;
  
/**
     * 返回游标指向的当前值
     *

     
*/
    
public Object getFieldValue(JRField jrField) throws JRException;
}
JRBeanCollectionDataSource
此种方式是最简单的一种,查看API我们就可以发现,JRBeanCollectionDataSource继承JRAbstractBeanDataSource类,而JRAbstractBeanDataSource是一个抽象类它间接的实现了JRDataSource这个接口,所以我们就可以不用自己去实现next()/getFieldValue()这两个方法了。
        看到JRBeanCollectionDataSource这个类名大概就知道怎么用了吧!
        我们的模板文件还是上篇的JDBC数据源的模板,只是没有了查询语句,手工建立所需的几个字段(域)
新建一vo对象Person.java,最基本的getter、setter方法
package org.bulktree.ireport.customdata;

/**
 * custom data
 * 
 * 
@author bulktree Email: laoshulin@gmail.com @ Nov 7, 2008
 
*/

public class Person {
    
private String pid;
    
private String name;
    
private String sex;
    
private String age;
    
private String password;
    
private String department;

    
public Person(String pid, String name, String sex, String age, String password,
            String department) 
{
        
this.pid = pid;
        
this.name = name;
        
this.sex = sex;
        
this.age = age;
        
this.password = password;
        
this.department = department;
    }


    
public Person() {

    }


    
}


下来准备数据
Person p1 = new Person();
        p1.setAge(
"23");
        p1.setDepartment(
"ISoftStone");
        p1.setName(
"LAOSHULIN");
        p1.setPassword(
"123456789");
        p1.setPid(
"2008040516058772hj");
        p1.setSex(
"man");
既然它是一个BeanCollection我们 就来一个从conllection吧!
List<Person> list = new ArrayList<Person>();
        list.add(p1);
查看API,JRBeanCollectionDataSource的构造函数
public JRBeanCollectionDataSource(Collection beanCollection)
    
{
        
this(beanCollection, true);
    }

    
/**
     *
     
*/

    
public JRBeanCollectionDataSource(Collection beanCollection, boolean isUseFieldDescription)
    
{
        
super(isUseFieldDescription);
        
        
this.data = beanCollection;

        
if (this.data != null)
        
{
            
this.iterator = this.data.iterator();
        }

    }
看看描述我们使用第一个
JRDataSource datesource = new JRBeanCollectionDataSource(list);
这个数据源就构造完毕了,很简单吧!这样报表就可以预览了,完整的代码如下:
package org.bulktree.ireport.customdata;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JRViewer;
import net.sf.jasperreports.view.JasperViewer;

public class JasperReportDemo {
    
public static void main(String[] args) throws Exception {
        JasperReportDemo jrd 
= new JasperReportDemo();
        jrd.reportMethod(jrd.getMap());
    }


    
public void reportMethod(Map map) throws Exception {
        JasperReport jasperReport 
= null;
        JasperPrint jasperPrint 
= null;

        
try {
            
/*
             * File file = new File("Person.jrxml"); InputStream in = new
             * FileInputStream(file); // 编译报表 jasperReport =
             * JasperCompileManager.compileReport(in);
             
*/

            
// 实际中编译报表很耗时,采用Ireport编译好的报表
            jasperReport = (JasperReport) JRLoader
                    .loadObject(
"D:\\workspace\\Person.jasper");
            
// 填充报表
            jasperPrint = JasperFillManager
                    .fillReport(jasperReport, map, getDataSource());
            
// JasperExportManager.exportReportToHtmlFile(jasperPrint,
            
// "test.html");
            JasperViewer jasperViewer = new JasperViewer(jasperPrint);
            jasperViewer.setVisible(
true);
        }
 catch (JRException e) {
            e.printStackTrace();
        }
 catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }


    
public Map getMap() {

        Map map 
= new HashMap();
        map.put(
"reportTitle""laoshulin");
        
return map;
    }


    
public JRDataSource getDataSource() throws Exception {

        
// 自定义数据源
        Person p1 = new Person();
        p1.setAge(
"23");
        p1.setDepartment(
"ISoftStone");
        p1.setName(
"LAOSHULIN");
        p1.setPassword(
"123456789");
        p1.setPid(
"2008040516058772hj");
        p1.setSex(
"man");
        List
<Person> list = new ArrayList<Person>();
        list.add(p1);

        JRDataSource datesource 
= new JRBeanCollectionDataSource(list);

        
return datesource;
    }

}

看看效果吧!
简简单单的几行代码就可以完成一个简单的报表,我们看到的这些工具栏图表还有窗口的一些标题啊等等都可以自己的定制哦,下来慢慢介绍!
posted on 2008-12-12 09:56 凌晨风 阅读(6278) 评论(10)  编辑  收藏 所属分类: iReport + JasperReport 系列

FeedBack:
# re: iReport+jasperReport之BEAN数据源
2008-12-12 11:38 | 杨爱友
如果某列显示的是公司地址,有的公司地址“变态”,多大200个汉字,有的只有十几个,那你能动态设定这一列的宽度和高度吗?
以前我没有做到,只能设定足够的宽度和高度来显示这个地址。  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源
2008-12-12 12:55 | 凌晨风
哈哈 这个问题是很多报表都会出现的问题,那要看你的纸张了,要是纸张不限制的话你可以设置尽可能的大些防止撑开影响美观,要是想动态改变也不是很难,jasperReport可以动态的改变你所涉及的任何域的所有属性,所以你说的那个就很容易实现,这些东西我都有测试过,之后有空会都写出来的  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源
2009-01-06 16:05 | zsyzk@qq.com
JasperViewer jasperViewer = new JasperViewer(jasperPrint);
jasperViewer.setVisible(true);

直接这样打开预览,关闭后,会把WEB服务都关掉呢,怎么解决这个问题???  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源
2009-01-07 09:03 | 凌晨风
怎么会关闭web服务呢?那你要检查一下你的代码了,建议你实现自己的JasperViewer  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源[未登录]
2009-03-27 17:40 | 西西

这样写就不会关掉了
JasperViewer jasperViewer = new JasperViewer(jasperPrint,false);   回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源
2009-08-26 11:03 | 痞子

JasperViewer jrview=new JasperViewer(jasperPrint,false);
就不会关闭服务了

  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源[未登录]
2009-09-02 11:30 | footprint
博主能不能提供一下XML文件呀?DETAIL域总是空白  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源
2014-04-19 10:02 | rober
@footprint
就是,LZ XML配置给一个吧,不知道怎么配置啊~~~  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源
2014-05-15 14:09 | 周研
List<OauthApi> list = reportService.getApiList();
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(
list);

当list为空时,生成的pdf或者excel文件不会报错,但是没有了title和Column Header了  回复  更多评论
  
# re: iReport+jasperReport之BEAN数据源[未登录]
2014-11-12 17:17 | hh
@凌晨风
瞎说,是可以遍历所有燃素,但不能改变属性,因为一旦模板本件确定,就无法改,只能改变其中的值  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用链接

留言簿(11)

我参与的团队

随笔分类

随笔档案

文章分类

文章档案

新闻分类

新闻档案

收藏夹

围脖

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜