请上传宽度大于 1200px,高度大于 164px 的封面图片
    调整图片尺寸与位置
    滚轮可以放大缩小图片尺寸,按住图片拖动可调整位置,多余的会自动被裁剪掉
取消
sevn(uid:8408)
职业资格认证:尚未取得认证
自定义函数实现表达式筛选数据及其应用
1.添加相关自定义函数class更新附件里的WORK.class至WEB-INF->class->com->fr->function里 在函数管理器里添加这个这个函数. WORK提供的功能:对一个数据列FARRAY,我们可以通过后面的表达来筛选出表达式运算后的值代表的结果及 格式如下: WORK(FARRAY,”表达式”); 表达式支持的运算有+,-,/,*及 ^;例如 "-3* (-5 * (-2)+23 4+22 / 87 / (2^3* 57))" 对于需要过滤多个数据,这边可以让通配符n来代码一个0,1,2... 数 故但我们需要过滤3的倍数时只需要输入表达是“3*n” 2.应用-用来处理特殊的分栏下面介绍分栏应用场景: 实现列分栏要求- A和B列只要显示数据3的倍数加一 C和D列只要显示数据3的倍数加二 E和F列只要显示数据3的倍数 步骤 首先用公式来获取A1,B1代表的数据列 RECORDS("FRDemo","S产品","产品ID") 代表的意思是活FRDemo,S产品,产品ID这列的数据,A1 RECORDS("FRDemo","S产品","产品名称") 代表的意思是活FRDemo,S产品,产品名称这列的数据,及B1 重复A1,B1三次 27571 设置所有单元格扩展方向为纵向,且没有左父格 展示下过如下: 27572 在用上WORD公式去过滤这个数据列 对于A1,B1我们希望是现实3的倍数加一即1+3*n 对于C1,D1 是2+3*n 公式如下 WORK(RECORDS("FRDemo","S产品","产品ID"),"1+3*n") 展示效果如图: 27573 代码文件见附件.
日期控件外用
1.主要文件:Css.文件夹Lang文件夹jquery.dynDateTime.js 这里的内容不需要改动,已经封装好了。放置的位置一般在工程目录下,即web-inf上一层,如果有特殊需求,可以自行改之。2.调用方式:这边使用的test.html来演示如何调用fr 的日期控件。详细代码如下:TEST //加载jquery //以上为将css文件和lang里的文件及jqueyr.dyndatetime.js加载的代码,,具体SRC请自行修改。 $(document).ready(function() { $("#text1").dynDateTime({ ifFormat: "%Y/%m/%d" });//对id为text的input进行日期框进行就处理。其中%Y代表年,%m代表月,%d,代表日。其他符合的都可以自行加例如’/’和’-’ }); 调用方法十分简单。下面是截图演示:1.工程文件275652.启动演示:275663.点击后:275674.选择后:27568
展示当前用户在决策系统中能看那些报表及帆软请求json返回值的处理方式
本帖最后由 sevn 于 2015-9-6 21:18 编辑 展示当前用户在决策系统中能看那些报表及帆软请求json返回值的处理方式1. 问题描述 1.客户在使用决策系统的时候,希望主页能够直接展示该用户能看到的报表的结构图,可能还有扩展功能,比如点击节点跳转到对应的页面。 2.部分二次开发人员知道帆软的接口,但是返回的是一个复杂的json,对象希望有个通用点的解决方式。2.使用说明 2.1原理 使用程序数据集调用帆软的当前用户的权限模板数据(还有其他的接口,可以咨询企业QQ或者查找帮助文档),对返回的数据进行2次开发,使其可以反映一个2维素组,满足程序数据集要求。2.2 步骤 --构建程序数据集 1.构造函数,定义表结构。定义一个参数currenName,代表着当前用户名即参数$fr_useranme public getUserAuthData() { // 定义参数 this.parameters = new Parameter { newParameter("currentName") }; // 定义程序数据集列名 columnNames = new String; for (int i = 0; i < columnNum; i++) { columnNames = "column#" + String.valueOf(i); } } 2.处理数据 public void init() { // 确保只被执行一次 if (valueList != null) { return; } //获取userid String userid = null; try { //调用接口UserControl.getInstance().getByUserName(parameters.getValue().toString()).getId(),将当前用户名转换成ID userid =String.valueOf(UserControl.getInstance().getByUserName(parameters.getValue().toString()).getId()); } catch (Exception e) { e.printStackTrace(); } FRContext.getLogger().info("userid="+userid); //获取当前userId对应的权限模板数据 valueList = new ArrayList(); colNum =5; try { JSONArraymyJson=EntryControl.getInstance().getRootNode().createAuthorizedEntryJSONArray(Long.valueOf(userid)); for (int j=0;jcom->fr->function中完整代码查看附件 --设计模板调用程序数据集 添加程序数据集27552 测试数据用管理员名字 2755327554 构建树数据集 27555 添加一个模板参数27556设计模板为组织树(见文档组织),可查看附件模板登录决策系统,添加该模板数据分析预览地址到主页 27558、管理员登入:27559普通用户登录Anna27560 27561
程序数据集处理网络请求的json数据附件返回json的服务端样例
本帖最后由 sevn 于 2015-9-14 17:30 编辑 @susie 已更新
工具栏自定义按钮,可以在右侧显示
@susie 已更新
如何删除hsql
本帖最后由 sevn 于 2015-9-14 16:31 编辑 @susie 更新了
单独控件的样式修改
本帖最后由 sevn 于 2015-9-14 15:52 编辑 @susie 已更新
让悬浮元素可以移动,并支持导出
@susie 更改完成
客户端打印报表
本帖最后由 sevn 于 2015-9-15 11:39 编辑 @susie 更改完成
URL加密方案
本帖最后由 加菲喵 于 2015-9-10 16:55 编辑 1.问题描述在实际的应用中,用户在使用我们的报表系统时,越来越多的需要对URL进行加密来避免URL参数注入这种对系统安全造成影响的问题,FineReport在目前版本里并没有提供详细的URL加密方法,故现在我们需要自定义个一个filter来实现具体的加密操作,选择加密的方法必须是可逆,可靠的,因此我们下面将讲解下DES加密报表URL的方法。2. DES介绍DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。DES工作的基本原理是,其入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。DES( DataEncryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余热。3. URL加密实际操作 1.在class->com->fr->web目录下放入DESFilter.class文件2744427444 2.web.xml添加filter标签274453.改过引用报表页面的JSP 样例代码如下: <% DESFilter DES=new DESFilter(); ArrayListurl=DES.url("reportlet=34401.cpt&op=write"); Stringurl1=url.get(0).toString();//获取加密后的参数信息 Stringurl2=url.get(1).toString();//获取加密后的密钥 Stringurl_string="http://localhost:8080/WebReport/ReportServer?__rawDataString__="+url2+"&__appkey__="+url1;%> Demo " width = 100% height=100%> 页面其他部分 注意:URL必须需要__rawdataString__和__appkey__ 参数对应的是密钥和加密后的参数4.演示效果 正常页面不会有影响 Index.jsp可以出报表27446URL是加密的切不固定的27448F5之27447DESFilter接口代码已经写好,尽量不要2次书写,代码会在附件给出。
导出指定的sheet
本帖最后由 sevn 于 2015-9-14 19:09 编辑 @susie 见附件word
JAVA实现后台填报操作
本帖最后由 sevn 于 2015-9-14 15:39 编辑 @susie 更改完成
跨域批量打印
@susie
异步打印方案
@susie
让您的模板更NB系列之一鼠标移入和移出单元格自定义提示
绚丽的功能,总是需要写苦逼的代码。模板设置如下:6189A1为展示显示的值,B1为展示悬浮提示元素B1的父格设置如上图.隐藏B1在填报预览下一个加载结束事件6190JS代码如下$("tr :nth-child(n)").bind("mouseover",function(e)//获取所有第一行的单元格并给他添加mouseover事件{var tooltip=""+$(this).next().text()+"";//添加一个div显示选择单元格的下一个单元格内容$("body").append(tooltip);$("#tooltip").css({"top":(e.pageY+10)+"px","left":(e.pageX+10)+"px"}).show("fast");//位置和内容会根据选择单元格内部的相对位置,6191 快速显示出来}).mouseout(function(){$("#tooltip").remove();/移除删除这个DIV});展示效果6188 简单样例只供参考。6191
层式报表解决大数据集展示问题攻略(样例为填报页面---让填报也能支持分页)
实现的思想就是通过在SQL里筛选部分数据库数据,以达到浏览器可以合理的展示报表页面。(数据分段,语句我这采用的是MYSQL,如果要用其他数据库,请查看帮助文档)步骤一:打开fenye.cpt文件(附件里有)。模板界面如下6177两个ds,和一部分数据,及隐藏的一行。隐藏一行内容如下6178这里数据的功能会在下面说起。ds1 里的内容如下6179语句内容 SELECT * from aaa limit ${f},${p}目的是从第${f}跳开始,选择${p}数据(这个$p就是展示的页数,$f的计算可以下面公式($page-1)*$p,mysql的limit的偏移量是从0开始)。在模板参数里,我设置了他们的默认值6180$P=20$page=1;这个和全局参数同理,在模板预览的时候是看不到数据的,必须到展示页面的时候参数才通过url传进来。ds2里的内容如下6181这个语句就比较简单就是求数据总数再除以每页页数,就能得到总页数。报表主体6182第一行的数据分别是前一页,后一页,总页数和当前页以及一个/,用来在工具栏里展示上一页和下一页等操作使用的,这里正常是不显示的,所以我们先屏蔽了(隐藏)。其他的就是用户数据的展示了。为了展示报表能和我们正常报表一样,我们还需要做什么?6183这里就需要写代码能实现上图的效果了。点开填报预览的齿轮6184可以看到我们这里用了7个自定义按钮和一个加载结束事件加载结束事件的代码如下: var toolbar = contentPane.toolbar; var items = toolbar.options.items; var customButton=items;//JQUERY取我们的工具栏上的按钮.items代表的是第三个,也就是那个显示成文本框按钮。 var inner = customButton.$table; var btnWrapper = $("em", inner); btnWrapper.html("");//修正这个按钮的属性,让它变成文本类型,居中,鼠标放上次图标是编辑状态。var cellValue = contentPane.curLGP.getCellValue("D1");//获取D1单元格的值就是page,也就是当前页。var $input = $("input", btnWrapper);$input.val(cellValue);//给这个文本控件复制,用的是JQUERY的方法,可以COPY。var total=contentPane.curLGP.getCellValue("C1");if (total>parseInt(total)){total=parseInt(total)+1;}contentPane.toolbar.options.items.setText(total);//把总页数显示在第5个控件上,因为这个数值可能是小数,所以判断下要不要加一处理。contentPane.toolbar.options.items.setText(contentPane.curLGP.getCellValue("E1"));//把斜线写在第4个控件上。7个自定义按钮:第一个首页:代码如下:window.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page=1";//链接到fenye.cpt,page 参数=1,代表第一页。第二个上一页:代码如下:var page= $("tr","div.content-container").children().eq(0).html(); //取第一行第一个单元格内容。if(page==0){this.setEnable(false);alert("页面超出指定的范围");}elsewindow.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page="+page//如果没有小于1就正常跳转,否则显示页面超过指定的范围,这个控件设置不可以使用。第三个可以跳转的当前页: var toolbar = contentPane.toolbar; var items = toolbar.options.items; var customButton=items; var inner = customButton.$table; var btnWrapper = $("em", inner);var $input = $("input", btnWrapper);//取这个控件$input.blur(function(){ var toolbar = contentPane.toolbar; var items = toolbar.options.items; var customButton=items; var inner = customButton.$table; var btnWrapper = $("em", inner);var $input = $("input", btnWrapper);var page=$input.val();var total=$("tr","div.content-container").children().eq(2).html(); if (total>parseInt(total)){total=parseInt(total)+1;}if(parseInt(page) > parseInt(total) || parseInt(page) < parseInt(1) ){alert("你输出的页数不再指定范围内");}elsewindow.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page="+page});//失去焦点后输入的值是不是在指定的范围内,如果在跳转到指定页面,就在else后面的URL,否则输出你的输出页面不对提示。失去焦点代表就是点击其他地方或者点击TAB键。下面介绍的是点击回车后调整跳转的代码 var toolbar = contentPane.toolbar; var items = toolbar.options.items; var customButton=items; var inner = customButton.$table; var btnWrapper = $("em", inner);var $input = $("input", btnWrapper); $input.bind("keydown", function(e) {if (e.keyCode==13){var toolbar = contentPane.toolbar; var items = toolbar.options.items; var customButton=items; var inner = customButton.$table; var btnWrapper = $("em", inner);var $input = $("input", btnWrapper);var page=$input.val();var total=$("tr","div.content-container").children().eq(2).html(); if (total>parseInt(total)){total=parseInt(total)+1;}if(parseInt(page) > parseInt(total) || parseInt(page) < parseInt(1) || //.test(page) || page.length==0){alert("你输出的页数不再指定范围内");}elsewindow.location.href="${servletURL}?reportlet=fenye.cpt&op=write&page="+page;}});//点击回车跳转和我们分页预览的情况是一样的,2种情况,自行选择您需要的。
个人成就
内容被浏览145,641
加入社区12年121天
返回顶部