iReport是個很好用的免費報表制作工具。它小巧易用,也不乏擴展性。利用CustomDataSource向報表中傳數據就是它的可擴展性的一個方面。
實現CustomDataSource需實現接口JRDataSource。這里有兩個方法-public boolean next() throws JRException 和public Object getFieldValue(JRField field) throws JRException需要實現。
當然,既然是dataSource,肯定得有個乘載數據的地方,這里我用的是一個List,List中的一個對象封裝了一條記錄。iReport會利用next()遍歷這個List,從而取得所有的數據。
getFieldValue則是用來從List中取相應的值。
String fieldName = field.getName();
ArchPerInfoForm api = new ArchPerInfoForm();
api = (ArchPerInfoForm)data.get(index);
if ("A01".equals(fieldName)) {
value = api.getAac001();
} else if ("A02".equals(fieldName)) {
value = api.getAac002();
} else if ("A03".equals(fieldName)) {
value = api.getAac003();
}
return value;
這里傳來一個field,可以通過判定field的fieldName來決定取form中的什么字段。
但這樣實現很不科學,我們有很多報表需要這么處理,而這里的dataSource根本沒什么復用性。
考慮了一下,我決定抽象出一個接口。那就是ReportDataInterface,在這里定義一個方法getFieldByName(String fieldName)。這樣我把List中取得的對象當成這個接口來處理,只對這個接口進行操作。在其他地方就不必重新寫這個dataSource,只需定義一個對象,實現ReportDataInterface接口,然后把裝有數據的這些對象放到List中傳給這個DataSource,一切ok了。
對了這里我似乎忘了說一點,上面代碼中的”A01”是我在報表中定義的列的名字。
新聞熱點
疑難解答