交叉表表样:
图1.交叉表表样(图片太长,后面有个升级率没出来)
简单介绍一下模型:
背景:
这是一张某银行数据中心私人银行项目的一张报表,该行有自己的半成熟性的“产品”,就是所有报表通过一个通用存储过程建模。(优点是表与表的逻辑在数据库处理好了,最后生成的结果表就是报表所需要的所有数据,可以简化cognos建模的工作。缺点一大堆,还不肯改!)
报表难点:
在不能动模型的情况下,对于【稳定率】、【升级率】、【降级率】的汇总,也就是最后一行的数据不好计算。
图暂时去掉!
稳定率=交叉表中所有天蓝色表格的值的总计/合计(上图红色的数值)*100/%
升级率=交叉表中所有粉红色表格的值的总计/合计(上图红色的数值)*100/%
降级率=交叉表中所有浅绿色表格的值的总计/合计(上图红色的数值)*100/%
在能自由建立模型的情况下,我们可以通过增加纬度或者提前计算好汇总值的方法正确填入数值。但是目前不能,这使我相当烦恼!
后面在群里一位大神【白帝舞剑行】提供的灵感下,我使用js成功定位到各个颜色部分进行汇总。下面我分享一下代码和方法。
1.在交叉表外包用一个span标签将交叉表对象包裹住。给一个唯一的ID
2.在每个什么什么率的单元格选中,然后自定义内容改为是,然后解锁。拖两个HTML项目过去,中间夹一个空的文本对象。两个HTML也是使用span对象将文本对象给包裹住。给一个唯一的ID。
3.然后在包裹住div的结束HTML标签后,再加一个html,用来写JS代码。
Js内容如下:
<script type="text/script">
var targetTable = document.getElementById("a2");//得到包裹交叉表的span对象。
targetTable.firstChild.id="rsTable";//得到span对象下面的第一个对象,就是交叉表对象,然后给交叉表对象赋一个ID。
targetTable.firstChild.name="rsTable";//给交叉表对象赋一个name。可以不写!
var tableObj1 = document.getElementById("rsTable");
//通过ID获取交叉表对象。
var countcolor=0;//给绿色部分汇总降级率一个初始值
var heji=0;//给合计汇总一个初始值
var tianlan=0;//给蓝色部分汇总稳定率一个初始值
var fenhong=0;//给粉红色部分汇总升级率一个初始值
var gaoduanlv=0;//给高端汇总率一个初始值
//遍历单元格,将各颜色单元格的值进行汇总
for(var i=0;i<tableObj1.rows.length;i++)//遍历行
{
for(var j=0;j<tableObj1.rows[i].cells.length;j++)//遍历列
{
if(tableObj1.rows[i].cells[j].style.backgroundColor=="#99cc66")//绿色部分,当然这个颜色代码是由我控制的,在每一列显示什么颜色是由条件样式控制的。
{
countcolor+=parseInt(tableObj1.rows[i].cells[j].innerText);//累积汇总绿色部分的值。
}
else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#c0c0c0"){
heji=parseInt(tableObj1.rows[i].cells[j].innerText);
//合计部分,只有一个单元格。所以不用+=。颜色也是定死的。
}
else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#99ffff")//稳定率部分
{
tianlan+=parseInt(tableObj1.rows[i].cells[j].innerText); //累积汇总天蓝色部分的值
}
else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#ffccff")
{
fenhong+=parseInt(tableObj1.rows[i].cells[j].innerText); //累积汇总粉红色部分的值
}
else if(tableObj1.rows[i].cells[j].style.backgroundColor=="#cccccc")//高端率汇总
{
gaoduanlv+=parseInt(tableObj1.rows[i].cells[j].innerText);//高端率汇总
}
}
}
//刚刚上面的循环会计算好各个颜色部分的汇总值,
这一步是汇总行里的包裹住的文本项目赋值。也就是我们要将计算好的总值填到对应的单元格。
var gaoduan1=document.getElementById("gaoduanlv");//高端率汇总行里的span对象
gaoduan1.firstChild.id="gaoduanwenben";//给span包裹住的文本项目指定ID
gaoduan1.firstChild.name="gaoduanwenben";
var gaoduanwenben=document.getElementById("gaoduanwenben");//得到该文本对象
gaoduanlv=(gaoduanlv/heji*100).toFixed(2);//计算好百分比
gaoduanwenben.innerText=gaoduanlv+"%";//给文本对象赋值
//同上
var wending1=document.getElementById("wending");
wending1.firstChild.id="wendingwenben";
wending1.firstChild.name="wendingwenben";
var wendingwenben=document.getElementById("wendingwenben");
tianlan=(tianlan/heji*100).toFixed(2);
wendingwenben.innerText=tianlan+"%";
var shengji1=document.getElementById("shengji");
shengji1.firstChild.id="shengjiwenben";
shengji1.firstChild.name="shengjiwenben";
var shengjiwenben=document.getElementById("shengjiwenben");
fenhong=(fenhong/heji*100).toFixed(2);
shengjiwenben.innerText=fenhong+"%";
var jiangji1=document.getElementById("jiangji");
jiangji1.firstChild.id="jiangjiwenben";
jiangji1.firstChild.name="jiangjiwenben";
var jiangjiwenben=document.getElementById("jiangjiwenben");
countcolor=(countcolor/heji*100).toFixed(2);
jiangjiwenben.innerText=countcolor+"%";
</script>
这段JS主要的用法是利用div或者说span对象,得到交叉表对象。然后通过js给交叉表动态赋值。可以精确到任何一个单元格。