用ireport做好模版后,如果要新加一个打印页,如果是新手,直接修改模版应该是理想情况,
可是什么数据源 feild,parameter,var,subreport ,还有路径,
真的可以让一个人疯掉,(关键这些东西组织在一起跑不了,主要是要动态的出现这些新页,就是说要动态控制这些新页的数量以及要不要出现),
还好,想到如果直接用java在外部控制,就可以易如反掌了,毕竟java的东西自己熟,
幸运的看到一篇关于 ireport追加新页的文章
(是英文的,有时候不得不承认啊,谷歌是比度娘给力,关键是公司网络的各种墙,连个CSDN 、ITEYE都不给上,逼我学英文...)
写怎么添加时候绕来绕去,读完理解最关键的一个方法或思路:
主要是往已有的 JasperPrint 对象中addPage()。
private JasperPrint multipageLinking(JasperPrint page1, JasperPrint page2) { List pages = page2.getPages(); for (int count = 0; count <pages.size(); count++) { page1.addPage((JRPrintPage) pages.get(count)); } return page1; }
如果你有更多的页要添加,或者有更复杂的逻辑要执行,你可以在外部来调用这个方法
最后制作得到 JasperPrint 对象 jp 然后用下面方法做打印显示
JasperViewer.viewReport(jp,false);
最后给出完整的一个例子,xml文件没提供,DOM4J所需的包有三个自己下载,
dom4j-1.5.1.jar
jaxen-1.1.1.jar
saxpath-1.0-FCS.jar
(findjar.com是个好地方),关于org.w3c.dom.Document 与org.dom4j.Document互转可以自己找,我的另一个文章中有:
1 package ec.export.checksheet; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.util.ArrayList; 7 import java.util.HashMap; 8 import java.util.List; 9 import java.util.Map; 10 11 import net.sf.jasperreports.engine.JREmptyDataSource; 12 import net.sf.jasperreports.engine.JRException; 13 import net.sf.jasperreports.engine.JRPrintPage; 14 import net.sf.jasperreports.engine.JasperFillManager; 15 import net.sf.jasperreports.engine.JasperPrint; 16 import net.sf.jasperreports.engine.JasperReport; 17 import net.sf.jasperreports.engine.util.JRLoader; 18 import net.sf.jasperreports.view.JasperViewer; 19 20 import org.dom4j.Document; 21 import org.dom4j.DocumentException; 22 import org.dom4j.io.SAXReader; 23 24 import ec.export.ECReportHelper; 25 import ec.utils.Dom4jXml; 26 27 public class AddCheckSheet { 28 29 public Dom4jXml dj = new Dom4jXml(); 30 31 public JasperPrint FormTotalPage(JasperPrint jp,org.w3c.dom.Document document,Map mSelectCheckSheet){ 32 List l=new ArrayList(); 33 try { 34 l=CheckSheetReadXml(document); 35 } catch (Exception e1) { 36 // TODO Auto-generated catch block 37 e1.printStackTrace(); 38 } 39 40 //jasper template put to this class dir path 41 String jasperpatha=getClass().getResource("")+"checksheeta.jasper"; 42 jasperpatha=jasperpatha.replaceAll("file:/", ""); 43 String jasperpathb=getClass().getResource("")+"checksheetb.jasper"; 44 jasperpathb=jasperpathb.replaceAll("file:/", ""); 45 for(int i=0;i<l.size();i++){ 46 47 if(mSelectCheckSheet.containsKey(((Map)l.get(i)).get("cs_Model"))) 48 { 49 // ========for checksheeta.jasper======= 50 JasperPrint jasperprint = new JasperPrint(); 51 try { 52 jasperprint = JasperFillManager.fillReport(jasperpatha, (Map)l.get(i), new JREmptyDataSource()); 53 } catch (Exception e) { 54 e.printStackTrace(); 55 } 56 //System.out.println(" before jp: "+jp.getPages().size()); 57 multipageLinking(jp,jasperprint); 58 //System.out.println(" after jp: "+jp.getPages().size()); 59 60 // =======for checksheetb.jasper======= 61 jasperprint = new JasperPrint(); 62 try { 63 jasperprint = JasperFillManager.fillReport(jasperpathb, (Map)l.get(i), new JREmptyDataSource()); 64 } catch (Exception e) { 65 e.printStackTrace(); 66 } 67 //System.out.println(" before jp: "+jp.getPages().size()); 68 multipageLinking(jp,jasperprint); 69 //System.out.println(" after jp: "+jp.getPages().size()); 70 } 71 } 72 return jp; 73 } 74 75 private JasperPrint multipageLinking(JasperPrint page1, JasperPrint page2) { 76 List pages = page2.getPages(); 77 for (int count = 0; count <pages.size(); count++) { 78 page1.addPage((JRPrintPage) pages.get(count)); 79 } 80 return page1; 81 } 82 83 public static void main(String[] args) throws Exception { 84 Dom4jXml dj = new Dom4jXml(); 85 AddCheckSheet acs=new AddCheckSheet(); 86 SAXReader saxReader = new SAXReader(); 87 Document document; 88 try { 89 document = saxReader.read(new File("D:/Task/draw_cs3/20141218/wcfx36_more.xml")); 90 JasperPrint jp=null; 91 // acs.CheckSheetReadXml(dj.parse(document)); 92 Map mSelectCheckSheet=new HashMap(); 93 jp=acs.FormTotalPage(jp,dj.parse(document),mSelectCheckSheet); 94 JasperViewer.viewReport(jp,false); 95 } catch (DocumentException e) { 96 // TODO Auto-generated catch block 97 e.printStackTrace(); 98 } 99 } 100 }
public List CheckSheetReadXml(org.w3c.dom.Document doc) throws Exception{ Document document=dj.parse(doc); List pl=new ArrayList(); //count product num List list = document.selectNodes("/report/job/product"); int num = list.size(); for(int i=1;i<=num;i++) { Map mproduct=new HashMap(); //0 select_date String xpathstr="/report/job/@select_date"; mproduct.put("cs_Date", dj.getContentString(document,xpathstr)); //model 1 AT3ARF1R AT5CRF4R xpathstr="/report/job/product["+i+"]/performanceData/group[name='Screw Compressor Water Cooled Package Chiller']/row/field[name='Model #']/value"; String s1=dj.getContentString(document,xpathstr); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Screw Compressor Water Cooled Package Chiller']/row/field[name='Component code']/value"; String tmep=dj.getContentString(document,xpathstr); tmep=tmep.substring(2); String tempbefore=tmep.substring(3); String tempafter=tmep.substring(0,3); tmep=tempbefore+tempafter; mproduct.put("cs_Model", s1+tmep); xpathstr="/report/job/product["+i+"]/qty"; mproduct.put("cs_Qty", dj.getContentString(document,xpathstr)); //evap 2 xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col1/field[contains(name,'Entering fluid temp')]/value"; mproduct.put("cs_Evap_Entering_fluid_temp", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col1/field[contains(name,'Fluid flow rate')]/value"; mproduct.put("cs_Evap_Fluid_flow_rate", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col1/field[contains(name,'Fouling factor')]/value"; mproduct.put("cs_Evap_Fouling_factor", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col1/field[contains(name,'Leaving fluid temp')]/value"; mproduct.put("cs_Evap_Leaving_fluid_temp", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col1/field[contains(name,'Fluid')]/value"; mproduct.put("cs_Evap_Fluid", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col1/field[contains(name,'Number of passes')]/value"; mproduct.put("cs_Evap_Number_of_passes", dj.getContentString(document,xpathstr)); //cond 3 xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col2/field[contains(name,'Entering fluid temp')]/value"; mproduct.put("cs_Cond_Entering_fluid_temp", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col2/field[contains(name,'Fluid flow rate')]/value"; mproduct.put("cs_Cond_Fluid_flow_rate", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col2/field[contains(name,'Fouling factor')]/value"; mproduct.put("cs_Cond_Fouling_factor", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col2/field[contains(name,'Leaving fluid temp')]/value"; mproduct.put("cs_Cond_Leaving_fluid_temp", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col2/field[contains(name,'Fluid')]/value"; mproduct.put("cs_Cond_Fluid", dj.getContentString(document,xpathstr)); xpathstr="/report/job/product["+i+"]/performanceData/group[name='Evaporator_Condenser']/col2/field[contains(name,'Number of passes')]/value"; mproduct.put("cs_Cond_Number_of_passes", dj.getContentString(document,xpathstr)); //4 Cooling Conditions of service //<name>Capacity (Tons)</name> xpathstr="/report/job/product["+i+"]/performanceData/group[name='Cooling Conditions of service']/col1/field[contains(name,'Capacity')]/value"; mproduct.put("cs_Capacity", dj.getContentString(document,xpathstr)); //<name>Energy efficiency (kW/Ton)</name> xpathstr="/report/job/product["+i+"]/performanceData/group[name='Cooling Conditions of service']/col2/field[contains(name,'Energy efficiency')]/value"; mproduct.put("cs_Energy_efficiency", dj.getContentString(document,xpathstr)); //5<name>Unit power supply</name> xpathstr="/report/job/product["+i+"]/performanceData/group[name='Electrical characteristics']/col1/field[contains(name,'Unit power supply')]/value"; mproduct.put("cs_Unit_power_supply", dj.getContentString(document,xpathstr)); //6<name>Refrigerant</name>//<value>R134a</value> xpathstr="/report/job/product["+i+"]/performanceData/group[name='Physical Specifications']/col2/field[contains(name,'Refrigerant')]/value"; mproduct.put("cs_Refrigerant", dj.getContentString(document,xpathstr)); //getContent(document,xpathstr); pl.add(mproduct); } return pl; }
完结
本着共享的精神,减少别人重复弯路,减少重复别人的弯路