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.2010

Druhý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 $

$meno

vý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:

  1. inicializácia dynamických dát použitých v šablóne
  2. načítanie šablóny a nahradenie špeciálnych znakov
  3. vygenerovanie dokumentu zo šablóny pomocou groovy.text.SimpleTemplateEngine
  4. 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

Design: spyka webmaster. Valid XHTML and CSS © 2009 - 2012 groovy.sk