
Ultimamente mi è capitato di dover creare dei
report con
Java. Visto che mi è riuscito difficile trovare informazioni su Internet (le uniche cose che ho trovato erano in russo!), spero di fare cosa gradita raccontando come ho risolto il problema.
Ci tengo a precisare che questo è solo un articolo introduttivo: ci sarebbe tanto altro da dire sull'argomento.
Innanzitutto cosa si intende per
report in questo articolo: un
file RTF contenente alcuni dati raccolti a
runtime.
Mi sono servito di una libreria chiamata
VK Reports (cliccare nel link per andare nella pagina dove scaricarla) e creata da Vlad Karpov e rilasciata sotto licenza GPL.
Per svolgere il suo compito,
VK Reports parte da un
file RTF contenente un
modello, cioé un documento con del testo scritto fisso e con dei parametri (delimitati da due tilde). Importante: per creare l'
RTF non usate Word o Wordpad, perché inseriscono roba in più nell'
RTF che
VK Reports non è in grado di riconoscere (il risultato sarà che il
file finale sarà un foglio bianco).
Ecco un esempio di modello, tratto dal programma che sto sviluppando per la mia tesi di laurea (nota: i colori non sono necessari e sono inseriti qui solo per chiarezza grafica):
#BEGIN VKREPORT
#BEGIN SECTION REPORT HEADER
Codice del bambino: ~codiceBambino~
Test svolto il ~dataTest~
Presso la scuola ~scuolaTest~ - sezione ~sezioneTest~
Da ~somministratoreTest~
Parola - Tipo - Scritta correttamente?
#END SECTION REPORT HEADER
#BEGIN SECTION BODY
~parolaAttesa~ - ~parolaTipo~ - ~parolaCorretta~
#END SECTION BODY
#BEGIN SECTION REPORT FOOTER
Numero parole corrette: ~paroleCorrette~/~paroleTotali~
#END SECTION REPORT FOOTER
#END VKREPORT
Un
report viene creato analizzando un modello: durante l'analisi
vengono scatenati determinati eventi (ad esempio se viene trovato un parametro all'interno di un modello); tramite un'opportuna gestione degli eventi viene creato il
file RTF contenente il
report finale.
Di seguito il codice
Java per creare un
report:
private String fileIn, fileOut;
private TWordReport report = new TWordReport();
private ReportListener listener = new ReportListener();
report.setInputBlank(fileIn);
report.setOutputReport(fileOut);
report.addVKRepListener(listener);
report.execute();
Dove:
- fileIn è il nome del file RTF contenente il modello.
- fileOut è il nome del file RTF di destinazione.
- ReportListener è la classe contenente le funzioni che gestiscono gli eventi scatenati dall'analisi del modello.
Nelle funzioni che gestiscono gli eventi, bisogna spesso legare un parametro legato all'evento ad una stringa data dal programma. Sia
string la stringa da passare, ed
e l'evento scatenante, ecco il codice necessario:
System.arraycopy(string.getBytes("ISO-8859-15"),
0, e.outData, 0, string.length());
e.outDataLen = string.length();
Notare che si è scelto come tipo di
encoding l'
ISO-8859-15. Si può comunque scegliere ogni altro tipo di
encoding.
Le funzioni principali dell'ascoltatore di eventi sono:
- moveTop(VKRepEvent e): VK Reports richiede di spostarsi all'inizio della sorgente dati.
- moveNext(VKRepEvent e): VK Reports richiede di spostarsi alla prossima riga della sorgente dati.
- requestByName(VKRepEvent e): è stato richiesto un determinato parametro.
Ecco il risultato finale, partendo dal modello dato:
Test svolto il 6/12/2005
Presso la scuola Edmondo De Amicis di Rovereto - sezione A
Da Vincenzo Carnazzo
Parola - Tipo - Scritta correttamente?
gufo - Bisillaba - Si'
filo - Bisillaba - Si'
tela - Bisillaba - Si'
rete - Bisillaba - Si'
palco - Bisillaba - Si'
barca - Bisillaba - Si'
strega - Bisillaba - Si'
fronte - Bisillaba - Si'
minuto - Trisillaba - No
catino - Trisillaba - No
pedale - Trisillaba - No
valanga - Trisillaba - No
coperta - Trisillaba - No
trombone - Trisillaba - No
minestra - Trisillaba - No
Numero parole corrette: 8/16
Questo era solo un assaggio: lascio fare a voi di meglio

usando la
javadoc scritta da Karpov.
La foto è tratta da Wiki Commons.
Gli esempi sono tratti dal programma SeDiciParole.