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