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

这篇文章主要介绍了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实现动态列打印的实例的详细内容,更多请关注其它相关文章!

一直觉得人应该去旅行,在年轻的时候,趁着有脾气装潇洒,

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

相关文章:

你感兴趣的文章:

标签云: