在使用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;
}