Jasper dycolumn

package com.common.util;

import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;

import net.sf.jasperreports.engine.JRElement;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignElement;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignImage;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;

import org.apache.commons.beanutils.BeanUtils;

public class ReportJasperPrint {
   
    public static List nomoveflagTextKey = new ArrayList();
    private static String flagTextKey = "customFlagText";
    private static int columnwidth = 0;
    private static int pageheight = 555;
    public static boolean alreadySetcolumnheight = false;
    public static List<Integer> width=new ArrayList<Integer>();//自定义每列width
    public static boolean pinjunwidth = true;//平均分配width
 
    public static List leftSizeGroup=new ArrayList(); //过页数据
    public static  JasperDesign curJasperDesign=new JasperDesign() ; //当前JasperDesign
    public static List jasperPrintList = new ArrayList();
   
   
     
    public static String filePath="";
    public static HashMap parameters=new HashMap();
    public static List objects=new ArrayList();
    public static List sizegroups=new ArrayList();
    public static List flagTextKeys=new ArrayList();
    public static List pinjunwidths=new ArrayList();
    public static List widths=new ArrayList();
    public static List alreadySetcolumnheights=new ArrayList();
    public static List allDesign=new ArrayList();//所有要打印的design
     
   
    public static void reset()
    {
       
        ReportJasperPrint.nomoveflagTextKey = new ArrayList();
        ReportJasperPrint.flagTextKey = "customFlagText";
        ReportJasperPrint.columnwidth = 0;
        ReportJasperPrint. pageheight = 555;
        ReportJasperPrint. alreadySetcolumnheight = false;
        ReportJasperPrint. width=new ArrayList<Integer>();//自定义每列width
        ReportJasperPrint. pinjunwidth = true;//平均分配width
         
         
         
       
        ReportJasperPrint.leftSizeGroup=new ArrayList(); //过页数据
        ReportJasperPrint.curJasperDesign=new JasperDesign() ; //当前JasperDesign
        ReportJasperPrint.jasperPrintList = new ArrayList();
       
       
         
        ReportJasperPrint.filePath="";
        ReportJasperPrint.parameters=new HashMap();
        ReportJasperPrint.objects=new ArrayList();
        ReportJasperPrint.sizegroups=new ArrayList();
        ReportJasperPrint.flagTextKeys=new ArrayList();
        ReportJasperPrint.pinjunwidths=new ArrayList();
        ReportJasperPrint. widths=new ArrayList();
        ReportJasperPrint.alreadySetcolumnheights=new ArrayList();
        ReportJasperPrint.allDesign=new ArrayList();//所有要打印的design
       
    }
   //针对design进行设置
    public static void  setJasperDesign(JasperDesign design, 
            List sizeGroup, String flagTextKey) throws JRException {

        ReportJasperPrint.flagTextKey = flagTextKey;// 初始化

        JRDesignBand columnHeader = (JRDesignBand) design.getColumnHeader();
       
   
       
       
       
        design.setTopMargin(0);
        design.setBottomMargin(0);
       
       
        //sizeGroup允许的最大行数(每页最大高度除掉title,pageheader,columnheader当前element上面高度,element自身高度)
        int maxrow=1+(555-design.getColumnFooter().getHeight()-design.getTitle().getHeight()-design.getPageHeader().getHeight()-columnHeader.getElementByKey(flagTextKey).getY()-columnHeader.getElementByKey(flagTextKey).getHeight())/columnHeader.getElementByKey(flagTextKey).getHeight();
       
        int rowread=sizeGroup.size();
        int rows=0;
        rows=sizeGroup.size();
        curJasperDesign=design;
        if(rows>maxrow)
        {
             
             
           
           
           
        rows=maxrow;           
       
        List newlist=new ArrayList();
        for(int i=maxrow;i<sizeGroup.size();i++)
        {
            newlist.add(sizeGroup.get(i));
           
        }
       
        ReportJasperPrint.leftSizeGroup=newlist;
         
         curJasperDesign=makeJasperDesign(design,flagTextKey);
         ReportJasperPrint.allDesign.add(curJasperDesign);
         
        }
       
       
       
        List newsizeGroup=new ArrayList();
        for(int i=0;i<rows;i++)
        {
             if(sizeGroup.size()==0)continue;
            newsizeGroup.add(sizeGroup.get(i));   
           
           
        }
       
       
        reSetFlagTextWidth(getFlagTextInDesign(columnHeader), newsizeGroup);
        reSetColumnHeaderHeight(design,columnHeader, newsizeGroup);
        reSetOtherPosition(columnHeader, newsizeGroup);
        addElementToColumnHeader(columnHeader, newsizeGroup);
       
         
        if(rowread<=maxrow)
        {
           
            ReportJasperPrint.leftSizeGroup.clear();//没有留下   
           
        }
       
       
         
       
       
    }

