JasperDesign+ireport動態報表實現

直接上代碼

package com.report;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;

public class DynamicIreport {

    /**
     * @param args
     * @throws JRException
     */
    public static void main(String[] args) throws JRException {
        report();
    }
    @SuppressWarnings("deprecation")
    public static void report() throws JRException{
        int randomNum = new Random().nextInt(20);
          String jrxmlPath ="D:\\workspace\\iReportTestAndJfreeChart\\report\\report1.jrxml";
        
          JasperDesign jasperDesign= JRXmlLoader.load(jrxmlPath);//因爲還是添加元素進去,所以還只是jrxml文件

          JRDesignBand columnHeaderBand = (JRDesignBand )jasperDesign.getColumnHeader();//獲取ColumnHeader攔
          JRDesignBand detailBand = (JRDesignBand )jasperDesign.getDetail();//獲取Detail攔
          JRDesignTextField detailField= (JRDesignTextField )detailBand.getElementByKey("detail");
          JRDesignStaticText columnHeaderField = (JRDesignStaticText)columnHeaderBand.getElementByKey("header");
          
          columnHeaderBand.removeElement(columnHeaderField);
            detailBand.removeElement(detailField);//得到對象之後  將其從xml的文件中移除
            
          Map<String,Object> map = new HashMap<String, Object>();
          List< Map<String,Object>> list = new ArrayList< Map<String,Object>>();
          //根據隨即生成的數進行動態添加列
          for(int i=0,y=3;i<=randomNum;i++,y++){
        String detailFieldKey = "detail"+y;
        //String columnHeaderFieldKey = "staticText-"+y+1;
        map.put(detailFieldKey,y);
        //map.put(columnHeaderFieldKey,"列"+y);
        JRDesignField jRDesignField= new JRDesignField();
          jRDesignField.setName(detailFieldKey);
          jRDesignField.setValueClass(java.lang.String.class);
          jasperDesign.addField(jRDesignField);
          
        detailField= (JRDesignTextField)detailField.clone();
        detailField.setX(i*60);
        JRDesignExpression expression = new JRDesignExpression();
        expression.setText("$F{"+detailFieldKey+"}");
        expression.setValueClass(java.lang.String.class);
        detailField.setExpression(expression);
        detailBand.addElement(detailField);

        columnHeaderField = (JRDesignStaticText)columnHeaderField.clone();
        columnHeaderField.setX(i*60);
        columnHeaderField.setText("列"+y);
        columnHeaderBand.addElement(columnHeaderField);
        }
        list.add(map);
        JRDataSource jRDataSource = new JRMapCollectionDataSource(list); //   數據集
          JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);//編譯jrxml文件
          JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,null,jRDataSource); //填充打印
          
          JasperExportManager.exportReportToPdfFile(jasperPrint,"D:\\workspace\\iReportTestAndJfreeChart\\report\\test.pdf");
    }
                                                                                            
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章