mondrian 生成图表 XY轴数据过多

在使用Mondrian 生成图表时,因Mondrian 是将条数据都显示出来,有时数据过多,在图表底部显示坐标名称时会显得很拥挤。如下图所示

 

 

更改思路 :  当用户点击某一个维度时,点到那里就显示到那里。

 

修改源码  ,在官网下载 jpivot-1.8.0.zip 

找到 

com.tonbeller.jpivot.chart 包下的java 文件。在本地项目新建一样的包名,将java文件复制到项目中

 

新建工具类,对源码中返回过来的生成图表数据进行操作。 思路是。把字符分割,找到字符中含有全部、所有的(如果不是那说明展开了。)含有的越少就说明展开的越多,就显示,代码如下

 

 public static DefaultCategoryDataset getData(DefaultCategoryDataset dataset)
  {
    List list = new ArrayList();
    List listKeyValueList = new ArrayList();
    for (int i = 0; i < dataset.getColumnKeys().size(); i++) { //获取数据
      String[] row = dataset.getColumnKey(i).toString().split("→");
      int result = 0;
      ListKeyValue listKeyValue = new ListKeyValue();
      for (int k = 0; k < row.length; k++) {
        if ((row[k].indexOf("全部") != -1) || (row[k].indexOf("所有") != -1)) {//获取每条数据中含有 全部、所有的个数
          result++;
        }
      }
      list.add(i, Integer.valueOf(result));//含有全部、所有的个数
      listKeyValue.setKey(Integer.valueOf(i));//当前循环数
      listKeyValue.setValue(Integer.valueOf(result));//含有全部、所有的个数
      listKeyValue.setColumnKey(dataset.getColumnKey(i).toString());//显示值
      listKeyValueList.add(listKeyValue);
      //将信息保存在List集合中
    }
    Collections.sort(list);//排序
    List valueList = new ArrayList(); //将含有全部、所有比较少的放到集合中
    for (int i = 0; i < listKeyValueList.size(); i++) {
      if (((ListKeyValue)listKeyValueList.get(i)).getValue() == list.get(0)) {
        valueList.add(listKeyValueList.get(i));
      }
    }
    listKeyValueList.removeAll(valueList);
    for (int j = 0; j < dataset.getRowKeys().size(); j++) {
      for (int i = 0; i < listKeyValueList.size(); i++) {
        dataset.removeValue(dataset.getRowKey(j), ((ListKeyValue)listKeyValueList.get(i)).getColumnKey());
      }

    }

    List valueNum = new ArrayList();
    List keyValueList = new ArrayList();
    for (int i = 0; i < dataset.getColumnKeys().size(); i++) {
      String[] row = dataset.getColumnKey(i).toString().split("→");
      ListKeyValue listKeyValue = new ListKeyValue();
      valueNum.add(i, Integer.valueOf(row.length));
      listKeyValue.setKey(Integer.valueOf(i));
      listKeyValue.setValue(Integer.valueOf(row.length));
      listKeyValue.setColumnKey(dataset.getColumnKey(i).toString());
      keyValueList.add(listKeyValue);
    }
    Collections.sort(valueNum);
    List valueLists = new ArrayList();
    for (int i = 0; i < keyValueList.size(); i++) {
      if (((ListKeyValue)keyValueList.get(i)).getValue() == valueNum.get(valueNum.size() - 1))
        continue;
      valueLists.add(keyValueList.get(i));
    }

    keyValueList.removeAll(valueLists);
    for (int j = 0; j < dataset.getRowKeys().size(); j++) {
      for (int i = 0; i < valueLists.size(); i++) {
        dataset.removeValue(dataset.getRowKey(j), ((ListKeyValue)valueLists.get(i)).getColumnKey());
      }

    }

    return dataset;
  }

 

在ChartComponent.java   对百分比过滤掉,不需要生成图表。修改buildName 方法

 

 private String buildName(MemberTree myTree, Member[] members)
   {
     String retValue = new String();
     String newRetValue = new String();
     HashMap levelMap = new HashMap();
     HashMap hierarchyMap = new HashMap();
     for (int j = members.length - 1; j >= 0; j--) {
       Member member = members[j];
       while (member != null)
       {
         if (!levelMap.containsValue(member.getLevel())) {
           levelMap.put(member.getLevel().toString(), member.getLevel());
           if (member.getRootDistance() == 0){
             if ((!hierarchyMap.containsValue(member.getLevel().getHierarchy())) || (myTree.getRootMembers(member.getLevel().getHierarchy()).length > 1))
             {
               hierarchyMap.put(member.getLevel().getHierarchy().toString(), member.getLevel().getHierarchy());
               retValue = new StringBuilder().append(member.getLabel()).append("→").append(retValue).toString();
               newRetValue = retValue.substring(0, retValue.lastIndexOf("→"));
               if (newRetValue.indexOf("占比") != -1) continue; if (newRetValue.indexOf("率") != -1)
                 continue;
             }
           }else {
             hierarchyMap.put(member.getLevel().getHierarchy().toString(), member.getLevel().getHierarchy());
             retValue = new StringBuilder().append(member.getLabel()).append("→").append(retValue).toString();
             newRetValue = retValue.substring(0, retValue.lastIndexOf("→"));
             if ((newRetValue.indexOf("占比") != -1) || (newRetValue.indexOf("率") != -1)) {
               continue;
             }
           }
         }
         member = myTree.getParent(member);
       }
     }
     return newRetValue;
   }

 

 

  private DefaultCategoryDataset build2dimDataset()
   {
     DefaultCategoryDataset dataset = new DefaultCategoryDataset();

     List columnPositions = this.result.getAxes()[0].getPositions();
     int colCount = columnPositions.size();

     List rowPositions = this.result.getAxes()[1].getPositions();
     int rowCount = rowPositions.size();
     List cells = this.result.getCells();

     MemberTree myTree = (MemberTree)this.olapModel.getExtension("memberTree");

     for (int i = 0; i < colCount; i++) {
       Position p = (Position)columnPositions.get(i);
       Member[] colMembers = p.getMembers();

       String label = buildName(myTree, colMembers);
       if ((label.indexOf("占比") != -1) || (label.indexOf("率") != -1))
       {
         continue;
       }
       for (int k = 0; k < rowCount; k++) {
         Position rp = (Position)rowPositions.get(k);
         Member[] rowMembers = rp.getMembers();

         String key = buildName(myTree, rowMembers);

         Cell cell = (Cell)cells.get(k * colCount + i);
         dataset.addValue(getNumberValue(cell), label.toString(), key.toString());
       }
     }

     return dataset;
   }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值