ireport 使用list数据源
生活随笔
收集整理的這篇文章主要介紹了
ireport 使用list数据源
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
剛開始學ireport是使用sql作為數據源,因為直接sql是最簡單也最容易上手的,但是sql已經無法滿足現在的業務需求了,于是乎尋找其他的解決方案,于是乎找到了JRDataSource數據源。個人覺得sql數據源最簡單,其次就是JRDataSource數據源了。
一、使用JRDataSource數據源首先要實現 JRRewindableDataSource 接口
/*** @Author: BlueSky* @CreateTime: 2020-01-06 13:50* @Description:*/import java.util.List;import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField; import net.sf.jasperreports.engine.JRRewindableDataSource;public class GenericDataSource implements JRRewindableDataSource{int index;List<PrintRecord> records;public GenericDataSource(List<PrintRecord> records) {this.records = records;this.index = -1;}@Overridepublic Object getFieldValue(JRField jrField) throws JRException {String fieldName = jrField.getName();return records.get(index).getValue(fieldName);}@Overridepublic boolean next() throws JRException {++index;return index < records.size();}public void moveFirst() {} }二、新建一個通用打印的類
/*** @Author: BlueSky* @CreateTime: 2020-01-06 13:51* @Description:*/import java.util.HashMap; import java.util.Map;public class PrintRecord {public static final int KEY_NOT_FOUND = -1;Map<String, Object> vals;public PrintRecord() {vals = new HashMap<String, Object>();}public void setValue(String key, Object value) {vals.put(key, value);}public Object getValue(String key) {Object val = vals.get(key);if (val == null)return "";elsereturn val;}public int getKeyNum() {return vals.size();} }三、在java中封裝所需要打印的參數數據(ps:詳情見第六步代碼)
四、在需要打印的報表中新建數據接收參數
五、剛剛新建接收的list數據還無法直接在當前輸出,我們還需要新建一個子報表,通過它來輸出list內容
六、查看成果
public static void main(String args[]) {try {// 獲取源文件String path = "C:\\Users\\25109\\Desktop\\ \\iReportModel\\銷售合同報表√\\javabean\\testBean.jasper";TestModel testModel = new TestModel();testModel.setProvice("湖南");testModel.setCity("長沙");TestModel testModel2 = new TestModel();testModel2.setProvice("湖南");testModel2.setCity("株洲");TestModel testModel3 = new TestModel();testModel3.setProvice("湖北");testModel3.setCity("武漢");List<TestModel> testModelList = new ArrayList<>(); //需要打印的list數據testModelList.add(testModel);testModelList.add(testModel2);testModelList.add(testModel3);HashMap<String, Object> map = new HashMap<String, Object>();List<PrintRecord> printRecordList = new ArrayList<>(); // 封裝后的數據集合for (TestModel p : testModelList) {PrintRecord pr = new PrintRecord();pr.setValue("provice",p.getProvice()); // 子報表需要建立對應的fieldpr.setValue("city",p.getCity());printRecordList.add(pr);}map.put("data",new GenericDataSource(printRecordList)); // 主報表需要建立名為data的 Parametersmap.put("staticParam","靜態參數");JasperPrint jasperPrint = JasperFillManager.fillReport(path, map, new JREmptyDataSource());if(jasperPrint != null && jasperPrint.getPages().size() > 0){JasperViewer jasperViewer = new JasperViewer(jasperPrint,false); //以視圖方式進行預覽jasperViewer.setVisible(true);jasperViewer.setAlwaysOnTop(true);jasperViewer.getGraphicsConfiguration().getDevice().setFullScreenWindow(jasperViewer);}else {System.err.println("報表內容為空暫不輸出");}}catch (Exception e){System.err.println(e.getMessage());e.printStackTrace();}}點擊下載本案例
總結
以上是生活随笔為你收集整理的ireport 使用list数据源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 更改环境变量 PATH
- 下一篇: R12应付模块详细结账流程