`

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();
  }

 

  • 大小: 65.3 KB
  • 大小: 120.9 KB
3
0
分享到:
评论

相关推荐

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

    Java 中jasperReport实现动态列打印的实现代码 Java 中jasperReport实现动态列打印的实现代码主要介绍了使用jasperReport实现动态列打印的相关知识点。下面将详细介绍相关知识点。 首先,jasperReport是一个流行的...

    jasperreport 6.4.1报表动态列,以及生成导出html

    JasperReport通过其内建的脚本语言JasperReports Scriptlet或Java类来实现动态列的逻辑,可以在运行时根据数据源动态调整列的布局和内容。 生成HTML导出是JasperReport的另一项重要特性。它允许用户将报表以网页的...

    jasperReport 动态合并单元格示例

    本示例将详细介绍如何在jasperReport中实现动态合并单元格。 首先,我们需要了解jasperReport的基本结构。一个jasperReport由设计文件(.jrxml)和编译后的字节码文件(.jasper)组成。设计文件使用XML语法定义了...

    JasperReport、ireport固定表头隐藏列

    在这个特定的案例中,我们关注的是如何在JasperReport和iReport中实现固定表头以及隐藏和显示列的功能。 首先,让我们了解一下JasperReport。JasperReport是一个开源的报表库,它允许开发者在各种应用程序中生成...

    ireport+jasperreport开发中问题解决方案

    2. **动态调整行高**:JasperReport允许根据内容动态调整报表行高,这是通过在文本字段设置“Stretch with overflow”属性来实现的。当内容过多时,行高会自动扩展以适应内容。 3. **集合变量反填充值**:在处理...

    ireport固定表头隐藏列

    示例代码可能展示了如何在Java代码中动态控制报表的显示行为,例如通过修改JRDataSource或JRDesign对象来实现隐藏列。同时,它还可能包含了如何在ireport设计界面中设置相关属性的步骤,以及最终生成的jrxml文件的...

    jasperReport+ireport制作pdf报表教程

    jasperReport是一款开源的Java报表工具,它允许开发者创建复杂的打印报告和交互式PDF、HTML、XLS等格式的报表。jasperReport的核心功能包括设计报表模板、数据绑定、数据处理以及报表渲染。它的强大之处在于能够灵活...

    jasper动态输出列 工程带jar包

    【jasper动态输出列 工程带jar包】是一个基于Java的项目,专注于利用jasperreport和ireport库实现报表的动态列生成。这个工程包含了所有必要的jar包,确保用户在配置好JDK 8环境后可以直接运行。jasperreport是一个...

    JasperReport 用户手册

    开发者可以通过实现特定接口,将JasperReport库集成到自定义的数据源中,实现报告的动态生成。 1. **JasperDesign类**:未编译的报表实例,由XML设计文件解析得到。在不直接操作XML文件的情况下,也可以动态创建...

    jasperreport模板一个

    4. **字段和参数**:字段是来自数据源的列,而参数是用户在运行时输入的值,可以用来动态定制报告。 5. **分组和排序**:如“groupOpenReport”所示,JasperReport支持数据分组,可以在每个组的开头和结尾插入特殊...

    ireport+jasperreport联合开发java报表(PDF).rar

    在ireport+jasperreport联合开发过程中,首先需要在ireport中设计报表模板,定义好报表的结构和样式,包括行、列、单元格、图表等元素。设计完成后,将生成的.jasper文件与Java项目集成。在Java代码中,使用...

    Jasperreport+ireport学习笔记(1).rar

    **JasperReport与iReport简介** JasperReport是一款开源的报告生成库,它...在实际项目中,合理地整合JasperReport到Web应用,不仅可以实现静态数据的展示,还可以实现动态数据的实时更新,为决策提供有力的数据支持。

    最新JasperReport3.7 iReport的java Web报表整合Struts2完整教程

    JasperReport是一款强大的报表打印组件,它是开放源代码且免费的。在撰写本文时,JasperReport的最新版本是3.7.0,可以在官方站点[jasperforge.org](http://jasperforge.org/)下载获得。JasperReport提供了丰富的API...

    java报表打印包(导入即可)

    Java报表打印过程中,需要将这些数据动态填充到报表模板中,生成最终的打印文档。 7. **打印事件和回调**:在Java Print Service API中,可以注册监听器来处理打印过程中的事件,如打印开始、页面完成、打印结束等...

    ireport 子报表,行合并实例

    在实际应用中,你可能需要结合子报表和行合并功能,例如在一个主报表中展示多个产品的销售数据,并在每个产品下面显示详细的订单行,同时对某些列进行行合并以优化显示效果。 以“MySubReport”为例,这个文件可能...

    jasperreport iReport用户手册(PDF)翻译:董岿

    ### jasperreport iReport 用户手册知识点 #### 一、序言 **iReport** 是一个图形界面工具,用于设计和创建 **JasperReports** 的报表模板。它为开发者提供了直观的操作方式来创建复杂的报表。 ##### 1.1 什么是...

    jasperreportireport中文指南

    实现条件打印的方法包括使用表达式来控制字段的可见性。 ##### 4.5 如何将PDF格式报表结果直接输出到打印机 将生成的PDF文件直接发送到打印机的步骤。 #### 5. 参考信息及其他 ##### 5.1 iReport中引用报表中的...

    JFreechart

    - **动态报表**:报表应用程序允许在运行时动态决定报表格式和数据,实现数据和格式的分离,JFreeChart的图表可以在运行时根据数据变化更新。 6. **报表应用程序的组成部分** - **报表**:定义了报表的格式和数据...

Global site tag (gtag.js) - Google Analytics