`
wingware
  • 浏览: 142728 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JasperReport动态列

阅读更多
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.PrintServiceAttributeSet;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.PrinterName;
 
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRReport;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.base.JRBaseLine;
import net.sf.jasperreports.engine.base.JRBasePrintText;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignStaticText;
import net.sf.jasperreports.engine.design.JRDesignTextField;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.export.JRPrintServiceExporter;
import net.sf.jasperreports.engine.export.JRPrintServiceExporterParameter;
import net.sf.jasperreports.engine.util.JRSaver;
 
import org.apache.commons.beanutils.BasicDynaBean;
import org.apache.commons.beanutils.BasicDynaClass;
import org.apache.commons.beanutils.DynaBean;
import org.apache.commons.beanutils.DynaProperty;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
import com.inqgen.iqlis.template.jsf.bean.TemplateDirectoryAdminBean;
 
/**
 * JasperReport 動態列 打印
 * @author hxy
 *
 */
public class ReportProcess {
 
 private static Log logger = LogFactory
   .getLog(TemplateDirectoryAdminBean.class);
 /** 設置字段寬度 */
 private final static int textWidth = 80;
 /** 設置字段高度 */
 private final static int textHeight = 20;
 /** coulumnHeader區域字體大小 */
 private final static int columnHeaderfontSize = 14;
 /** detail 區域字體大小 */
 private final static int fontSize = 12;
 /** 設置間距 */
 private final static int X = 80;
 /** coulumnHeader區域高度 */
 private final static int columnHeaderHeight = 20;
 /** detail 區域高度 */
 private final static int detailHeight = 20;
 /**  */
 private static String aliasColumn = "column";
 
 public static void main(String args[]){
  try {
   String[] columns = {"字段1", "字段2", "字段3", "字段4"};
   File f = new File("d://test.pdf");
   List<Object[]> list = new ArrayList<Object[]>();
   Object[] obj = null;
   for(int j=0;j<50;j++){
    obj = new Object[columns.length];
    for(int i=0;i<columns.length;i++){
     obj[i] = columns[i]+j+","+i;
    }
    list.add(obj);
   }
   OutputStream out = new FileOutputStream(f);
   preview(columns, list, out);
   out.close();
   logger.info("成功~");
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 /**
  * PDF打印
  * 
  * @param headers
  *            colimnHeaders
  * @param list
  *            數據來源
  * @param out
  *            輸出流
  * @throws Exception
  */
 public static void preview(String headers[], List<Object[]> list,
   OutputStream out) throws Exception {
  long start = System.currentTimeMillis();
  String[] alias = preaseAliasColumnHeaders(headers);
  JasperReport jp = getJasperReport(headers, alias);
  Map<String, Object> parameters = new HashMap<String,Object>();
  JasperPrint jasperPrint = JasperFillManager.fillReport(jp, parameters,
    new JRBeanCollectionDataSource(getBaseList(alias, phrase(list))));
  logger.info("Filling time : " + (System.currentTimeMillis() - start));
  JasperExportManager.exportReportToPdfStream(jasperPrint, out);
  logger.info("Printing time : " + (System.currentTimeMillis() - start));
 }
 
 /**
  * 打印機打印報表
  * 
  * @param headers
  *            colimnHeaders
  * @param list
  *            數據來源
  * @param parameters
  *            Map 參數
  * @param printerName
  *            打印機名稱
  *  @param printerName
  *            打印機份數
  * @param tempFileName
  *            创建报表打印临时文件的路径
  * @throws Exception
  */
 public static void print(String headers[], List<Object[]> list,
   Map<String, Object> parameters, String printerName, int copies,
   String tempFileName) throws Exception {
  long start = System.currentTimeMillis();
  /** 获取打印报表数据 */
  String[] alias = preaseAliasColumnHeaders(headers);
  JasperReport jp = getJasperReport(headers, alias);
  JasperPrint jasperPrint = JasperFillManager.fillReport(jp, parameters,
    new JRBeanCollectionDataSource(getBaseList(alias, phrase(list))));
  /** 保存向打印机发送的临时报表数据 */
  JRSaver.saveObject(jasperPrint, tempFileName);
  logger.info("Filling time : " + (System.currentTimeMillis() - start));
  /** 设置打印参数 */
  PrintRequestAttributeSet printRequestAttributeSet = new HashPrintRequestAttributeSet();
  /** 设置A4纸张 */
  printRequestAttributeSet.add(MediaSizeName.ISO_A4);
  /** 設置打印份數 */
  printRequestAttributeSet.add(new Copies(copies));
  /** 设置打印机 */
  PrintServiceAttributeSet printServiceAttributeSet = new HashPrintServiceAttributeSet();
  /** 添加打印机名称 */
  // "Epson Stylus 800 ESC/P// 2"
  printServiceAttributeSet.add(new PrinterName(printerName, null));
  /** 打印机对象 */
  JRPrintServiceExporter exporter = new JRPrintServiceExporter();
  /** 向打印机发送的临时报表数据 */
  exporter
    .setParameter(JRExporterParameter.INPUT_FILE_NAME, tempFileName);
  exporter.setParameter(
    JRPrintServiceExporterParameter.PRINT_REQUEST_ATTRIBUTE_SET,
    printRequestAttributeSet);
  exporter.setParameter(
    JRPrintServiceExporterParameter.PRINT_SERVICE_ATTRIBUTE_SET,
    printServiceAttributeSet);
  /** 是否弹出打印页数的提示对话框 */
  exporter.setParameter(
    JRPrintServiceExporterParameter.DISPLAY_PAGE_DIALOG,
    Boolean.FALSE);
  /** 是否弹出打印机设置属性的提示对话框 */
  exporter.setParameter(
    JRPrintServiceExporterParameter.DISPLAY_PRINT_DIALOG,
    Boolean.FALSE);
  /** 执行打印机打印报表 */
  exporter.exportReport();
  logger.info("Printing time : " + (System.currentTimeMillis() - start));
 }
 
 public static List<String[]> phrase(List<Object[]> list){
  List<String[]> temps = new ArrayList<String[]>();
  String []s= null;
  for(Object[] obj : list){
   s = new String[obj.length];
   for(int i = 0;i<obj.length;i++){
    s[i] = obj[i].toString();
   }
   temps.add(s);
  }
  return temps;
 }
 
 /**
  * 產生columnHeaders的別名(Headers[]有可能為中文,所以有必要用別名來替換)
  * 
  * @param headers
  * @return
  */
 private static String[] preaseAliasColumnHeaders(String headers[]) {
  int size = headers.length;
  String[] alias = new String[size];
  for (int i = 0; i < size; i++) {
   alias[i] = aliasColumn + i;
  }
  return alias;
 }
 
 /**
  * 產生Template文件
  * 
  * @param headers
  * @param alias
  * @return
  * @throws JRException
  */
 @SuppressWarnings("deprecation")
 private static JasperReport getJasperReport(String[] headers,
   String alias[]) throws JRException {
  JasperDesign design = new JasperDesign();
 
  // name="statistics"
  design.setName("statistics");
  // columnCount="1"
  // printOrder="Vertical"
  design.setPrintOrder(JRReport.PRINT_ORDER_VERTICAL);
  // orientation="Portrait"
  design.setOrientation(JRReport.ORIENTATION_PORTRAIT);
  // pageWidth="595"
  design.setPageWidth(595);
  // pageHeight="842"
  design.setPageHeight(842);
  // columnWidth="535"
  design.setColumnWidth(535);
  // columnSpacing="0"
  design.setColumnSpacing(0);
  // leftMargin="30"
  design.setLeftMargin(30);
  // rightMargin="30"
  design.setRightMargin(30);
  // topMargin="20"
  design.setTopMargin(20);
  // bottomMargin="20"
  design.setBottomMargin(20);
  // whenNoDataType="NoPages"
  design.setWhenNoDataType(JRReport.WHEN_NO_DATA_TYPE_BLANK_PAGE);
  // isTitleNewPage="false"
  design.setTitleNewPage(false);
  // isSummaryNewPage="false"
  design.setSummaryNewPage(false);
 
  // JRDesignBand title = new JRDesignBand();
  // title.setHeight(50);
  // JRDesignStaticText titleText = new JRDesignStaticText();
  // titleText.setText("test report");
  // titleText.setX(230);
  // titleText.setFontSize(20);
  // titleText.setHeight(50);
  // titleText.setWidth(100);
  // title.addElement(titleText);
  // design.setTitle(title);
  JRDesignBand columnHeader = new JRDesignBand();
  columnHeader.setHeight(columnHeaderHeight);
 
  JRDesignBand detail = new JRDesignBand();
  detail.setHeight(detailHeight);
 
  for (int i = 0; i < headers.length; i++) {
   // add column headers
   JRDesignStaticText staticText = new JRDesignStaticText();
   staticText.setText(headers[i]);
   staticText.setFontSize(columnHeaderfontSize);
   staticText.setHeight(textHeight);
   staticText.setWidth(textWidth);
   staticText.setX(X * i);
   staticText.setPdfFontName("MHei-Medium");
   staticText.setPdfEmbedded(true);
   staticText.setPdfEncoding("UniCNS-UCS2-H");
   staticText.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);
   staticText.setLeftBorder(JRBaseLine.PEN_1_POINT);
   staticText.setTopBorder(JRBaseLine.PEN_1_POINT);
   staticText.setRightBorder(JRBaseLine.PEN_1_POINT);
   staticText.setBottomBorder(JRBaseLine.PEN_1_POINT);
   columnHeader.addElement(staticText);
 
   // define fields
   JRDesignField field = new JRDesignField();
   field.setName(alias[i]);
   field.setValueClass(String.class);
   design.addField(field);
 
   // add text fields for displaying fields
   JRDesignTextField textField = new JRDesignTextField();
   JRDesignExpression expression = new JRDesignExpression();
   expression.setText("$F{" + alias[i] + "}");
   expression.setValueClass(String.class);
   textField.setExpression(expression);
   textField.setFontSize(fontSize);
   textField.setHeight(textHeight);
   textField.setWidth(textWidth);
   textField.setX(X * i);
   textField.setPdfFontName("MHei-Medium");
   textField.setPdfEmbedded(true);
   textField.setPdfEncoding("UniCNS-UCS2-H");
   textField.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);
   textField.setLeftBorder(JRBaseLine.PEN_1_POINT);
   textField.setTopBorder(JRBaseLine.PEN_1_POINT);
   textField.setRightBorder(JRBaseLine.PEN_1_POINT);
   textField.setBottomBorder(JRBaseLine.PEN_1_POINT);
   detail.addElement(textField);
  }
  design.setColumnHeader(columnHeader);
  design.setDetail(detail);
 
  return JasperCompileManager.compileReport(design);
 }
 
 /**
  * 利用反射機制,裝拼數據
  * 
  * @param headers
  * @param list
  * @return
  * @throws Exception
  */
 private static List<Object> getBaseList(String[] headers,
   List<String[]> list) throws Exception {
  List<Object> result = new ArrayList<Object>();
  int length = headers.length;
  DynaProperty[] dynaProps = new DynaProperty[length];
  for (int i = 0; i < length; i++) {
   dynaProps[i] = new DynaProperty(headers[i], String.class);
  }
  BasicDynaClass dynaClass = new BasicDynaClass("first",
    BasicDynaBean.class, dynaProps);
  for (Object[] obj : list) {
   DynaBean employee = dynaClass.newInstance();
   for (int i = 0; i < length; i++) {
    employee.set(headers[i], obj[i]);
   }
   result.add(employee);
  }
  return result;
 }
 
}
分享到:
评论

相关推荐

    jasperReport动态列的实现

    实现了jasperReport进行报表动态列的实现,使用者只需要利用eclipse将工程文件导入,即可查看运行结果的展示,不需要其他的配置和jar包如果想进行动态展示只需要修改构造参数就可以看到动态的展示

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

    jasperreport 6.4.1报表动态列,以及生成导出html,可直接导入到eclipse中进行运行,包含一个完整的demo

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

    主要介绍了Java 中jasperReport实现动态列打印的实现代码的相关资料,希望通过本文大家能掌握这部分内容,需要的朋友可以参考下

    jasperReport 动态合并单元格示例

    jasperReport 动态合并单元格示例

    基于Jasperreport动态单元格合并模板

    基于Jasperreport动态单元格合并模板,支持多层分组排序,支持多分组动态合并单元格,附件中有两组以及大于两组的模板实例。

    JasperReport动态表头及subreport实现多表

    使用subreport实现多表分页并动态适应列数,目前还在努力实现中,后续将更新。。。

    动态生成JasperReports报表

    该小项目以编码形式实现了JaperReports的动态报表功能,以满足用户对报表的高度定制化。 使用该项目时的注意事项: 1.使用Eclipse导入该项目 2.下载JasperReports Library,将JasperReports的jar文件及其依赖jar...

    ireport固定表头隐藏列

    本报表在jasperreports-5.6.0基础上增加以下功能; 1、 表头固定 2、 列的隐藏及显示 3、 列的固定 示例代码可正常运行、本代码为非正式版

    jasper动态输出列 工程带jar包

    jasper动态输出列 工程带全部jar包 配置JDK即可运行 建议jdk 8

    基于jbpm与activiti的工作流平台技术架构介绍

    同时系统可以支持URL访问权限、数据权限、列权限及页面按钮权限的统一配置管理。系统的安全认证机制如下所示: 【图五】系统安全拦截原理 4.动态表单管理 BPMX3提供了基于数据库内部表、外部表、视图等来生成在线...

    JSP实用技巧集合,jsp编程的一些小技巧总结

    51. 使用iReport和Jasperreport开发报表? 52. 使用iText生成PDF? 53. 制作图片水印? 54. 在页面中屏蔽键盘功能键? 55. 禁止用户复制网页内容? 56. 实现不在地址拦中显示当前URL? 57. 获取用户的真实IP地址? 58...

    jsp编程技巧集锦

    使用iReport和Jasperreport开发报表? 52. 使用iText生成PDF? 53. 制作图片水印? 54. 在页面中屏蔽键盘功能键? 55. 禁止用户复制网页内容? 56. 实现不在地址拦中显示当前URL? 57. 获取用户的...

Global site tag (gtag.js) - Google Analytics