2015年2月10日 星期二

Jasperreport - JRMapCollectionDataSource

jasperreport使用JRMapCollectionDataSource方式取代Connection Expression

Ireport設定:
1. 設置paramter為JRMapCollectionDataSource
2. 子報表設定Filed為JRMapCollectionDataSource指定名稱(大小寫需相同)

Java Code:

 private static BasicDataSource dataSource ;
private static JdbcTemplate jdbcTemplate ;

private static String sql1 = "SELECT LOGIN_ID, USER_NAME, USER_EMAIL FROM USER_DATA " ;
private static String sql2 = "SELECT LOGIN_ID, LOGIN_DT, LOGIN_RMK FROM LOGIN_LOG " ;
private static String mJrFile = "D:\\Jasperreport\\mainReport.jasper" ; //主報表路徑
private static String sJrFile = "D:\\Jasperreport\\" ; //子報表路徑

public static void main(String[] args) throws Exception{
   //模擬專案執行
   //connection 以Spring jdbcTemplate控管
   dataSource = new BasicDataSource() ;
   dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver") ;
   dataSource.setUrl("jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.101)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=xe)(SERVER=DEDICATED)))") ;
   dataSource.setUsername("zenii") ;
   dataSource.setPassword("zenii") ;
   dataSource.setMaxActive(30) ;
   dataSource.setMaxWait(10000) ;
   dataSource.setMaxIdle(10) ;
   dataSource.setDefaultAutoCommit(true) ;
   jdbcTemplate = new JdbcTemplate(dataSource) ;
 
   //輸出路徑
   String outputPath = "D:\\Jasperreport\\test.pdf";
   try{
//get connection
Connection con = null;
try {
   con = getConnection();
} catch (Exception e) {
   e.printStackTrace();
}

JRPdfExporter exporter = new JRPdfExporter();
Map<String, Object> pt = new HashMap<String, Object>();
//paramter
pt.put("SUBREPORT_DIR", sJrFile);

List<DataBean> queryData1 = getData("sql1");
ArrayList<Map<String, ?>> dataAry1 = new ArrayList<Map<String, ?>>();
for(int i=0 ; i<queryData1.size() ; i++){
   Map<String, Object> data = new HashMap<String, Object>();
   data.put("loginId", queryData1.get(i).getLoginId());
   data.put("userName", queryData1.get(i).getUserName());
   data.put("userEmail", queryData1.get(i).getUserEmail());
   dataAry1.add(data);
}
pt.put("DataSource1", new JRMapCollectionDataSource(dataAry1));

List<DataBean> queryData2 = getData("sql2");
ArrayList<Map<String, ?>> dataAry2 = new ArrayList<Map<String, ?>>();
for(int i=0 ; i<queryData2.size() ; i++){
   Map<String, Object> data = new HashMap<String, Object>();
   data.put("loginId", queryData2.get(i).getLoginId());
   data.put("loginDt", queryData2.get(i).getLoginDt());
   data.put("loginRmk", queryData2.get(i).getLoginRmk());
   dataAry2.add(data);
}
pt.put("DataSource2", new JRMapCollectionDataSource(dataAry2));

//compiler report
JasperPrint print = JasperFillManager.fillReport(mJrFile, pt, con);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, outputPath);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);

//export report
exporter.exportReport();
System.out.println("執行成功.");

   }catch(Exception e){
System.out.println(e.toString());  
   }
}

public static List<DataBean> getData(String sqlName) {
   StringBuffer sql = new StringBuffer();
   if(sqlName.equals("sql1")){
sql.append(sql1);
   }else{
sql.append(sql2);
   }
   return jdbcTemplate.query(sql.toString(), new BeanRowMapper<DataBean>(DataBean.class));
}
public static Connection getConnection() throws Exception{
return jdbcTemplate.getDataSource().getConnection() ;
}