• 技术文章 >Java >java教程

    Java中jasperReport实现动态列打印的实例

    黄舟黄舟2017-09-18 09:41:50原创1536
    这篇文章主要介绍了Java 中jasperReport实现动态列打印的实现代码的相关资料,希望通过本文大家能掌握这部分内容,需要的朋友可以参考下

    Java 中jasperReport实现动态列打印的实现代码

    以下代码中注释说明很清楚,希望能帮助到大家,大家参考下。

    示例代码:


    public ActionResult projectPrint() { 
      String[] printValue = null; 
      // 从页面中获得要查询的字段 
      String reqPrintValue = getRequest().getParameter("printValue"); 
      // 没有选择则默认全打印 
      if (null == reqPrintValue || StringUtils.isEmpty(reqPrintValue)) { 
       printValue = new String[] { "pnumber", "pname", "pdepart", "pdecision", "pthrow", "plastmonth", "pfund", "ploan" }; 
      } else { 
       printValue = reqPrintValue.split(","); 
      } 
      // 查询统计数据 
      List<Object[]> projectList = getEntityManager().queryPrintProjectInfo(printValue); 
     
      // 将数据转换为Map对象,换化成Map对象 
      List<Map> reportDataList = new ArrayList<Map>(); 
     
      for (int i = 0; i < projectList.size(); i++) { 
       Object[] personStr = projectList.get(i); 
       Map reportData = new HashMap(); 
       for (int j = 0; j < personStr.length; j++) { 
        reportData.put("field_" + j, String.valueOf(personStr[j])); 
       } 
       reportDataList.add(reportData); 
      } 
     
      int columCount = 0;// 数据列 
      int fieldCount = 0;// 字段列数(因为pname比较长所以想让pname比其它的列长些,故设计这个变量) 
      int pnameCount = -1;// 记录下pname的序号 
      for (int i = 0; i < printValue.length; i++) { 
       // pthrow下面有两列 
       if ("pthrow".equals(printValue[i])) { 
        columCount = columCount + 2; 
        fieldCount = fieldCount + 2; 
        // ploan下面也有两列 
       } else if ("ploan".equals(printValue[i])) { 
        columCount = columCount + 2; 
        fieldCount = fieldCount + 2; 
        // 故意让pname也占两列 
       } else if ("pname".equals(printValue[i])) { 
        pnameCount = i;// 记录下pname的序号 
        columCount = columCount + 1; 
        fieldCount = fieldCount + 2; 
       } else { 
        // 其它的列都占一个单位 
        columCount = columCount + 1; 
        fieldCount = fieldCount + 1; 
       } 
      } 
     
      InputStream is = null; 
      try { 
       // 从资源文件中读取报表 
       is = this.getClass().getResourceAsStream("/reports/project.jrxml"); 
       JasperDesign jasperDesign = (JasperDesign) JRXmlLoader.load(is); 
     
       Map styleMap = jasperDesign.getStylesMap(); 
       // column header 对应的样式 
       JRDesignStyle theaderStyle = (JRDesignStyle) styleMap.get("theader"); 
       // column detail 对应的样式 
       JRDesignStyle tbodyStyle = (JRDesignStyle) styleMap.get("tboby"); 
       // pagefoot 对应的样式 
       JRDesignStyle tfootStyle = (JRDesignStyle) styleMap.get("tfoot"); 
     
       int _START_X_ = 20;// x轴的起始位置 
       int startX = _START_X_; // x轴的起始位置 
       // 单列的宽度 
       // 535是jasepreReport报表column最大的宽度 
       int columnWidth = 535 / fieldCount; 
       // 20,24,15是报表中已设置的,一定与之相同 
       final int columnHeadBandHeight = 20; 
       final int detailHeight = 24; 
       final int pagefootHeight = 15; 
     
       // 设置报表字段 
       for (int idx = 0; idx < columCount; idx++) { 
        JRDesignField field = new JRDesignField(); 
        field.setName("field_" + idx); 
        field.setValueClass(java.lang.String.class); 
        jasperDesign.addField(field); 
       } 
     
       JRDesignBand columnHeadBand = (JRDesignBand) jasperDesign.getColumnHeader(); 
       // 绘制表头 
       for (int idx = 0; idx < printValue.length; idx++) { 
        if ("pnumber".equals(printValue[idx])) { 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         staticText.setWidth(columnWidth); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(2 * columnHeadBandHeight); 
         staticText.setText("序号"); 
         columnHeadBand.addElement(staticText); 
         startX += columnWidth; 
        } else if ("pname".equals(printValue[idx])) { 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         // 项目名称的宽度是其它的宽度的2倍 
         staticText.setWidth(columnWidth * 2); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(2 * columnHeadBandHeight); 
         staticText.setText("项目名称"); 
         columnHeadBand.addElement(staticText); 
         startX += columnWidth * 2; 
        } else if ("pdepart".equals(printValue[idx])) { 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         staticText.setWidth(columnWidth); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(2 * columnHeadBandHeight); 
         staticText.setText("部门"); 
         columnHeadBand.addElement(staticText); 
         startX += columnWidth; 
        } else if ("pdecision".equals(printValue[idx])) { 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         staticText.setWidth(columnWidth); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(2 * columnHeadBandHeight); 
         staticText.setText("已决策"); 
         columnHeadBand.addElement(staticText); 
         startX += columnWidth; 
        } else if ("pthrow".equals(printValue[idx])) { 
         // 投审会下面有两列 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         staticText.setWidth(columnWidth * 2); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("投审会"); 
         columnHeadBand.addElement(staticText); 
     
         staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         columnHeadBand.addElement(staticText); 
         staticText.setWidth(columnWidth); 
         staticText.setY(columnHeadBandHeight); 
         staticText.setX(startX); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("12月初"); 
     
         staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         columnHeadBand.addElement(staticText); 
         staticText.setWidth(columnWidth); 
         staticText.setY(columnHeadBandHeight); 
         staticText.setX(startX + columnWidth); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("12月中"); 
         columnHeadBand.addElement(staticText); 
         startX += 2 * columnWidth; 
        } else if ("plastmonth".equals(printValue[idx])) { 
         // 投决会下面有一列 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         staticText.setWidth(columnWidth); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("投决会"); 
         columnHeadBand.addElement(staticText); 
     
         staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         columnHeadBand.addElement(staticText); 
         staticText.setWidth(columnWidth); 
         staticText.setY(columnHeadBandHeight); 
         staticText.setX(startX); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("12月下"); 
         columnHeadBand.addElement(staticText); 
         startX += columnWidth; 
        } else if ("pfund".equals(printValue[idx])) { 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         staticText.setWidth(columnWidth); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(2 * columnHeadBandHeight); 
         staticText.setText("基金投资额"); 
         columnHeadBand.addElement(staticText); 
         startX += columnWidth; 
        } else if ("ploan".equals(printValue[idx])) { 
         // 投贷协同额下面有两列 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         staticText.setWidth(columnWidth * 2); 
         staticText.setY(0); 
         staticText.setX(startX); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("投贷协同额"); 
         columnHeadBand.addElement(staticText); 
     
         staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         columnHeadBand.addElement(staticText); 
         staticText.setWidth(columnWidth); 
         staticText.setY(columnHeadBandHeight); 
         staticText.setX(startX); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("金额"); 
     
         staticText = new JRDesignStaticText(); 
         staticText.setStyle(theaderStyle); 
         columnHeadBand.addElement(staticText); 
         staticText.setWidth(columnWidth); 
         staticText.setY(columnHeadBandHeight); 
         staticText.setX(startX + columnWidth); 
         staticText.setHeight(columnHeadBandHeight); 
         staticText.setText("入库情况"); 
         columnHeadBand.addElement(staticText); 
         startX += 2 * columnWidth; 
        } 
       } 
     
       // 绘制Detail部门 
       startX = _START_X_; 
       JRDesignBand columnDetailBand = (JRDesignBand) jasperDesign.getDetail(); 
       for (int idx = 0; idx < columCount; idx++) { 
        JRDesignTextField textField = new JRDesignTextField(); 
        textField.setStretchWithOverflow(true); 
        textField.setX(startX); 
        textField.setY(0); 
        if (pnameCount == idx) { 
         textField.setWidth(2 * columnWidth); 
         startX += 2 * columnWidth; 
        } else { 
         textField.setWidth(columnWidth); 
         startX += columnWidth; 
        } 
        textField.setHeight(detailHeight); 
        textField.setPositionType(JRElement.POSITION_TYPE_FLOAT); 
        textField.setStyle(tbodyStyle); 
        textField.setBlankWhenNull(true); 
        JRDesignExpression expression = new JRDesignExpression(); 
        expression.setValueClass(java.lang.String.class); 
        expression.setText("$F{field_" + idx + "}"); 
        textField.setExpression(expression); 
        columnDetailBand.addElement(textField); 
       } 
     
       JRDesignBand pageFootBand = (JRDesignBand) jasperDesign.getPageFooter(); 
       // 合计数据,本应统计的 
       List<Object[]> pageCountList = new ArrayList<Object[]>(); 
       Object[] obj = new String[] { "合计", "15299", "", "", "67121", "92420", "155877", }; 
       pageCountList.add(obj); 
       obj = new String[] { "", "", "", "XXX小计", "", "24473", "16470", }; 
       pageCountList.add(obj); 
       obj = new String[] { "", "", "", "WWW小计", "", "7289", "1674", }; 
       pageCountList.add(obj); 
       obj = new String[] { "", "", "", "ZZZ小计", "", "32700", "13000", }; 
       pageCountList.add(obj); 
       obj = new String[] { "", "", "", "YYY小计", "", "12733", "120733", }; 
       pageCountList.add(obj); 
       obj = new String[] { "", "", "", "AAA小计", "", "2225", "120733", }; 
       pageCountList.add(obj); 
       obj = new String[] { "", "", "", "BBB小计", "", "3000", "0", }; 
       pageCountList.add(obj); 
       int footWidth = 535 / 7; 
       for (int p = 0; p < pageCountList.size(); p++) { 
        for (int k = 0; k < 7; k++) { 
         Object[] ob = pageCountList.get(p); 
         JRDesignStaticText staticText = new JRDesignStaticText(); 
         staticText.setStyle(tfootStyle); 
         staticText.setWidth(footWidth); 
         staticText.setY(pagefootHeight * p); 
         staticText.setX(k * footWidth + _START_X_); 
         staticText.setHeight(pagefootHeight); 
         staticText.setText(String.valueOf(ob[k])); 
         pageFootBand.addElement(staticText); 
        } 
       } 
     
       // 编译报表 
       JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
       String type = this.getRequest().getParameter("type");//pdf格式 
       JasperUtils.prepareReport(jasperReport, type); 
       // 报表数据源 
       JRDataSource dataSource = new JRBeanCollectionDataSource(reportDataList); 
       JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, dataSource); 
       HttpServletResponse response = this.getResponse(); 
       JasperUtils.export(jasperPrint, response, getRequest(), type); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     
      return null; 
     }


    public static void export(JasperPrint jasperPrint, HttpServletResponse response, HttpServletRequest request, 
       String type) throws IOException { 
      if (EXCEL_TYPE.equals(type)) { 
       exportExcel(jasperPrint, response, request); 
      } else if (PDF_TYPE.equals(type)) { 
       exportPDF(jasperPrint, response, request); 
      } else if (HTML_TYPE.equals(type)) { 
       exportHTML(jasperPrint, response, request); 
      } else { 
       exportPrint(jasperPrint, response, request); 
      } 
     
     }


    public static void exportExcel(JasperPrint jasperPrint, HttpServletResponse response, HttpServletRequest request) 
       throws IOException { 
      response.setContentType("application/vnd.ms-excel"); 
      String filename = DownloadHelper.encodeFilename("未命名.xls", request); 
      response.setHeader("Content-disposition", "attachment;filename=" + filename); 
      ServletOutputStream ouputStream = response.getOutputStream(); 
      JRXlsExporter exporter = new JRXlsExporter(); 
      exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); 
      exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, ouputStream); 
      exporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE); 
      exporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE); 
      exporter.setParameter(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE); 
      try { 
       exporter.exportReport(); 
      } catch (JRException e) { 
       e.printStackTrace(); 
      } 
      ouputStream.flush(); 
      ouputStream.close(); 
     } 
     
     public static void exportPDF(JasperPrint jasperPrint, HttpServletResponse response, HttpServletRequest request) 
       throws IOException { 
      response.setContentType("application/pdf"); 
      String filename = DownloadHelper.encodeFilename("未命名.pdf", request); 
      response.setHeader("Content-disposition", "attachment;filename=" + filename); 
      ServletOutputStream ouputStream = response.getOutputStream(); 
      try { 
       JasperExportManager.exportReportToPdfStream(jasperPrint, ouputStream); 
      } catch (JRException e) { 
       e.printStackTrace(); 
      } 
      ouputStream.flush(); 
      ouputStream.close(); 
     }

    以上就是Java中jasperReport实现动态列打印的实例的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:jasperReport Java 打印
    上一篇:Java中关于null的含义以及使用中要注意的事项 下一篇:Java如何调用.NET中WebService的实例
    Web大前端开发直播班

    相关文章推荐

    • Java实例详解之Lambda表达式• 带你搞懂Java的接口(实例详解)• Java技巧总结之如何看Lambda源码• 实例详解JAVA抽象工厂模式• 一起聊聊Java多线程之线程安全问题

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网