最近一直在跟润乾打交道,越来越发现润乾报表的强大~
最近开发了一个报表,需要出统计图同时还可以点击统计图中的某个板块,以此弹出窗口或是将参数传给地图服务以此实现在地图上定位(原需求是这样的),下面就来简单的总结下,不详或是不对之处还望大家多指正。
第一步润乾报表文件的设计,接触过润乾的做一个润乾的统计图应该是不难的~我下面就以饼图为例(其实什么图像都是一样的),如下图:
打开统计图属性定义——显示外观(润乾设计器版本不同可能所在的位置有点不一样),在图形超链接写上需要跳转到js,如:javascript:parent.btnPointsLocate('@category'),注意这个地方的javascript....不需要在最外面写上"",btnPointsLocate是需要跳入执行的js(当然这些都是后话,我们只要进入了js之后就可以随意的做操作,现在主要讲的还是如何@category或是多个参数)。超链接目标窗口:_self表示在当前窗口弹出一个新窗口。
第二步将通过js提交查询参数和润乾报表文件,下面是部分js代码:
if(type=="腐蚀风险"){
paramStr += "&type=fushi&raqName=cp/cpExcavationTypeone.raq";//腐蚀风险
}else{
paramStr += "&type=ganrao&raqName=cp/cpExcavationTypeTwo.raq";//交流干扰风险
}
segmentname = encodeURI(encodeURI($.trim(segmentname)));
testdate = encodeURI(encodeURI($.trim(testdate)));
paramStr += "&segmentname="+segmentname+"&testdate="+testdate+"&segmentid="+segmentid;
var url = "../../../../cp/cpanalysis/excavation/queryExcavationTotal.do?g=c"+paramStr;
$.ajax({
url:url,
method:'POST',
success:function(result){
resultHtml = result;
startProgressBar();
},
error:function(){
$.messager.alert('提示','统计失败','info');
}
});
第三步提交到后台controller,代码应该都是一样的:
@RequestMapping(value = "/queryExcavationTotal")
public ModelAndView queryExcavationTotal(HttpServletRequest request, HttpServletResponse response)
{
try
{
String raqName = request.getParameter("raqName"); // 报表文件名
if (raqName == null)
{
log.error("报表文件为空。");
}
String type = request.getParameter("type");// 测试类型
String segmentname = request.getParameter("segmentname");//管段
String segmentid = request.getParameter("segmentid");
String testdate = request.getParameter("testdate");//测时间
//raq文件需要的参数,包括字段,testTitle
String testTitle = "";
String params = "type = "+type+";";
params += "testTitle="+testTitle+";";
segmentname = EncodeUtils.urlDecode(segmentname);
testdate = EncodeUtils.urlDecode(testdate);
params += "segmentname="+segmentname+";"+"testdate="+testdate+";"+"segmentid="+segmentid+";";
request.setAttribute("params", params);
request.setAttribute("raqName", raqName);
return new ModelAndView("/cp/cpanalysis/protectestatus/excavation/queryExcavation.jsp");
}
catch (Exception e)
{
e.printStackTrace();
log.error("统计分析失败。");
}
return null;
}
第五步,走到这的时候应该是将参数通过jsp页面将传给润乾报表文件了。在这个跳转的过程中我一般是先有一个xx.jsp还有一个xxDetail.jsp页面。xx.jsp页面负责将参数接受并通过url将参数带入xxDetail.jsp页面。
<td>
<iframe name="_reportDetailName" src="queryTestDataDetails.jsp?params=${requestScope.par ams}&reqName=${requestScope.raqName}" id="dailyDetailIFrame" frameborder="0" scrolling=" no"></iframe>
</td>
一下是xxDetail.jsp页面嵌入的一段java代码:
<%
request.setCharacterEncoding("utf-8");
String reqFileName = request.getParameter("reqName");
String param = request.getParameter("params");
String reportFileHome=Context.getInitCtx().getMainDir();
//读取报表模板
String filepathOld = application.getRealPath(reportFileHome + File.separator + reqFileName);
String filePathNew = filepathOld.replace("\\", "\\\\");
ReportDefine rd = (ReportDefine) ReportUtils.read(filePathNew);
Map<String,String> paramMap = new HashMap<String,String>();
if(param.length() > 0){
String[] paramArr = param.split(";");
for(int i=0;i<paramArr.length;i++){
String paramsStr = paramArr[i];
if(paramsStr.indexOf("=") > 0){
String paramName = paramsStr.substring(0,paramsStr.indexOf("="));
String paramValue = paramsStr.substring(paramsStr.indexOf("=")+1);
paramMap.put(paramName,paramValue);
}
}
}
String segmentid = paramMap.get("segmentid");
String excavationDate = paramMap.get("testdate");
//设置统计图图形超链接
INormalCell inc = rd.getCell(2, (short) 1);
GraphProperty gp = inc.getGraphProperty();
String oldurl = gp.getLink();
String newurl = oldurl.replace(")", ",'" + segmentid + "','"+excavationDate+"')");
//重新拼接新的url地址,其实就是javascript:parent.btnPointsLocate('@category')这个,而且还在 //'@category'后加上参数。
gp.setLink(newurl);
inc.setGraphProperty(gp); rd.setCell(2, (short) 1, inc);
//设置request中报表定义对象
String rptName = "RPT_" + Double.toString(Math.random());
request.setAttribute(rptName, rd);
%>
这样点击报表统计图时就会将你要的参数传到js中去了。