Generovanie RTF dokumentov pomocou groovy.text.SimpleTemplateEngine
Niekoľko mesiacov dozadu sa v Java konferencii objavil príspevok vývojára, ktorý žiadal o radu pri implementácii funkcionality, ktorá by spĺňala nasledujúce podmienky:
- existuje používateľom editovateľná šablóna dokumentu do ktorej program behom generovania doplní vopred definované dátové položky
- v šablóne dokumentu je možné pre zobrazenie dát používať cykly a podmienky
- výsledný dokument má používateľ možnosť editovať a formátovať
V príspevku bolo uvedené, že túto funkcionalitu je možné vyriešiť použitím FlexDoc alebo JCopist. Z môjho pohľadu je pomerne elegantnou možnosťou ako splniť vyššie uvedené požiadavky použitie Rich Text Format v kombinácii s groovy.text.SimpleTemplateEngine.
Príprava šablóny
Pre prípravu šablóny postačí obyčajný editor, ktorý dokáže pracovať s RTF formátom. Ja som použil OpenOffice.org Writer. Prvým krokom je vytvorenie obsahu šablóny. Predpokladajme, že budeme dynamicky generovať objednávku DVD titulov.
Peter Hrach
Masarykova 45
058 01 Poprad
Objednávka DVD titulov
-------------------------
| Titul | Cena |
-------------------------
| Avatar | 12,99 |
| Borat | 6,97 |
-------------------------
Celkom 19,96€
Vaša objednávka presiahla 15€, boli ste zaradený do žrebovania o vecné ceny.
V Martine dňa 19.5.2010Druhým krokom je nahradenie obsahu šablóny dokumentu premennými, výrazmi, podmienkami a cyklami, ktoré budú dynamicky spracované.
$meno $priezvisko
$ulica
$psc $mesto
Objednávka DVD titulov
-------------------------
| Titul | Cena |
-------------------------
<% polozky.each { %>
| $it.titul | $it.cena |
<% } %>
-------------------------
Celkom ${polozky.collect {it.cena}.sum()}€
<% if (polozky.collect {it.cena}.sum() > 15) { %>
Vaša objednávka presiahla 15€, boli ste zaradený do žrebovania o vecné ceny.
<% } %>
V Martine dňa ${fd(datum)}V šablóne dokumentu sa nachádzajú premenné s prefixom $
$menovýrazy uzatvorené v ${}
${fd(datum)}podmienka presahujúca jeden riadok
<% if (polozky.collect {it.cena}.sum() > 15) { %>
Vaša objednávka presiahla 15€, boli ste zaradený do žrebovania o vecné ceny.
<% } %>a cyklus presahujúci jeden riadok
<% polozky.each { %>
| $it.titul | $it.cena |
<% } %>Naplnenie šablóny
Naplnenie šablóny dátami je jednoduché, pozostáva z týchto krokov:
- inicializácia dynamických dát použitých v šablóne
- načítanie šablóny a nahradenie špeciálnych znakov
- vygenerovanie dokumentu zo šablóny pomocou groovy.text.SimpleTemplateEngine
- uloženie vygenerovaného dokumentu
Vygenerovaný dokument je možné ľubovolne editovať alebo formátovať v textových editoroch kancelárskych balíkov Microsoft Office alebo OpenOffice.org. Zdrojový kód pre našu ukážkovú šablónu by mohol vyzerať nasledovne:
package sk.groovy.priklady
import groovy.text.SimpleTemplateEngine
private formatujDatum(datum) {
String.format("%td.%<tm.%<tY", datum)
}
// 1. inicializácia dát použitých v šablóne
def premenne = [:]
premenne.meno = 'Peter'
premenne.priezvisko = 'Hrach'
premenne.ulica = 'Masarykova 45'
premenne.psc = '058 01'
premenne.mesto = 'Poprad'
premenne.polozky = [[titul: 'Avatar', cena: 12.99], [titul: 'Borat', cena: 6.97]]
premenne.datum = new Date()
premenne.fd = this.&formatujDatum
// 2. načítanie šablóny a nahradenie špeciálnych znakov
def sablona = new File('Sablona.rtf').text.replace("\\{", "{").replace("\\}", "}").replace("\\", "\\\\")
// 3. vygenerovanie dokumentu zo šablóny pomocou groovy.text.SimpleTemplateEngine
def ste = new SimpleTemplateEngine()
def obsah = ste.createTemplate(sablona).make(premenne)
// 4. uloženie vygenerovaného dokumentu
def dokument = new File("Sablona${System.currentTimeMillis()}.rtf")
dokument.write(obsah.toString())Pre tých, ktorí by chceli s príkladom experimentovať je pripravený archívny súbor Eclipse projektu. Archívny súbor obsahuje zdrojový kód príkladu a šablónu.
Pridané 19.5.2010 o 18:19 Alešom Ondrúšom, späť na návody