天天看点

mondrian 生成图表 XY轴数据过多

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

mondrian 生成图表 XY轴数据过多

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

mondrian 生成图表 XY轴数据过多

修改源码  ,在官网下载 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;

   }

继续阅读