给单元格自定义名称并实现自己的业务更新数据库表

在客户的填报系统中通常会有一些自己的业务,要求得到对应填报数据后先对数据做自己的处理然后在更新到数据库中,在润乾报表中能增加填报监听类,能在监听类中得到相关数据并做自己的业务处理,但是在填报监听类中只能通过行列循环形式得到相关数据,这样客户在写监听类时就必须每张报表定义一个类,随着报表量的增多,工作量也就随之加大,这样就要求能给单元格起个别名,然后在填报监听类中根据该别名直接获取到该单元格的值,这样即使报表格式变化也不用频繁变更程序,并且多张报表能共用一个程序,实现方法:

在填报监听类中有一个重要的对象report,该对象为填报提交后的报表对象,通过该对象能够得到单元格修改前以及修改后的值,同样,通过该对象也能得到单元格的其他属性,这样就能够通过该对象的相关属性给单元格做别名处理:

查看报表单元格属性,这里可以用到的属性为变量、注释、提示,这里直接使用注释属性即可。

设计报表时,将需要在监听类中得到的单元格的注释属性中写入相应的名称,例如:订单ID,订单名称等,这样将来就可以根据这个名称获得该单元格的值。

接下来就是监听类中的代码的写法:

for(int i=1;i<=rowNum;i++){

for(int j=1;j<=colNum;j++){

System.out.println(“注释====”+report.getCell(i, (short)j).getNotes());

System.out.println(“变量==”+report.getCell(i, (short)j).getVarName());

System.out.println(“提示==”+report.getCell(i, (short)j).getTip());

if(report.getCell(i,(short)j).getInputValue()!=null){

System.out.println(“单元格值==”+report.getCell(i,(short)j).getInputValue().toString());

}

}

循环遍历单元格,判断该单元格的注释属性是否是规定的,如果是则可根据该名称得到相应单元格的填报值,从而能在客户自己的业务系统中做相关处理。

将该java程序编译成class文件放到WEB-INF/classes下,在显示报表的jsp的标签中增加填报监听类设置:inputListener=”inputlis”

上边介绍了通过单元格的别名获得对应的值,这样对应产生一个问题: 能够根据名称给单元格赋值?因为有些单元格的值要经过比较复杂的业务处理才能生成,可以使用润乾的自定义函数,但是并不是非常通用,这样就要求根据单元格的别名在报表生成时给他设置相关的值。

实现思路和上述方法类似,还是根据单元格的注释属性给单元格设置别名,然后在报表的计算监听类中给其赋值即可:

在报表计算监听类中同样保留了一个报表对象report,通过该对象就能够对报表进行相关操作:

for(int i=1;i<=rowNum;i++){

for(int j=1;j<=colNum;j++){

//System.out.println(report.getCell(i, (short)j).getNotes().toString());

if(report.getCell(i, (short)j).getNotes()!=null){

if(report.getCell(i, (short)j).getNotes().toString().equals(“编号“)){

report.getCell(i, (short)j).setValue(12345);

}

if(report.getCell(i, (short)j).getNotes().toString().equals(“名称“)){

report.getCell(i, (short)j).setValue(“nametest”);

}

//System.out.println(“value===”+report.getCell(i, (short)j).getValue().toString());

}

然后在计算报表的tag标签中加入:calculateListener=”CalculateListener”

这样就达到了在填报时能根据别名获得单元格的值进行填报,在报表展现时根据别名给单元格赋值。