如何基于报表工具FineReport进行二次开发 转发

楼主
我是社区第61254位番薯,欢迎点我头像关注我哦~
随着FineReport的发展,它提供的设计器和服务器应该能够满足绝大部分的需求,完全实现零编码的软件开发、革命性地加快软件的开发以及提高软件的稳定性。但是需求千变万化,而FineReport本身所具备的功能是报表中比较典型的,一些比较有个性的功能无法实现,那么就需要应用开发人间使用网页脚本、API接口等进行深入的开发,而这一点,FineReport报表工具是支持的,那么如何来实现插件开发呢?
Ant打包
Ant是一个构建工具,它可以帮助我们将项目开发过程中需要完成的各种步骤组织起来,通过一个简易的方式来构建整个项目。其中一些比较典型的任务就是编译java源代码、运行java程序、拷贝文件或目录、将编译完成的类打包等等。具体的使用方法如下:
1、下载安装Ant
到官网上下载最新的Ant,这里下载的是apache-ant-1.9.7-bin.zip
下载完成后进行解压,这里解压到D:\apache-ant
2、配置环境变量
新建环境变量:ANT_HOME:D:\apache-ant


在环境变量PATH的最后面添加一下内容:
;%ANT_HOME%\bin注意前面的分号,如果PATH最后没有分号“;”的话要加上,有的话就可去除


进入cmd命令窗口,在CMD窗口中输入ant -version,敲击回车键,会显示出安装的ANT版本,说明配置成功了


3、简单Ant编译
首先在D:\plugins-git盘下建立一个build.xml文件,内容如下:
<?xmlversion="1.0"?>
<projectname="helloWorld">
       <targetname="sayHelloWorld">
              <echomessage="Hello,Amigo"/>
       </target>
</project>
进入xml文件路径,运行antsayHelloWorld,如下:


4、进行插件打包
l  将源码下载到本地


l  新增FineReport的jar包,将下图的6个jar包拷贝到lib/report文件夹下


l  打开bulid.xml文件,根据实际安装的jdk位置修改jdk路径


l  打开插件,在插件工程目录下执行ant-fbuild.xml jar


将打包好的文件夹打包成.zip文件,这样这个插件就打包完成,可以在设计器上安装了


l  安装插件
安装完成后,如下图:


安装完成后,可以在公式编辑器中的【函数类型】下看到插件函数了,插件函数里有一些常用的函数如下图:


插件开发实例
1、自定义导出插件
默认的报表工具栏中只能设置Excel导出、Word导出以及PDF导出,如下图所示。如果想导出CSV、TXT等文件就比较麻烦,只能利用自定义按钮来实现。


在FineReport V8.0中提供了工具栏按钮的接口,可以通过此接口来开发插件,实现各种工具栏按钮的功能
l  关键接口
// 国际化文件引入接口  

com.fr.stable.fun.LocaleFinder   

// web端工具栏按钮扩展接口  

com.fr.report.fun.ExtensionButtonProvider   

// 导出处理扩展接口  

com.fr.report.fun.ExportOperateProvider  

// 设计器中工具栏设置中工具栏按钮扩展接口  

com.fr.design.fun.ToolbarItemProvider
l  插件工程结构


l  实现过程
实现关键的几个接口。主要类如下所示对于的piugin.xml中的部分配置
com.fr.plugin.export.csv.core.CsvExport
com.fr.plugin.export.csv.core.CsvExtensionButton
com.fr.plugin.export.csv.ui.CsvExportToolbarUI   
com.fr.plugin.export.csv.CsvLocaleFinder
l  打包插件
在插件目录执行下面的命令,或者直接点击build.bat批处理文件(注意修改JDK路径)
ant -f build.xml jar
安装插件后,在web属性配置界面就可以添加csv导出按钮了,


这个时候在浏览器上预览报表,就可以看到菜单栏上的csv导出按钮,点击就会把当前的报表导出成为csv文件。
2、自定义函数插件开发
在使用FineReport的自定义函数的时候,我们可以通过编译class之后通过函数管理器添加自定义函数,但是这样有如下三个缺点:
1)维护麻烦,每次更新韩式,都需要找到class文件所在的目录之后用新的class文件替换掉
2)自定义函数缺少该函数的使用说明,不知道的人无法正确的使用该函数,提高了沟通成本
3)传播不方便,在一台机器上使用的自定义函数,如果在另外一台机器上也要使用,需要找到需要拷贝的class文件和function.xml文件
为了解决这三个问题,报表工具FineReport中提供了函数定义的接口,可以通过插件来添加自定义函数,具体开发过程如下:
l  关键接口和xml属性
com.fr.stable.fun.FunctionDefineProvider
l  接口属性
配置属性值描述
class自定义函数类别
name函数名
description函数使用描述

l  使用方法
<FunctionDefineProvider class="com.fr.plugin.function.MyFunction" name="my" description="函数的描述"/>
l  Piugin.xml内容HTML/XML代码
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin>
    <id>com.fr.plugin.function.collection</id>
    <name><![CDATA[自定义函数集合]]></name>
    <active>yes</active>
    <version>1.1</version>
    <env-version>8.0</env-version>
    <jartime>2015-09-10</jartime>
    <vendor>author</vendor>
    <description><![CDATA[自定义函数插件]]></description>
    <change-notes><![CDATA[无]]></change-notes>
    <extra-core>
        <FunctionDefineProvider class="com.fr.plugin.function.MyFunction" name="my" description="拼接两个参数。调用方式:=my(C4, C5)"/>
       <FunctionDefineProviderclass="com.fr.plugin.function.YourFunction" name="you"description="我的函数"/>     </extra-core> </plugin>
l  实现内容(拼接两个字符串)
[url=]importcom.fr.general.GeneralUtils;[/url]
import com.fr.script.AbstractFunction;
import com.fr.stable.ArrayUtils;
import com.fr.stable.Primitive;
public class MyFunction extendsAbstractFunction {
   @Override
   public Object run(Object[] args) {
        if (ArrayUtils.getLength(args) < 2) {
           return Primitive.ERROR_VALUE;
       }
       return GeneralUtils.objectToString(args[0]) +GeneralUtils.objectToString(args[1]);
    }
}
l  插件打包和安装
在插件工程目录下执行
ant -f build.xml jar
安装好插件后,会获取到插件安装包,通过设计器安装该插件后,可以在公式编辑器中的“插件函数”项下看到插件函数了
分享扩散:
参与人数 +1 F豆 +1 理由
13401074559 + 1 骚年,我看好你哦

查看全部评分

沙发
发表于 2017-12-25 14:32:45
你妹的。。。吓我一跳。我还以为是你写的呢
板凳
发表于 2017-12-25 14:46:59
收藏,学习。
地板
发表于 2017-12-25 21:34:42
估摸啥时候开始玩二开了??
5楼
发表于 2019-1-15 20:15:42
6楼
发表于 2019-2-25 17:24:14
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

7回帖数 2关注人数 15022浏览人数
最后回复于:2019-2-25 17:24

返回顶部 返回列表