venerdì 30 novembre 2012

Display tag decorator export e autosize colonne excel

Visualizzando una lista avevo 2 necessità:

  1. Decodificare dei valori in visualizzazione (es. a fronte di alcuni codici dare la relativa descrizione);
  2. Esportare questi valori in excel in modo da avere le colonne excel già adattate alla descrizione, senza doverlo fare a mano.
Per il punto 1 sono ricorso ad un decorator, solo che nell'export excel ancora avevo il campo codice invece della descrizione.
Infatti nella tabella bisogna specificare questo:

<display:setproperty name="decorator.media.excel" value="org.decorator.MyDecorator">



In modo da forzare ad utilizzare il decorator anche nell'export, quindi non basta definirlo soltanto a livello di tabella con l'attributo decorator.

Per quanto riguarda invece il punto 2 nel file displaytable.properties occorre dichiarare la seguente proprietà:



export.excel.class=org.displaytag.export.excel.ExcelHssfView

In questo modo tale modifica vale per tutte le tabelle dell'applicazione.
Per fare questa modifica premetto che occorre avere la versione 1.2 della libreria assieme al displaytag-export-poi-1.2.jar.
Nel mio caso poi, avendo l'applicazione la libreria POI-3.5 a Runtime avevo un errore di questo tipo:


java.lang.NoSuchMethodError: org.apache.poi.hssf.usermodel.HSSFRow.createCell(I)Lorg/apache/poi/hssf/usermodel

Evidentemente serviva una versione più recente della libreria ma essendo questa utilizzata in altri modi nell'applicazione ho deciso di ridefinirmi l'exporter nel file displaytag.properties facendolo puntare ad una mia classe.
Quindi ho decompilato la classe ExcelHssfView (che si trova dentro displaytag-export-poi-1.2.jar) e corretto manualmente gli errori trovati.
In particolare nel metodo doExport ho dovuto fare questa modifica:


                HSSFCellStyle headerStyle = wb.createCellStyle();
         headerStyle.setFillPattern((short)2);
         headerStyle.setFillBackgroundColor((short)54);
         HSSFFont bold = wb.createFont();
         bold.setBoldweight((short)700);
         bold.setColor((short)9);
         headerStyle.setFont(bold);

Inserendo il cast a short per i valori numerici.
Mentre invece nel costruttore della classe statica  ExcelGenerationException ho dovuto commentare il costruttore:


super(Messages.getString("ExcelView.errorexporting"), cause);

In quanto non definito nella libreria displaytag-1.2.jar (!?...) sostituendolo con

super(ExcelGenerationException.class,Messages.getString("ExcelView.errorexporting"));

Adesso tutto funziona come volevo.

Nessun commento:

Posta un commento