[信封袋套印]使用Bean DataSource製作report報表

使用JAVA要套印報表可以免費的JasperReport這個Framework,可以使用GUI的iReport來layout報表內容,最簡單的方法就是建立一個DB-Connection,然後利用SQL語法來查詢需要的資料,建立報表。JasperRepor可以輸出的格式有pdf、html、Excel、Word或是Swing的GUI畫面,再選擇列印輸出至印表機。

20.jpg

這個範例因為不需要使用到Database,所以需要使用Java-Bean來製作DataSource,雖然使用DB-Connection十分方便也很簡單就可以製作報表,可是使用Bean的DataSource靈活性比較高,不過相對的也比較不好設定。

套印信封,需要先準備一個信封,並把信封的長與寬量出來,轉換成pixel。

一、建立Java Bean

先把需要在報表裡顯示的欄位製作成一個Bean元件(地址、郵遞區號、姓名)

package com.izero.print.beans;

public class Address {
    private String name;
    private String post;
    private String address;
    
    public Address()
    {
        super();
        this.name = "";
        this.post="";
        this.address="";
    }
    public Address(String name, String post, String address) {
        super();
        this.name = name;
        this.post = post;
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPost() {
        return post;
    }
    public void setPost(String post) {
        this.post = post;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
}

二、建立一個BeanList

BeanList是用來存放Bean列表的,每一個Bean都是一個信箱套,那很多信封套就很多的Bean集合(ArrayList<Bean>),所以建立一個BeanList來當做資料來源操作。

package com.izero.print.beansList;

public class AddressList {
    public java.util.ArrayList<com.izero.print.beans.Address> addr;

    public AddressList() {
        addr = new java.util.ArrayList<com.izero.print.beans.Address>();
    }

    public void addBean(com.izero.print.beans.Address add) {
        addr.add(add);
    }

    public java.util.ArrayList<com.izero.print.beans.Address> getBeans() {
        if (this.addr.size() == 0) {
            addBean(new com.izero.print.beans.Address());
            // return null;
        }
        return this.addr;

    }
}

三、建立DataSource來與報表溝通

DataSource主要的功用是與報表溝通,當報表需要下一筆資料時會跟DataSource要資料,next()會自動增加beanList的index指標位置,如果已經沒有資料就會回報false無資料,當回報true時,會使用getFieldValue(JRField arg0)來取得相關欄位的資料內容。

package com.izero.print.datasource;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

public class AddressSource implements net.sf.jasperreports.engine.JRDataSource {

    private java.util.ArrayList<com.izero.print.beans.Address> list;
    private int index;
    private com.izero.print.beans.Address bean;

    public AddressSource() {
        com.izero.print.beansList.AddressList addrlist = 
            new com.izero.print.beansList.AddressList();
        this.list = addrlist.getBeans();
        this.index = -1;
    }

    public void add(com.izero.print.beans.Address addr) {
        this.list.add(addr);
    }

    public AddressSource(com.izero.print.beansList.AddressList addrlist) {
        this.list = addrlist.getBeans();
        this.index = -1;
    }

    @Override
    public Object getFieldValue(JRField arg0) throws JRException {
        String FieldName = arg0.getName();

        if (FieldName.equals("name")) {
            return bean.getName();
        } else if (FieldName.equals("post")) {
            return bean.getPost();
        } else if (FieldName.equals("address")) {
            return bean.getAddress();
        }
        // }
        return null;
    }

    @Override
    public boolean next() throws JRException {
        index++;
        boolean f = true;
        if (list == null || index >= list.size())
            f = false;
        else
            bean = list.get(index);
        return f;

    }
}

發表迴響