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

所属分类: 软件编程 / java 阅读数: 21
收藏 0 赞 0 分享

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的面向对象编程基本概念学习笔记整理

这篇文章主要介绍了Java的面向对象编程基本概念学习笔记整理,包括类与方法以及多态等支持面向对象语言中的重要特点,需要的朋友可以参考下
收藏 0 赞 0 分享

Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

这篇文章主要介绍了Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

基于Java实现杨辉三角 LeetCode Pascal's Triangle

这篇文章主要介绍了基于Java实现杨辉三角 LeetCode Pascal's Triangle的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中Spring获取bean方法小结

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中获取Spring配置的bean呢?下面通过本文给大家介绍Java中Spring获取bean方法小结,对spring获取bean方法相关知识感兴趣的朋友一起学习吧
收藏 0 赞 0 分享

如何计算Java对象占用了多少空间?

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小,需要的朋友可以参考下
收藏 0 赞 0 分享

剖析Java中的事件处理与异常处理机制

这篇文章主要介绍了Java中的事件处理与异常处理机制,讲解Java是如何对事件或者异常作出响应以及定义异常的一些方法,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Java的Struts2框架的结构及其数据转移方式

这篇文章主要介绍了详解Java的Struts2框架的结构及其数据转移方式,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

Java封装好的mail包发送电子邮件的类

本文给大家分享了2个java封装好的mail包发送电子邮件的类,并附上使用方法,小伙伴们可以根据自己的需求自由选择。
收藏 0 赞 0 分享

在Java的Struts中判断是否调用AJAX及用拦截器对其优化

这篇文章主要介绍了在Java的Struts中判断是否调用AJAX及用拦截器对其优化的方法,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下
收藏 0 赞 0 分享

java多线程Future和Callable类示例分享

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callab
收藏 0 赞 0 分享
查看更多