    //创造出一个新的design ,这个动作必须在操作design之前,否则在操作完design之后,一但过页,flagTextKey下面的元素将不复存在
   
private static JasperDesign makeJasperDesign(JasperDesign design,
        String flagTextKey) throws JRException {
    // TODO Auto-generated method stub
   
    JasperDesign newdesign= getJasperDesign(ReportJasperPrint.filePath);;
    try {
       
       
     
       
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     
    /*newdesign.setName("liyousoft");
     JRDesignField createman = new JRDesignField();
     createman.setName("createman");
     createman.setValueClass(java.lang.String.class);
   
    newdesign.addField(createman);*/
    //复制未经操作过的columnheader
    //newdesign.setColumnHeader(design.getColumnHeader());
    /*for(int i=0;i<design.getFields().length;i++)
    {    newdesign.addField((JRField)design.getFields()[i]) ;
    }*/
     
     
    /* JRDesignBand title = new JRDesignBand();title.setHeight(0);
     newdesign.setTitle(title);
     JRDesignBand pageheader = new JRDesignBand();pageheader.setHeight(0);
     newdesign.setPageHeader(pageheader);*/
    //清除flagtextkey上面已经处理的元素
     
    JRElement  element=    newdesign.getColumnHeader().getElementByKey(flagTextKey);
     
    clearTopElement(newdesign,flagTextKey);
    JRDesignBand columnHeader=(JRDesignBand) newdesign.getColumnHeader();
     
    newdesign.setTopMargin(0);
    newdesign.setBottomMargin(0);
   
    columnHeader.setHeight(555-design.getColumnFooter().getHeight()-design.getTitle().getHeight()-design.getPageHeader().getHeight());
    JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
    flagText.setY(0);
    return newdesign;
}
private static void clearTopElement(JasperDesign design,String flagTextKey) {
        // TODO Auto-generated method stub
    JRDesignBand columnHeader=(JRDesignBand) design.getColumnHeader();
    JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
    Iterator children = columnHeader.getChildren().iterator();
    JRDesignElement element;
    List elements=new ArrayList();
    while (children.hasNext()) {
     

        element = (JRDesignElement) children.next();
        if(!element.getKey().equals(flagTextKey)&&element.getY()+element.getHeight()<=flagText.getY())
        {
            elements.add(element);
       
        }
       
    }
    for(int i=0;i<elements.size();i++)
    {
        columnHeader.removeElement((JRDesignElement)elements.get(i));
       
    }
   
   
    }
//针对design进行编译,返回
    public static JasperReport getJasperReport(JasperDesign design)
            throws JRException {
        design.setTopMargin(0);
        design.setBottomMargin(0);
        System.out.print(design.getColumnHeader().getHeight()+":"+design.getTitle().getHeight()+":"+design.getColumnFooter().getHeight());
             return JasperCompileManager.compileReport(design);
    }

    public static JasperReport getJasperReport(String xmlFilePath,
            List sizeGroup,int totalwidth) throws JRException {
        JasperDesign design = getJasperDesign(xmlFilePath);
        JRDesignBand columnHeader = (JRDesignBand) design.getColumnHeader();
        reSetFlagTextWidth( getFlagTextInDesign(columnHeader), sizeGroup);
        reSetColumnHeaderHeight(design,columnHeader, sizeGroup);
       
       
        reSetshapeAndPosition(columnHeader, sizeGroup);
        addElementToColumnHeader(columnHeader, sizeGroup);
        return JasperCompileManager.compileReport(design);
    }

    public static JasperDesign getJasperDesign(String filePath)
            throws JRException {

        JasperDesign design = JRXmlLoader.load(new File(filePath));
        columnwidth = design.getColumnWidth();
     
        return design;
    }

    private static void reSetFlagTextWidth( JRDesignStaticText flagText,
            List sizeGroup) {
        if(sizeGroup.size()==0)return;
        flagText.setWidth((flagText.getWidth()) / ((List) sizeGroup.get(0)).size());

    }
    private static void reSetOtherPosition(JRDesignBand columnHeader,
            List sizeGroup) {
        if( ReportJasperPrint.alreadySetcolumnheight==true) return;
        JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
        Iterator children = columnHeader.getChildren().iterator();
        JRDesignElement element;
        List mustdeleteElement=new ArrayList();越界的元素
        while (children.hasNext()) {
         

            element = (JRDesignElement) children.next();
        /*    if (element.getX() > flagText.getX()) {//与flagtext同行的其它element才需要调整
                element.setX(flagText.getX() + flagText.getWidth()
                        * ((List) sizeGroup.get(0)).size());
            }*/
           
            if (element.getY() > flagText.getY()&&!flagTextKey.equals(element.getKey())&&ReportJasperPrint.nomoveflagTextKey.indexOf(element.getKey())==-1) {//其它所有在flagtext下方的element
                //element.setHeight(element.getHeight() * sizeGroup.size());
                 
                int newheight=element.getY()+flagText.getHeight() * sizeGroup.size()-1;
                 
                    if(newheight+element.getHeight()>columnHeader.getHeight())//越界
                    {
                        mustdeleteElement.add(element);
                    }
                    else{
                   element.setY(newheight);
                    }
                   
                 
               
            }
        }
       
        for(int i=0;i<mustdeleteElement.size();i++)
        {
            columnHeader.removeElement((JRDesignElement)mustdeleteElement.get(i));
           
        }
       
       
    }
    private static void reSetColumnHeaderHeight(JasperDesign design ,JRDesignBand columnHeader,
            List sizeGroup) {
        if( ReportJasperPrint.alreadySetcolumnheight==true) return;
        int newheight=columnHeader.getHeight()+columnHeader.getElementByKey(flagTextKey).getHeight() * sizeGroup.size()-1;
        if(newheight<=pageheight)
        {
        columnHeader.setHeight(newheight);
       
        }
         
        int maxheight=555-design.getColumnFooter().getHeight()-design.getTitle().getHeight()-design.getPageHeader().getHeight();
        if(newheight>maxheight)
        {
            columnHeader.setHeight(maxheight);   
        }
       
       
       
    }

    private static JRDesignStaticText getFlagTextInDesign(
            JRDesignBand columnHeader) {
        return (JRDesignStaticText) columnHeader.getElementByKey(flagTextKey);
    }

    private static void reSetshapeAndPosition(JRDesignBand columnHeader,
            List sizeGroup) {
        if( ReportJasperPrint.alreadySetcolumnheight==true) return;
        JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);
        Iterator children = columnHeader.getChildren().iterator();
        JRDesignStaticText element;
        while (children.hasNext()) {
            element = (JRDesignStaticText) children.next();
            if (element.getX() > flagText.getX()) {
                element.setX(flagText.getX() + flagText.getWidth()
                        * ((List) sizeGroup.get(0)).size());
            }
            if (!flagTextKey.equals(element.getKey())) {
                element.setHeight(element.getHeight() * sizeGroup.size());
            }
        }
    }
   
    private static int getBeforeWidth(int num)
    {
        int width=0;
        for(int i=0;i<num;i++)
        {
            width+=ReportJasperPrint.width.get(i);
           
           
           
        }
       
        return width;
       
       
    }

    private static void addElementToColumnHeader(JRDesignBand columnHeader,
            List sizeGroup) {
        JRDesignStaticText flagText = getFlagTextInDesign(columnHeader);

        columnHeader.removeElement(flagText);
        for (int i = 0; i < sizeGroup.size(); i++) {
            for (int j = 0; j < ((List) sizeGroup.get(i)).size(); j++) {
                try {
                    JRDesignStaticText newElement = (JRDesignStaticText) BeanUtils
                            .cloneBean(flagText);
                    newElement.setText((String) ((List) sizeGroup.get(i))
                            .get(j));
                    newElement.setX(flagText.getX() + flagText.getWidth() * j);
               
                    newElement.setY(flagText.getY() + flagText.getHeight() * i);
                 
                    if(ReportJasperPrint.pinjunwidth==false)
                    {
                        newElement.setX(flagText.getX()+getBeforeWidth(j))    ;
                       
                        newElement.setWidth(ReportJasperPrint.width.get(j));
                       
                    }
                     
                   
                   
                   
                    columnHeader.addElement(newElement);
                    ReportJasperPrint.nomoveflagTextKey.add(newElement.getKey());
                    if(newElement.getText()!=null&&newElement.getText().endsWith(".jpg"))
                    {
                       
                       
                         
                          try {
                       
                            JRDesignImage image=new JRDesignImage(null);
                          
                            image.setX(newElement.getX());
                            image.setY(newElement.getY());
                            image.setHeight(newElement.getHeight());
                            image.setWidth(newElement.getWidth());
                            JRDesignExpression   expression = new JRDesignExpression();
                            expression.setValueClass(String.class);
                            String imagesrc=newElement.getText();
                            expression.setText("/""+imagesrc+"/"");
 
                            image.setExpression(expression);

                       
                        columnHeader.removeElement(newElement);
                        columnHeader.addElement(image);
                        ReportJasperPrint.nomoveflagTextKey.add(image.getKey());
                          } catch (Exception e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }
                   
                   
                   
                   
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }
        }
    }
   
   
    public static List getJasperPrintList(String filePath,HashMap parameters,List objects,List sizegroups,List flagTextkeys,List pinjunwidths,List widths,List alreadySetcolumnheights)
    {
       
       
       
     
        try {
       
            ReportJasperPrint.reset();
            //设置相关参数
            ReportJasperPrint.filePath=filePath;//xml文件路径
            ReportJasperPrint.parameters=parameters;//可能用到的参数
            ReportJasperPrint.objects=objects;//可能用到的数据
            ReportJasperPrint.sizegroups=sizegroups;//多个二维数据
            ReportJasperPrint.flagTextKeys=flagTextkeys ;//对应多个二维数据的key
            ReportJasperPrint.pinjunwidths=pinjunwidths;//每个二维数据是否平均分配
            ReportJasperPrint.widths=widths;//每个二维数据对应width,如果是平均分配,则width=new ArrayList()。否则,List list=new ArrayList();list.add(10);list.add(20); width=list;
            ReportJasperPrint.alreadySetcolumnheights=alreadySetcolumnheights;
           
           
           
            //进行报表处理
            ReportDesignProcess();
           
             for(int i=0;i<ReportJasperPrint.allDesign.size();i++)
             {
                 
            JasperPrint jasperPrint  = JasperFillManager.fillReport(ReportJasperPrint.getJasperReport((JasperDesign)ReportJasperPrint.allDesign.get(i)), parameters, new JRBeanCollectionDataSource(objects ));
       
            ReportJasperPrint.jasperPrintList.add(jasperPrint);
             
             }
       
       
       
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
       
        //返回最终结果
       
        return ReportJasperPrint.jasperPrintList;
       
       
    }
    //处理报表
    public static void ReportDesignProcess() throws JRException
    {
       
        JasperDesign design=ReportJasperPrint.getJasperDesign(ReportJasperPrint.filePath);//最初design
        ReportJasperPrint.curJasperDesign=design;
       
        ReportJasperPrint.allDesign.add(design);
       
        for(int i=0;i<ReportJasperPrint.sizegroups.size();i++)//sizegroups必须按照从上到下,从左到右顺序排列
        {
             
            List sizegroup=(List)ReportJasperPrint.sizegroups.get(i);//当前sizegroup
            String flagTextKey=(String)ReportJasperPrint.flagTextKeys.get(i);//当前flagTextKey
             
            ReportJasperPrint.pinjunwidth= (Boolean)ReportJasperPrint.pinjunwidths.get(i);//当前是否平均width
            ReportJasperPrint.width=(List)ReportJasperPrint.widths.get(i);//当前二维数据使用width
            ReportJasperPrint.alreadySetcolumnheight=(Boolean)ReportJasperPrint.alreadySetcolumnheights.get(i);//是否已设置好高度
             
           
            while(ReportJasperPrint.leftSizeGroup.size()>0)//还有未处理的sizegroup
            {
               
                 setJasperDesign(ReportJasperPrint.curJasperDesign,ReportJasperPrint.leftSizeGroup,flagTextKey);   
               
               
               
            }
           
           
           
             ReportJasperPrint.setJasperDesign(ReportJasperPrint.curJasperDesign, sizegroup, flagTextKey);
           
           
           
        }
        while(ReportJasperPrint.leftSizeGroup.size()>0)//还有未处理的sizegroup
        {
             
            ReportJasperPrint.flagTextKey=(String)ReportJasperPrint.flagTextKeys.get(ReportJasperPrint.flagTextKeys.size()-1);
             setJasperDesign(ReportJasperPrint.curJasperDesign,ReportJasperPrint.leftSizeGroup,flagTextKey);   
           
           
           
        }
       
       
       
       
       
       
    }
   
   
}

 

 

 

    jasperPrintList=   ReportJasperPrint.getJasperPrintList(request.getRealPath("/")+"/dd.jrxml",parameters,objects,sizegroups, flagTextkeys, pinjunwidths, widths, alreadySetcolumnheights);
              
               ByteArrayOutputStream baos = new ByteArrayOutputStream();
               JRPdfExporter exporter = new JRPdfExporter();
               exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST,jasperPrintList);
               exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);
               exporter.exportReport();
               byte[] bytes= baos.toByteArray();
              
               response.setContentType("application/pdf");
                ServletOutputStream outputStream = response.getOutputStream();
                response.addHeader("Content-Disposition", "attachment;filename=/""
                        + URLEncoder.encode("单.pdf", "utf-8") + "/"");

                response.addHeader("Cache-Control",
                        "must-revalidate, post-check=0, pre-check=0");

                outputStream.write(bytes, 0, bytes.length);
                outputStream.flush();
                outputStream.close();

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值