一、开发版本确认
帆软报表不支持向下兼容,10版本开发8版本打不开,所以开发确认服务器帆软版本很关键
二、帆软与数据库建立连接
服务器---》定义数据连接---》点击绿色加号
mysql数据库:myku:数据库名字
驱动器:com.mysql.jdbc.Driver
URL:jdbc:mysql://127.0.0.1:3306/myku?useSSL=false&serverTimezone=UTC
编码:记得选UTF-8
oracle数据库:ORCL:数据库名字
可以用sql查询数据库名字:select name from v$database
驱动器:oracle.jdbc.driver.OracleDriver
URL:jdbc:oracle:thin:@127.0.0.1:1521:ORCL
编码:记得选UTF-8
三、建数据源
点击左下角加号---》弹框中填数据源名字,选数据源连接的服务(sql写完记得预览)
注意:开发环境的服务配置名称需要跟服务器一致,否则下次还得改。
四、开发报表
编辑区中间可以拖动左侧数据源列到报表编辑区
a.序号
序号可以右上角"插入公式"搜seq选中保存
注意:如果序号被合并了,可以选择对应序号行设置左父格为其他要参考的列(不记表头开始),这样序号会根据其他列 的行数显示。
b.重复数据不合并
点击对应列,右上角数据设置 "分组"改成"列表"
c.数据字典映射
点击数据列,右下角倒数第二选项"数据字典"添加对应的字典;数据列表就能渲染
五、报表的部署
以帆软8为例:FineReport_8.0\WebReport
a.拷贝文件
拷贝帆软8安装目录下的WebReport到部署项目的tomcat的webapps下面
b.修改帆软配置文件
FineReport_8.0\WebReport\WEB-INF\resources\datasource.xml
找到配置的服务,改成服务器的配置
c.重启tomcat
六、确认报表路径
a.确认报表路径
点击自己本地的报表预览,得路径http://localhost:8075/WebReport/ReportServer?reportlet=xxx.cpt
将服务器地址跟报表名称改成要调用的即可
七、调用报表
方式一、直接展示:在html页面加iframe
<iframe id="reportFrame" width="100%" height="100%" src="http://1127.0.0.1:8080/WebReport/ReportServer?reportlet=/路径/xxx.cpt"></iframe>
方式二、弹框展示
将帆软服务器路径配置yml中,通过java类返回前端
java类
package com.sdp.web.app.controller.common;
import com.sdp.web.app.springboot.controller.separate.SeparateDataController;
import com.sdp.web.session.UserSession;
import com.sdp.web.util.Log;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@RequestMapping("/config")
@RestController
public class ConfigController extends SeparateDataController {
@Value("${fineReport.path}")
private String reportPath;//帆软报表路径
public ConfigController() {
super();
}
/**
* 获取AppId
* @param json
* @return
*/
@RequestMapping("/getFr")
public String getConfigData(@RequestBody JSONObject json, HttpServletRequest request) {
StringBuffer su = request.getRequestURL();
Log.info("浏览器路径》》》》》》》》》》》"+su);
if(su.indexOf("https")>=0){
reportPath.replace("http","https");
Log.info("全路径》》》》》》》》》》》https");
};
Log.info("帆软路径》》》》》》》》》=====》》"+reportPath);
//String path = String.valueOf(UserSession.getCurAppContext().getAppConfig().getPropertyParams().getProperty("frServer"));
return toJSONString(200, "success", reportPath);
}
private String toJSONString(int code, String ok, String data) {
HashMap<String, Object> ret = new HashMap();
ret.put("code", 200);
ret.put("ok", ok);
ret.put("data", data);
return JSONObject.fromObject(ret).toString();
}
}
前端获取服务器地址,封装参数请求到帆软服务器
// =================================================================================================
// -- CF
//--------------------------------------------------------------------------------------------------
/**
* @description 常量
*/
var CF = {
version: '1.0',
baseDir: null, //应用服务基础路径
reportURL: null //FineReport服务器地址
};
//--------------------------------------------------------------------------------------------------
// =================================================================================================
/**
* 初始配置
*/
$(function() {
//获取应用基础路径
CF.getBaseDir();
//获取报表服务地址
CF.getFineReportURL();
});
/**
* 打开FineReport模板
* @param rpt
* @param param
*/
CF.openReport = function (rpt, param) {
if(CF.reportURL){
var rpURL = CF.reportURL + '?reportlet=' + rpt + param;
parent.parent.layer.open({
title: '报表查看',
type: 2,
area: ['95%', '95%'], //设置窗口的大小
content: rpURL,
maxmin: true,
end:function(){
//$('#ff').form('reset');
layer.close(index);
}
});
} else {
layer.alert('请求结果异常,无法获取报表服务地址!', {
title: '异常提示', icon: 0, closeBtn: 0
});
}
};
/**
* 获取应用基础路径
* @returns {string}
*/
CF.getBaseDir = function () {
if (!CF.baseDir){
var curPath = window.document.location.href; //获取当前网址,如: http://localhost:8080/ems/Pages/Basic/Person.jsp
var pathName = window.document.location.pathname; //获取主机地址之后的目录,如: /ems/Pages/Basic/Person.jsp
var pos = curPath.indexOf(pathName);
var hostPath = curPath.substring(0, pos); //获取主机地址,如: http://localhost:8080
var projectName = pathName.substring(0, pathName.substr(1).indexOf('/') + 1); //获取带"/"的项目名,如:/ems
var sss = hostPath + projectName + "/";
CF.baseDir = hostPath + projectName + "/"; //获取项目的basePath http://localhost:8080/ems/
}
return CF.baseDir;
}
/**
* 获取FineReport服务器地址
* @returns {string}
*/
CF.getFineReportURL = function(){
if (!CF.reportURL){
var _url = CF.baseDir + 'config/getFr';
var res = $.ajax({
type: "post",
url: _url,
async: false,
data: "{}",
dataType: "json",
contentType: "application/json;charset=UTF-8"
});
var vs = jQuery.parseJSON(res.responseText);
if (vs && vs.code == 200) {
if (vs.data) {
CF.reportURL = vs.data;
} else {
layer.alert('请求结果异常,状态码:' + vs.code + ',状态信息:无法获取FineReport服务器地址!', {
title: '异常提示', icon: 0, closeBtn: 0
});
}
}
}
return CF.reportURL;
}
页面调用:(参数的三目运算还是有必要的,否则容易出现参数传递出错)
function exportTable(){
var param1=$("#param1").val();
param1=param1?param1:"";
var param2=$("#param2").val();
param2=param2?param2:"";
var param3=$("#param3").val();
param3=param3?param3:"";
var param4=$("#param4").textbox("getValue");
param4=param4?param4:"";
CF.openReport('/路径/XXX.cpt','¶m1='+param1+'¶m2='+param2);
}