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

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Java环境配置图文教程(推荐)

    今年新开Java课程第一步就是-配置环境 就从Java的环境配置开始好了 以下是正式的步骤 首先,从Oracle的官网下载jdk的安装包 点我下载Java SE开发套件 先点接受许可协议,然后自行选择对应的系统版本下载.我的是64位的win10,直接选了最后一个,如果是32位的windows就需要倒数第二个. 下载完成后直接双击安装就好了,弹出pac权限要求的时候选择是(选否的话就不用继续了:) 这里的安装路径自己选择一个C盘以外的目录安装,防止在系统出现问题的时候Java的环境出现问题 接下来

  • 【Java IO流】字节流和字符流的实例讲解

    字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作--也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3.从流的内容来讲,有字节和字符之分. 这篇文章先后讲解IO流中的字节流和字符流的输入和输出操作. 一.字节流 1)输入和输出流 首先,字节流要进行读和写,也就是输入和输出,所以它有两个抽象的父类InputStream.OutputStream. InputStream抽象了应用程序读取数据的方式,即

  • Java客户端调用.NET的WebService实例

    项目需要去调用.NET的WebSrevice,本身是Java,研究了半天,终于有些头绪,记下来. 1,新建.NET WebService.只在原方法上加上一个string类型的参数str [WebMethod] public string HelloWorld(string str) { return "Hello World"; } 2,新建Java的WebService客户端,lib引入以下5个jar包(我是用idea生成的WebService客户端,会下载7个包,我试着删掉了lo

  • Java模拟计算机的整数乘积计算功能示例

    本文实例讲述了Java模拟计算机的整数乘积计算功能.分享给大家供大家参考,具体如下: 计算机计算整数乘积的原理: 实现代码: package math; public class two { /** * Fundamental method * f(n) = O(n^2) * @param a * @param b * @return */ public static int naiveMul(int a,int b){ int x = 0; //判断a中出现1的位置,每当出现1就将b的移位运算

  • Java编程接口回调一般用法代码解析

    接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法.实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调. Java接口回调一般用法:实现接口实际上和继承抽象类类似,只不过继承是在类的层面上操作,接口是在方法和常量集合的层面上操作,接口比抽象类更抽象.更简洁.可以把实现接口看成继承特定的一个或多个方法以及一些常量,关于接口的具体规则这里不赘述. 为什么要使用接口和抽

  • Java中线程的基本方法使用技巧

    java中线程的基本方法的熟练使用是精通多线程编程的必经之路,线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文浅要的介绍一下它们的使用方式. 线程的状态图 java将操作系统中的就绪和运行两种状态统称为可运行状态,java中线程的状态可以认为有以上六种. wait 调用该方法的线程进入WAITING状态,只有等待另外线程的通知或被中断才会返回,需要注意的是调用wait()方法后,会释放对象的锁. 因此,wait方法一般用在同步方法或同步代码

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

    Java 中jasperReport实现动态列打印的实现代码 以下代码中注释说明很清楚,希望能帮助到大家,大家参考下. 示例代码: public ActionResult projectPrint() { String[] printValue = null; // 从页面中获得要查询的字段 String reqPrintValue = getRequest().getParameter("printValue"); // 没有选择则默认全打印 if (null == reqPrint

  • Java中JDBC实现动态查询的实例详解

    一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语句的构成 一旦用户向查询条件中输入数据,该查询条件就成为最终条件的一部分. 二 基本原理 1.SQL基本框架 无论查询条件如何,查询字段与数据库是固定不变的,这些固定不变的内容构成SQL语句的基本框架,如 select column... from table. 2.StringBuilder形成D

  • Java中JFinal框架动态切换数据库的方法

    需求:需要根据企业ID切换对应的数据库,同时,后期可动态增加数据库配置 JFinal框架中对于对于多数据源配置有两种方式: 1.通过配置文件配置,有多少数据库就要配置多少,服务启动时加载所有数据库,缺点:不能动态增加数据库 2.只配置一个主数据库信息就可以了,其他数据库信息保存在表中,通过读取表数据加载数据库连接,优点:在数据表中增加数据库配置即可动态增加数据库连接. 本次主要介绍第2种方法: 一.新建数据表:保存数据库连接信息 配置表对应的实体类 public class DbDto { /*

  • java中的前++和后++的区别示例代码详解

    java中的前加加++和后加加++,有很多人搞的很晕,不太明白!今天我举几个例子说明下前++和后++的区别! 其实大家只要记住一句话就可以了,前++是先自加再使用而后++是先使用再自加! 前++和后++总结:其实大家只要记住一句话就可以了,前++是先自加再使用而后++是先使用再自加! 请大家看下面的例子就明白了! public class Test { public static void main(String[] args) { //测试,前加加和后加加 //前++和后++总结:其实大家只要

  • Java中SSM框架实现增删改查功能代码详解

    记录一下自己第一次整合smm框架的步骤. 参考博客和网站有:我没有三颗心脏 How2J学习网站 1.数据库使用的是mySql,首先创建数据库ssm1,并创建表student create database ssm1; use ssm1; CREATE TABLE student( id int(11) NOT NULL AUTO_INCREMENT, student_id int(11) NOT NULL UNIQUE, name varchar(255) NOT NULL, age int(1

  • vue+element table表格实现动态列筛选的示例代码

    需求:在用列表展示数据时,出现了很多项信息需要展示导致表格横向特别长,展示就不够明晰,用户使用起来可能会觉得抓不住自己的重点. 设想实现:用户手动选择表格的列隐藏还是展示,并且记录用户选择的状态,在下次进入该时仍保留选择的状态. 效果图如下: 原: 不需要的关掉默认的勾选: 实现代码: HTML部分就是用一个多选框组件展示列选项 用v-if="colData[i].istrue"控制显示隐藏,把列选项传到checkbox里再绑定勾选事件. <el-popover placemen

  • Java中zip的压缩和解压缩的实现代码

    在Java中可以使用ZipOutputStream和ZipInputStream来实现zip的压缩和解压缩操作,另外使用FileSystem也可以用来实现zip的解压缩,下面将介绍这几种方式,直接上代码. zip压缩 待压缩文件目录结构: 每个zip文件项都要对应一个ZipEntry,然后通过ZipOutputStream的putNextEntry方法开始写入一个新的zip文件项,将文件数据发送到zip输出流中,完成后再调用closeEntry方法. @Test public void test

  • Java中的代理模式详解及实例代码

    java 代理模式详解 前言: 在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为"代理"的第三者来实现间接引用.代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务. 简单来说代理模式就是通过一个代理对象去访问一个实际对象,并且可以像装饰模式一样给对象添加一些功能. 静态代理 所谓静态代理即在程序运行前代理类就已经存在,也就是说我们编写代码的时候就已经把代理类的代码写好了,而动态代理则

  • Java中的Static class详解及实例代码

     Java中的Static class详解 Java中的类可以是static吗?答案是可以.在Java中我们可以有静态实例变量.静态方法.静态块.类也可以是静态的. java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top level class).只有内部类可以为static. 静态内部类和非静态内部类之间到底有什么不同呢?下面是两者间主要的不同. (1)内部静态类不需

  • java实现两个线程交替打印的实例代码

    使用ReentrantLock实现两个线程交替打印 实现字母在前数字在后 package com.study.pattern; import java.util.concurrent.CountDownLatch; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public c

随机推荐