天天看点

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 {

    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");

    }

}