导入excel作为报表查询参数

一.需求背景:
用户要根据多个商品代码来查询商品相关信息,参数填报表单可以通过编辑框输入多个以“,”分割商品代码,或采用多选下拉数据集的形式来满足以上需求。但是如果商品代码数量多,那传统的方式就需要用户重复的录入或者多次进行下拉数据集数据的选择,这样的方式不够便捷,而且一旦输入或选择有误不易修改。因此,报表的查询表单需要提供导入excel数据的功能的需求产生,该功能可以利用事先在excel中编辑的商品代码列表结果,也可以利用其他报表导出的数据结果,省去用户手动输入的麻烦,提升查询效率。

二.实现思路:
1. 利用填报表的导入excel功能,将excel的数据导入。
2. 利用填报表的自定义填报风格,结合javascript,完成excel数据向主报表的传递。

三.实现步骤:
1. 主查询页面(parent.jsp)和主报表(main.raq)
完成功能:打开excel导入页面,获取导入值,根据excel导入数据执行查询。
主报表(main.raq)
参数定义:
 
spbm为普通参数,数据类型为字符串。
spbm2为动态参数,将传入的spbm值按分割符“,”分割成多个子串,数据类型为字符串。
数据集定义:
 
 
报表设计
 
其中需要注意的是报表的填报类型是可以填报。
另外设置C1单元格的编辑风格为自定义,调用主查询页面(parent.jsp)的js函数来显示和隐藏控件。
 
主查询页面(parent.jsp)
部分代码:
<script type=”text/javascript”>
 function onOpenWindow(obj){    //showModalDialog的第二个参数是传递给子窗口的值,该函数返回的值是从子窗口传递过来的值。  
  //在子窗口可以通过window.dialogArguments方法获取   
  //如果不需要传递,这个参数就用window本身,本例中没有传递参数给子窗口
 var result = window.showModalDialog(“child.jsp”,window,”dialogWidth:600px;dialogHeight:600px”); 
//利用子窗口的传递值刷新父窗口,父窗口可以执行查询
 if(result != null){      
      window.location=”parent.jsp?spbm=”+ result[0];
 }
}
//显示导入excel子页面
   function show()
  {
  var cell = event.srcElement;
  onOpenWindow(cell.id);
  }      
  function hidden()
  {      
     //这里可添加其他处理代码  
  }
  
</script>
<%
 
 StringBuffer param=new StringBuffer();
 Enumeration paramNames = request.getParameterNames();
 if(paramNames!=null){
  while(paramNames.hasMoreElements()){
   String paramName = (String) paramNames.nextElement();
   String paramValue=request.getParameter(paramName);
   if(paramValue!=null){
    //把参数拼成name=value;name2=value2;…..的形式
    param.append(paramName).append(“=”).append(paramValue).append(“;”);
   }
  }
 }
%>
 <table  align=”center”><tr><td>
  <report:html name=”report1″ reportFileName=”main.raq”
   funcBarLocation=”"
   needPageMark=”yes”
   generateParamForm=”no”
   params=”<%=param.toString()%>”
   exceptionPage=”/reportJsp/myError2.jsp”
   width=”-1″
   
  />
</td>
</tr></table>

2. 导入excel页面(child.jsp)和子报表(importExcel.raq)的设计
完成功能:导入excel数据,返回excel导入值给主查询页面。
子报表(importExcel.raq):
 
该报表为填报表,其中A3单元格需要设置其扩展方向为纵向扩展,B1单元格计算导入的excel单元格数,设置自动计算表达式count(A3{})-1(从A3扩展出的第二个格子导入excel的数据)。
导入excel页面(child.jsp)
部分代码
<table align=”center”>
<tr><td align=”top”><input type=”submit” name=”Submit” value=”确定” onclick=”onOK();” />&nbsp;&nbsp;<input type=”submit” name=”Submit” value=”取消” onclick=’javascript:form1.reset();’ /></td>
 </tr>
 <tr><td>
  <report:html name=”report1″ reportFileName=”/importExcel.raq”
   funcBarLocation=”top”
   needPageMark=”yes”
   generateParamForm=”no”
   exceptionPage=”/reportJsp/myError2.jsp”
   needImportExcel=”yes”
  />
 </td></tr>
 </table>
 <script type=”text/javascript”>
 //获取单元格显示值
 function _getDispValueByName(reportName, cellName){
 var cell = document.getElementById(reportName+”_”+cellName);
 return cell .innerText;
}
//点击确定,将商品代码列表形如11022321, 28420003, 28420005, 28420003返回给主查询页面(parent.jsp)
function onOK(){   
 var runValue=new Array; 
 runValue[0]=getCycle(“A3″,”report1″);   
 window.returnValue = runValue;   
 window.close();
}
//对扩展格循环取值,拼接商品代码字符串形如11022321, 28420003, 28420005, 28420003
function getCycle(cellName, reportName){  //cellName为扩展格的名称,reportName为tag的name属性
var rid = reportName+”_”+cellName.substr(0,cellName.length-1);   //算出report1_A这样的格式串
var start=parseInt(cellName.substr(cellName.length-1,1)); //算出扩展格起始行号
var n=parseInt(_getDispValueByName(‘report1′,’B1′));//得到导入的excel单元格数
//alert(n+start);
var valueString=”";
for(var i=start; i<=n+start; i++)
{
var tempId = rid+i.toString();  //拼出report1_A3这样的格式串
var tempValue = document.getElementById (tempId).value; //获得单元格的真实值
//判断导入的excel的单元格值是否为空,不为空时进行参数拼接
if(tempValue!=”"){
valueString=valueString+tempValue+”,”;//拼出11022321, 28420003, 28420005, 28420003,的形式
}
}
return valueString.substr(0,valueString.length-1);//去除最后一个逗号作为返回值
}
</script>

四.实现页面
1.初始页面
 
2.点击红色单元格弹出导入excel子页面
 

3.导入符合格式的excel效果如下
 

4.点击确定,返回查询条件给主查询页面并执行查询,得到结果列表。