2016-01-13 40 views
0

我想打印一個包含大量列(例如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創建一個報告。

回答

1

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作爲列名應具有僅包含行(與當前行的值)的列名,因此重複記錄。