DynamicJasper - 垂直排列柱状图

问题描述:

我想打印一个包含大量列(例如30)的表格。 DJ有可能垂直排列这些列而不是水平排列。DynamicJasper - 垂直排列柱状图

例子:

  1. 列1 - 第ROW1 - ROW2
  2. 列2 - 第ROW1 - ROW2
  3. 栏3 - 第ROW1 - ROW2
  4. Column4 - 第ROW1 - ROW2

我使用DynamicReportBuilder and ColumnBuilder t o用DJ创建一个报告。

AFIK在你的例子中没有垂直实现列的属性。

因为使用的是动态碧玉(Java)的最简单的方法是将转换数据源来表示新的数据结构

public static JRDataSource convertToVerticalDatasource(JRDataSource ds, List<String> columns) throws JRException{ 
    //This is are vertical rows 
    List<Map<String,?>> rows = new ArrayList<Map<String,?>>(); 

    //add the rows for each column 
    for (String column : columns) { 
     Map<String,Object> row = new HashMap<String,Object>(); 
     row.put("colName", column); 
     rows.add(row); 
    } 
    int curRow = 0; 
    //Loop our dataset and get rows, put them in to correct column 
    while(ds.next()){ 
     if (rows.size()<curRow){ 
      break; 
     } 
     Map<String,Object> rowMap= (Map<String, Object>) rows.get(curRow); 
     for (int i = 0; i < columns.size(); i++) { 
      JRDesignField field = new JRDesignField(); 

      field.setName(columns.get(i)); 
      Object value = ds.getFieldValue(field); 
      rowMap.put("row" + (i+1), value); 
     } 
     curRow++; 
    } 

    //Lets be nice (if someone need's to use it) 
    if (ds instanceof JRRewindableDataSource){ 
     ((JRRewindableDataSource) ds).moveFirst(); 
    } 
    JRMapCollectionDataSource dsv = new JRMapCollectionDataSource(rows); 
    return dsv; 
} 

该实施例提供是一般解决方案,其中列名将在列字段colName和列1中列row1 ecc

自然,由于您使用的是动态碧玉,您可能会在构建列时找到适合您解决方案的更高效的转换。

如果类似的解决方案需要与jrxml中的交叉表一起使用,那么转换后的数据源不应将row1,row2作为列名应具有仅包含行(与当前行的值)的列名,因此重复记录。