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

JasperReport

 
阅读更多

20:45

JasperReport

JasperReport提供很多服务,其中我们常用的是JasperReports Liberary,众多产品中的一员。

JasperReport还提供报表服务器产品、ETL产品、报表工具Studio产品、Ireports Designer产品。

JasperReport还提供多种数据交换工具,如Hadoop ConnectorJasperMobile for Android

JasperReportsLiberary源码下载

1http://community.jaspersoft.com

IReport加载环境变量

场景

在制作报表的时候少不了对传递过来的报表数据进行转换(比如将金额转换成3位一逗),这时我们可以使用Java封装出对数据进行转换的类,然后在IReport中调用。

操作

计算机生成了可选文字: 翼誉设定ClaSSpExportoptions

计算机生成了可选文字: 口巨一困薰枕黔{nrT10nSnlTI0ngnIT10nSaVU一fonnorph一1MOYed0Wn

IReport中行的浮动

场景

制作一个报表模板包含columnHeaderdetailcolumnFooter三个区域,其中detail区域中的数据是循环的,然后因为数据不多造成detailcolumnFooter区域出现间隔。

解决办法

需要配置columnFooter为浮动,这样columnFooterdetail的间距就变成动态的了。

计算机生成了可选文字: 下C。‘"mn‘「sc『,p,'e,…M。『el丽1在新的一页有表头口在新的一贡有表尾口Ioatingcolumnfooter回lgnorepagination口vertical},NoPages

IReport列的扩展

场景

报表有多行多列,其中同一行的某些列内容太大需要换行,换行后需要当前行的单元格统计调整高度,在润乾中有单元格跟随扩展的机制,在IReport中需要设置

计算机生成了可选文字: Positiontype

但不是每个单元格都设置,只需要对出现间隔段的单元格设置成

计算机生成了可选文字: PositiontypePrintwhengroupchanges

Ireport#Java调用API打印传数据的规则

场景

jsp查询页==>jsp数据呈现页,该页中有原始数据Bean[打印]按钮==>点击[打印]按钮==>跳转allReport.jsp==>request#Session中取数据Bean,适配为报表API可用的数据格式对象,调用报表打印API,报表流转储。

分析

报表API之外数据的流转主要是RequestSessionJSP传递的,这些比较简单,在这些数据要传入报表API时就有些特定的规则,报表API提供了数据结构的封装接口,所有数据提供者必须实现API定义的规范才可以。

图示

计算机生成了可选文字: at白sourc。net,fja:perreport,.enginesvDatasource一net.sf.Jasperreports.en'ine.data皿侧0。0邢卿0创O曰ibernateAbstractDatasource一net.sfjasperreports.engirJ拙ibernatelterateDat'o世ce一netsfja:perreports;曰·;洲HiberoateLi:tDatasource一netsfja:perreports洲HibernatescrollDat'ource一net,fJa:perreportse,公tsetDatasource一net,fja,perreport,.engine耳:t。卿。tas。ur。。一。。。n:t。.,ep。rtutii司卜一一一一一Nstc刀旺atasource一comnstcreport.reportUtilNstc洲刀at心ource一comnstc.report.reportlltilNstc助QXDatasource一comnstcreportUtilNstc加QXDatasource一comnstcreport.reportUtilNstc加QXDataso叮ce一comnstcreport.reportUtil0孚通Vduestackl)atasource一comopens卿pho叮webworkvi洲Rewind的leDataso世ce一net.,fja'perreports.engineeepeepeeo:····...··;白

示例代码

public class JasperDataSource implements JRDataSource {
    private Collection dataBeans;
    private Object currBean;
    private Iterator iterator;
    public void setDataBeans(Collection dataBeans) {
        this.dataBeans = dataBeans;
        iterator = this.dataBeans.iterator();
    }
    public boolean next() throws JRException {
        if (iterator.next()) {
            currBean = iterator.next();
            return true;
        }
        return false;
    }
    public Object getFieldValue(JRField field) throws JRException {
        String fieldName = field.getName();
        if (currBean instanceof java.util.Map) {
            return ((java.util.Map) currBean).get(fieldName);
        }
        return null;
    }
}

JasperReport#报表编译

编译涉及到的实例

net.sf.jasperreports.engine.JasperReportsContext

上下文

srcDir

jrxml目录

destDir

编译后的成果物输出目录

tempDir

临时目录

net.sf.jasperreports.engine.JasperCompileManager

封装报表编译、转储,对外部提供简单的报表编译API

示例

import java.io.File;
import java.io.FileFilter;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperReportsContext;
import net.sf.jasperreports.engine.SimpleJasperReportsContext;
import net.sf.jasperreports.engine.design.JRCompiler;


/**
 * 编译报表
 * @author WangYanCheng
 * @version 2013-3-29
 */
public class CompileReport {
    /***/
    private File jrxmlFile;
    private File jasperFile;
    private static File tmpFile = new File("D:\\compileReportTemp");
    private static File jarPath = new File("D:\\jasper\\jars");
    /**
     * 构造方法
     * @param jrxmlFile 原始报表描述文件
     * @param jasperFile 编译报表后输出文件
     */
    public CompileReport(File jrxmlFile, File jasperFile) {
        this.jrxmlFile = jrxmlFile;
        this.jasperFile = jasperFile;
        if (!tmpFile.exists()) {
            tmpFile.mkdir();
        }
    }
    /**
     * 入口
     */
    public void doWork() {
        JasperReportsContext jasperReportsContext = new SimpleJasperReportsContext();
        jasperReportsContext.setProperty(JRCompiler.COMPILER_TEMP_DIR, tmpFile.getAbsolutePath());
        jasperReportsContext.setProperty(JRCompiler.COMPILER_KEEP_JAVA_FILE, "true");
        jasperReportsContext.setProperty(JRCompiler.COMPILER_CLASSPATH, getClassPath());
        try {
            JasperCompileManager.getInstance(jasperReportsContext).compileToFile(jrxmlFile.getAbsolutePath(), jasperFile.getAbsolutePath());
        } catch (JRException e) {
            e.printStackTrace();
        }
    }
    /**
     * 报表编译所需环境变量
     * @return classpath 环境变量
     */
    public String getClassPath() {
        StringBuffer sbuf = new StringBuffer(".;");
        File[] libFile = scanFile(jarPath, ".*jar$");
        for (File pathItem : libFile) {
            sbuf.append(pathItem.getAbsolutePath()).append(";");
        }
        return sbuf.toString();
    }
    /**
     * 文件扫描,取给定格式匹配的文件
     * @param dirFile 目录
     * @param expStr 匹配表达式
     * @return 文件组
     */
    private File[] scanFile(File dirFile, final String expStr) {
        File[] rtnFile = null;
        if (dirFile.isDirectory()) {
            rtnFile = dirFile.listFiles(new FileFilter() {
                @Override
                public boolean accept(File fileInst) {
                    return fileInst.getName().matches(expStr);
                }
            });
        }
        return rtnFile;
    }
    /**
     * 测试入口
     * @param args 参数列表
     */
    public static void main(String[] args) {
        File srcFile = new File("D:\\jasper\\HelloJasper.jrxml");
        File destFile = new File("D:\\jasper\\HelloJasper.jasper");
        CompileReport cpInst = new CompileReport(srcFile, destFile);
        cpInst.doWork();
    }
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics