2017-03-08 5 views
0

Ich habe eine ziemlich grundlegende Vorlage in .jrxml, die Kreuztabellenelement mit Header und eine Zelle enthält.dynamische Spaltenbreite mit Jaspis-Bericht

Ich verwende Kreuztabelle, weil ich dynamische Anzahl von Spalten habe. Ich gebe Datenquelle als Parameter von der Bohne, also kenne ich eine Anzahl von Spalten kurz vor Berichterstellung. Ich möchte Spalten mit "dynamischer" Breite.

Ich versuche, vorhandene jrxml zu lesen und dann die Spaltenbreite basierend auf der Anzahl der Spalten direkt vor der Berichterstellung zu reparieren.

Bis jetzt habe ich herausgefunden, wie man Datei lädt und und ich bekomme richtige Band (ich weiß, es ist immer Sekunde) und richtige Element (DynamicCrosstab). Ich kann nicht herausfinden, wie man die Spaltenbreite einstellt.

Mein aktueller Code:

JasperDesign template = JRXmlLoader.load("C:\\repos\\templateFile.jrxml"); 
JRBand[] bands = template.getAllBands(); 
//getting crosstab 
JRElement element = bands[1].getElementByKey("dynamicCrosstab"); 
if (element instanceof JRCrosstab) { 
    //missing code to get cells and set width 
} 
//compiling template before using it to generate report 
JasperCompileManager.compileReportToFile(template, "C:\\repos\\templateFile.jasper"); 

Tnx für jede Hilfe im Voraus.

+0

Sie können stattdessen [DynamicJasper] (http://dynamicjasper.com/) in Betracht ziehen. –

Antwort

0

es ist keine nette Lösung, aber es funktioniert.

if (element instanceof JRDesignCrosstab) { 
     //repair cells 
     List<JRCrosstabCell> celice = ((JRDesignCrosstab) element).getCellsList(); 
     //repair content in cells 
     ((JRDesignCrosstabCell) celice.get(0)).setWidth(newWidth); 
     for (JRChild child : ((JRDesignCrosstabCell) celice.get(0)).getContents().getChildren()) { 
      if(child instanceof JRDesignTextField){ 
       ((JRDesignTextField) child).setWidth(newWidth); 
      } 
     } 
     //repair content in header 
     List<JRCrosstabColumnGroup> headerji = ((JRDesignCrosstab) element).getColumnGroupsList(); 
     for (JRChild child : ((JRDesignCellContents) headerji.get(0).getHeader()).getChildren()) { 
      ((JRDesignTextField) child).setWidth(newWidth); 
     } 
    }