Hlavní navigace

Formátované dokumenty a tiskové sestavy v Javě (3)

14. 6. 2005
Doba čtení: 16 minut

Sdílet

V poslední části miniseriálu věnovaného vytváření formátovaných dokumentů a tiskových sestav pomocí aplikací napsaných v programovacím jazyce Java bude popsán systém POI, který je v současné době možné použít pro načítání, programovou změnu a uložení sešitů ve formátu aplikace Microsoft Excel. Kromě toho je ve vývojářské verzi možné načítat a ukládat soubory ve formátu Microsoft Wordu. Kromě popisu systému POI budou uvedeny i příklady demonstrující použití tohoto systému při vytváření excelovských tabulek.

Obsah

1. Projekt POI

2. Základní charakteristika projektu POI
3. Přednosti a zápory nasazení systému POI
4. Instalace systému POI
5. Testovací a demonstrační příklady
6. První demonstrační příklad – vytvoření jednoduché tabulky
7. Druhý demonstrační příklad – nastavení formátu buněk a sloučení buněk
8. Třetí demonstrační příklad – vytvoření souhrnu (skupiny či přehledu)
9. Čtvrtý demonstrační příklad – nastavení tiskových okrajů jednotlivých stran
10. Závěr

1. Projekt POI

Dnes bude stručně popsán projekt POI, který si do budoucna klade ambiciózní cíl: vytvoření poměrně obsáhlých javovských knihoven, pomocí nichž bude možné načítat, programově vytvářet i ukládat soubory ve formátech aplikací napsaných za pomoci knihovny MFC s OLE 2, především však formátů Microsoft Office, zejména textového procesoru Microsoft Word a tabulkového procesoru Microsoft Excel. V současné době je již téměř dokončena práce na čtecím a zápisovém datovém filtru pro formát Microsoft Excelu, podpora pro formát Microsoft Wordu je v současné době přítomna pouze v testovací verzi – prozatím je možné načítat pouze jednodušší wordovské dokumenty bez složitějšího formátování. Velkou předností tohoto projektu je, že načtené, popř. vytvářené dokumenty jsou v operační paměti při běhu aplikace reprezentovány jako javovské objekty, takže práce s nimi je velmi jednoduchá.

Důležitost práce s formáty DOC (Microsoft Word) a XLS (Microsoft Excel) spočívá v tom, že velká část uživatelů tyto aplikace používá a s velkou pravděpodobností bude používat nadále, zejména ve firemní sféře. Také je poměrně potěšující – i když méně známý – fakt, že formát těchto dokumentů (zejména formát Microsoft Wordu) se za posledních osm let nezměnil, zde je vidět snaha Microsoftu o určitou kontinuitu, protože v případě drastické změny formátu by tato firma mohla přijít o mnoho zákazníků. Prozatím nejvyšší verze aplikačního balíku Microsoft Office sice umožňuje i práci s formátem XML (dokonce podle uživatelem zadaných schémat, což může zcela změnit způsob práce na firemních intranetech), ale tato možnost je dostupná pouze v „profesionálních verzích”, základní verze stále pracují s binárními formáty DOC a XLS.

2. Základní charakteristika projektu POI

Jedním z předních cílů projektu POI je umožnění práce se souborovými formáty použitými v aplikacích Microsoft Office, zejména je patrné zaměření na Microsoft Word a Microsoft Excel. Přitom však není použito doporučované rozhraní OLE či OLE 2 Compound Document Format, protože toto rozhraní (které má v mnoha případech velmi smysluplné a jinými prostředky nenahraditelné použití) je dostupné pouze v operačních systémech Microsoft Windows a k tomu je závislé na instalaci Microsoft Office. Podpora souborových formátů je z tohoto hlediska jednodušší, protože dokument vytvořený v Microsoft Wordu či Microsoft Excelu může být zpracován či dokonce vytvořen na zcela jiné platformě. Jediné omezení takto pojatého (a zcela nezávislého) řešení spočívá v tom, že na této platformě musí být dostupné běhové prostředí jazyka Java (JRE) a několik přídavných javovských knihoven.

V současné době je v projektu POI podporován především souborový formát Microsoft Excelu, podpora pro Microsoft Word je prozatím pro praktické použití nedostatečná, snad až na čtení a případný zápis jednoduše formátovaných a řádně ostylovaných dokumentů. Základní myšlenkou, která je v projektu POI použita až do nejmenších detailů, je hierarchické členění dokumentu na jednotlivé prvky (uzly, listy) a větve, tato hierarchie obecně tvoří stromovou strukturu, která se poměrně snadno zpracovává. To znamená, že při importu dokumentu z některé aplikace balíku Microsoft Office se postupně vytvoří strom objektů (jedná se přitom o plnohodnotné javovské objekty s vlastními privátními i soukromými metodami a datovými složkami) a s tímto stromem se může dále pracovat, například do něj přidávat další prvky či celé větve.

Typickým příkladem reprezentace celého dokumentu pomocí stromové struktury může být například sešit používaný v Microsoft Excelu. Tento sešit (workbook) se skládá z jednotlivých tabulek či – přesněji řečeno – listů (sheet), tabulky/listy se skládají z řádků (row) a řádky již z jednotlivých buněk (cell). To však není vše, protože každé buňce může být přiřazeno jiné formátování číselných hodnot, odlišný font, barva textu, barva pozadí, orámování atd. Podobně jako u Microsoft Excelu je hierarchie podporována i v Microsoft Wordu, kde je základem hierarchické členění celého dokumentu na jednotlivé odstavce.

Celý projekt POI je naprogramován pomocí programovacího jazyka Java, a jak jsem se již zmínil v předchozích odstavcích, nejsou pro jeho vývoj použity žádné proprietární technologie ani licencované informace o zpracovávaných souborových formátech. Samotný projekt je šířen pod Apache licencí, text této licence je dodán spolu dokumentací. K dispozici jsou jak zdrojové kódy, tak i přeložená aplikace (překladem je zde míněna konverze ze zdrojových javovských kódů do bytekódu JVM).

Projekt POI je rozdělen do několika podprojektů, které na sobě závisí, a samy tak tvoří určitou hierarchickou strukturu. Mezi aktivně vyvíjené podprojekty patří:

  1. POIFS – Javovská implementace rozhraní OLE 2 Compound Document Format, jedná se o základ, na kterém jsou postaveny i další komponenty tohoto systému.
  2. HSSF – Javovská implementace filtru a serializátoru určeného pro čtení a zápis dokumentů ve formátu Microsoft Excelu.
  3. HWPF – Javovská implementace filtru a serializátoru určeného pro čtení a zápis dokumentů ve formátu Microsoft Wordu.
  4. HPSF – Javovská knihovna pro práci s metadaty souborů Microsoft Office. V metadatech jsou uloženy například informace o autorech dokumentu, datu poslední změny, klíčových slovech atd. Práce s těmito metadaty je možná jak přímo z aplikací Microsoft Office, tak i z operačního systému.

3. Přednosti a zápory nasazení systému POI

Před praktickým nasazením systému POI je samozřejmě nutné zvážit jeho přednosti i záporné vlastnosti. Nejprve si uveďme některé přednosti, které systém POI programátorům i samotným uživatelům této knihovny nabízí. Zejména je to možnost vytváření formátovaných a řádně ostylovaných dokumentů uložených ve formátech aplikací Microsoft Wordu a Microsoft Excelu, kterou lze uplatnit více způsoby:

  1. Jako samostatně běžící aplikaci, která na svém vstupu získá data a ta následně převede do některého z podporovaných souborových formátů.
  2. Jako interní součást jiné aplikace provádějící například export tabulek do Microsoft Excelu.
  3. Jako součást internetového či intranetového serveru, který soubory ve formátu Microsoft Wordu či Microsoft Excelu tvoří až jako výsledek požadavku klienta.

Zejména poslední možnost je v praxi velmi zajímavá, neboť pomocí POI lze například dynamicky vytvářet tiskové sestavy, číselníky, nabídkové listy či komplikované ceníky. Výhodné může být nasazení systému POI do interních informačních systémů větších podniků .

Mezi nevýhody tohoto systému lze počítat fakt, že formát Microsoft Wordu není v současné době v tomto projektu podporován tak intenzivně a dokonale jako formát Microsoft Excelu. Částečně je to pochopitelné, protože Microsoft Excel je, alespoň co se týče interní struktury a formátu dat, více rigidní než Microsoft Word, který má mnohem širší možnosti uspořádání textu, tabulek, poznámek, indexů, textových polí a dalších aktivních i pasivních elementů dokumentu. V současné době lze pomocí POI načítat, vytvářet a ukládat pouze jednoduché wordovské dokumenty, formát tabulek Microsoft Excelu je v tomto ohledu podporován mnohem větší měrou, a to včetně vektorové grafiky.

4. Instalace systému POI

Zdrojové soubory systému POI jsou, spolu s nezbytnou dokumentací a demonstračními příklady, dostupné na serveru projektu Apache Jakarta (URL jakarta.apache­.org) na adrese jakarta.apache­.org/poi/index­.html v sekci nazvané Download. Český server, který u nás provádí zrcadlení, má adresu mirror.styx.cz/a­pache/jakarta/po­i/. Na tomto serveru jsou dostupné zdrojové kódy, které jsou zabaleny v souborech poi-src-2.x.x-final-datum.tar.gz resp. poi-src-2.x.x-final-datum.zip. V reálných názvech souborů jsou místo znaků (x.x) uvedena čísla podverzí a datum je specifikováno ve známém osmiznakovém formátu rok-měsíc-den. V současné době (7. 6. 2005) je k dispozici stabilní verze 2.5.1 vytvořená dne 4. 8. 2004, vývoj tohoto systému však jde poměrně rychle kupředu, takže již brzy bude vytvořena další stabilní verze (verze testovací jsou z pochopitelných důvodů vytvářeny mnohem častěji).

Kromě zdrojových kódů samotného projektu POI je nutné použít i následující knihovny, u kterých uvádím i jejich umístění na Internetu:

  1. unit(3.8+) www.ibiblio.or­g/maven/junit/jar­s/
  2. xerces www.ibiblio.or­g/maven/xerces/jar­s/
  3. jdepend www.ibiblio.or­g/maven/jdepen­d/jars/
  4. xalan www.ibiblio.or­g/maven/xalan/jar­s/

Tyto knihovny musí být uloženy do adresáře, do kterého má JRE přístup, tento adresář tedy musí být zaznamenán pomocí systémové proměnné CLASSPATH. Posléze je již možné provést překlad, který využívá možností sestavovacího systému Ant (viz předchozí část tohoto seriálu). Základní překlad knihoven se provede příkazem:

ant compile 

dokumentace se vytvoří příkazem:

ant docs 

a otestování korektnosti vytváření souborů ve formátu Microsoft Wordu a Microsoft Excelu příkazem:

ant test 

Do původní podoby se celý adresář se zdrojovými kódy uvede po zadání příkazu:

ant clean 

5. Testovací a demonstrační příklady

Na několika následujících stranách budou uvedeny čtyři demonstrační příklady, které jsou kompletně vytvořeny v programovacím jazyku Java. Postupy použité v těchto příkladech ukazují, jakým způsobem je možné pomocí systému POI vytvářet i poměrně složité dokumenty ve formátu aplikace Microsoft Excel. Všechny demonstrační příklady byly otestovány na systému s nainstalovaným JDK verze 1.4.2, funkčnost by však měla být zajištěna i na starších či novějších verzích JDK či JRE (pro běh již přeložených aplikací samozřejmě nemusí být celé JDK přítomno, postačí „pouze” JRE).

6. První demonstrační příklad – vytvoření jednoduché tabulky

V tomto demonstračním příkladu si všimněte zejména způsobu vytvoření celé hierarchie sešit-list-řádek-buňky.

// První demonstrační příklad ukazující použití systému POI.
//
// Po překladu a spuštění tohoto příkladu se vytvoří sešit nazvaný
// "poi1.xls". V tomto sešitu bude vytvořen jeden list nazvaný
// "První list", ve kterém bude vyplněno tři sta buněk organizovaných
// do tabulky o velikosti 30x10 buněk.

import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.hssf.util.HSSFColor;


// jediná veřejná třída, po níž musí být pojmenován i zdrojový soubor
public class poii1 {
    final static String xlsName="poi1.xls";
    FileOutputStream    fout;
    HSSFWorkbook        workBook;
    HSSFSheet           sheet;
    HSSFRow             row;
    HSSFCell            cell;
    HSSFCellStyle       cellStyle;
    HSSFDataFormat      dataFormat;
    HSSFFont            font;

    // metoda, která se zavolá ihned po startu aplikace
    public static void main(String[] args) throws IOException
    {
        // hlášení pro uživatele
        System.out.println("zahajuji generování xls souboru "+xlsName);
        short rownum;

        // vytvoření souboru pro uložení sešitu
        FileOutputStream out = new FileOutputStream(xlsName);

        // vytvoření objektu s novým sešitem a listem
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet s = wb.createSheet();

        // objekty řádku tabulky a buňky na řádku
        HSSFRow r = null;
        HSSFCell c = null;

        // objekty se stylem buněk a formátem číselných hodnot
        HSSFCellStyle cs = wb.createCellStyle();
        HSSFDataFormat df = wb.createDataFormat();
        HSSFFont f = wb.createFont();

        // nastavení fontů použitých v buňkách
        f.setFontHeightInPoints((short) 10);
        f.setColor( (short)0xc );
        f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        // nastavení formátu číselných hodnot
        cs.setFont(f);
        cs.setDataFormat(df.getFormat("#,##0.0"));

        // nastavení jména jediného listu v sešitu
        wb.setSheetName(0, "První list");


        // vyplnění jednoho listu sešitu
        for (rownum = (short) 0; rownum < 30; rownum++) {
            r = s.createRow(rownum);

            // vyplnění jedné řádky
            for (short cellnum = (short) 0; cellnum < 10; cellnum ++) {
                // vytvoření buňky v daném řádku
                c = r.createCell(cellnum);
                // uložení číselné hodnoty do buňky
                c.setCellValue(rownum+100*cellnum);
                c.setCellStyle(cs);

                // nastavení šířky buňky
                s.setColumnWidth((short) (cellnum + 1),
                 (short) ((30 * 8) / ((double) 1 / 20)));
            }
        }

        // uložení sešitu do výstupního souboru
        wb.write(out);
        out.close();

        // hlášení pro uživatele
        System.out.println("ukončuji generování souboru "+xlsName);
    }
} 

7. Druhý demonstrační příklad – nastavení formátu buněk a sloučení buněk

V mnoha tiskových sestavách je nutné provádět sloučení buněk, což demonstruje následující příklad.

// Druhý demonstrační příklad ukazující použití systému POI.
//
// Po překladu a spuštění tohoto příkladu se vytvoří sešit nazvaný
// "poi2.xls". V tomto sešitu bude vytvořen jeden list nazvaný "První
// list", ve kterém bude vyplněno tři sta buněk organizovaných do
// tabulky 30x10 buněk.
// Pro každou buňku je nastaven font a formát zobrazených dat. Současně
// je provedeno sloučení vybraných buněk v sloupcích E-G a řádcích 5-7
// do takzvaného regionu (sloučené buňky)

import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.hssf.util.HSSFColor;

// jediná veřejná třída, po níž musí být pojmenován i zdrojový soubor
public class poii2 {
    final static String xlsName="poi2.xls";
    FileOutputStream    fout;
    HSSFWorkbook        workBook;
    HSSFSheet           sheet;
    HSSFRow             row;
    HSSFCell            cell;
    HSSFCellStyle       cellStyle;
    HSSFDataFormat      dataFormat;
    HSSFFont            font;

    // metoda, která se zavolá po startu aplikace
    public static void main(String[] args) throws IOException
    {
        // hlášení pro uživatele
        System.out.println("zahajuji generování xls souboru "+xlsName);
        short rownum;

        // vytvoření souboru pro uložení sešitu
        FileOutputStream out = new FileOutputStream(xlsName);

        // vytvoření objektu s novým sešitem a listem
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet s = wb.createSheet();

        // objekty řádku tabulky a buňky na řádku
        HSSFRow r = null;
        HSSFCell c = null;

        // objekty se stylem buněk a formátem číselných hodnot
        HSSFCellStyle cs = wb.createCellStyle();
        HSSFDataFormat df = wb.createDataFormat();
        HSSFFont f = wb.createFont();

        // nastavení fontů použitých v buňkách
        f.setFontHeightInPoints((short) 10);
        f.setColor( (short)0xc );
        f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        // nastavení formátu číselných hodnot
        cs.setFont(f);
        cs.setDataFormat(df.getFormat("#,##0.0"));

        // nastavení jména jediného listu v sešitu
        wb.setSheetName(0, "První list");

        // vyplnění jednoho listu sešitu
        for (rownum = (short) 0; rownum < 30; rownum++) {
            r = s.createRow(rownum);

            // vyplnění buněk na řádku
            for (short cellnum = (short) 0; cellnum < 10; cellnum ++) {
                // vytvoření buňky v daném řádku
                c = r.createCell(cellnum);
                // uložení číselné hodnoty do buňky
                c.setCellValue(rownum+100*cellnum);
                c.setCellStyle(cs);
                // nastavení šířky buňky
                s.setColumnWidth((short) (cellnum + 1),
                (short) ((30 * 8) / ((double) 1 / 20)));
            }
        }

        rownum++;
        rownum++;

        // sloučení několika buněk do oblasti
        Region region=new Region(4, (short)4, 6, (short)6);
        s.addMergedRegion(region);

        // uložení sešitu do výstupního souboru
        wb.write(out);
        out.close();

        // hlášení pro uživatele
        System.out.println("ukončuji generování souboru "+xlsName);
    }
} 

8. Třetí demonstrační příklad – vytvoření souhrnu (skupiny či přehledu)

V rozsáhlých tabulkách se často vytvářejí automatické či manuálně specifikované přehledy. V tomto příkladu je ukázáno, jakým způsobem se přehledy zapíšou přímo do datového souboru se sešitem.

// Třetí demonstrační příklad ukazující použití systému POI.
//
// Po překladu a spuštění tohoto příkladu se vytvoří sešit nazvaný
// "poi3.xls". V tomto sešitu bude vytvořen jeden list nazvaný "První
// list", ve kterém bude vyplněno tři sta buněk organizovaných do tabulky
// o velikosti 30x10 buněk.
// Pro každou buňku je nastaven font a formát zobrazených dat. Současně je
// provedeno sloučení vybraných buněk v sloupcích E-G a řádcích 5-7 do
// takzvaného regionu (sloučené buňky) a vytvoření souhrnu (skupiny či
// přehledu) několika sloupců a řádků v tabulce.

import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.hssf.util.HSSFColor;

// jediná veřejná třída, po níž musí být pojmenován i zdrojový soubor
public class poii3 {
    final static String xlsName="poi3.xls";
    FileOutputStream    fout;
    HSSFWorkbook        workBook;
    HSSFSheet           sheet;
    HSSFRow             row;
    HSSFCell            cell;
    HSSFCellStyle       cellStyle;
    HSSFDataFormat      dataFormat;
    HSSFFont            font;

    // metoda, která se zavolá ihned po startu aplikace
    public static void main(String[] args) throws IOException
    {
        // hlášení pro uživatele
        System.out.println("zahajuji generování xls souboru "+xlsName);
        short rownum;

        // vytvoření souboru pro uložení sešitu
        FileOutputStream out = new FileOutputStream(xlsName);

        // vytvoření objektu s novým sešitem a listem
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet s = wb.createSheet();

        // objekty řádku tabulky a buňky na řádku
        HSSFRow r = null;
        HSSFCell c = null;

        // objekty se stylem buněk a formátem číselných hodnot
        HSSFCellStyle cs = wb.createCellStyle();
        HSSFDataFormat df = wb.createDataFormat();
        HSSFFont f = wb.createFont();

        // nastavení fontů použitých v buňkách
        f.setFontHeightInPoints((short) 10);
        f.setColor( (short)0xc );
        f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        // nastavení formátu číselných hodnot
        cs.setFont(f);
        cs.setDataFormat(df.getFormat("#,##0.0"));

        // nastavení jména jediného listu v sešitu
        wb.setSheetName(0, "První list");

        // vyplnění jednoho listu sešitu
        for (rownum = (short) 0; rownum < 30; rownum++) {
            r = s.createRow(rownum);

            // vyplnění buněk na řádku
            for (short cellnum = (short) 0; cellnum < 10; cellnum ++) {
                // vytvoření buňky v daném řádku
                c = r.createCell(cellnum);
                // uložení číselné hodnoty do buňky
                c.setCellValue(rownum+100*cellnum);
                c.setCellStyle(cs);
                // nastavení šířky buňky
                s.setColumnWidth((short) (cellnum + 1),
                (short) ((30 * 8) / ((double) 1 / 20)));
            }
        }

        rownum++;
        rownum++;

        // sloučení několika buněk do oblasti
        Region region=new Region(4, (short)4, 6, (short)6);
        s.addMergedRegion(region);

        // vytvoření souhrnu přes řádky tabulky
        // (skupina či též přehled)
        s.groupRow( 5, 14 );
        s.groupRow( 7, 14 );
        s.groupRow( 16, 19 );

        // vytvoření souhrnu přes sloupce tabulky
        // (skupina či též přehled)
        s.groupColumn( (short)4, (short)7 );
        s.groupColumn( (short)9, (short)12 );
        s.groupColumn( (short)10, (short)11 );

        // uložení sešitu do výstupního souboru
        wb.write(out);
        out.close();

        // hlášení pro uživatele
        System.out.println("ukončuji generování souboru "+xlsName);
    }
} 

9. Čtvrtý demonstrační příklad – nastavení tiskových okrajů jednotlivých stran

Častým požadavkem, zejména při tvorbě tiskových sestav, je zabezpečení správného zlomu stránky. V následujícím příkladu je ukázáno, jakým způsobem se dají v každém listu specifikovat tiskové okraje.

CS24_early

// Čtvrtý demonstrační příklad ukazující použití systému POI.
// Po překladu a spuštění tohoto příkladu se vytvoří sešit nazvaný
// "poi4.xls". V tomto sešitu bude vytvořen jeden list nazvaný "První
// list", ve kterém bude vyplněno tři sta buněk organizovaných do
// tabulky 30x10 buněk. Pro každou buňku je nastaven font a formát
// zobrazených dat. Současně je provedeno sloučení vybraných buněk ve
// sloupcích E-G a řádcích 5-7 do takzvaného regionu (sloučené buňky) a
// vytvoření souhrnu (skupiny či přehledu) několika sloupců a řádků v
// tabulce. Oproti předchozímu příkladu jsou přidány objekty, pomocí
// nichž se nastavují tiskové okraje jednotlivých stran.

import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.hssf.util.HSSFColor;

// jediná veřejná třída, po níž musí být pojmenován i zdrojový soubor
public class poii4 {
    final static String xlsName="poi4.xls";
    FileOutputStream    fout;
    HSSFWorkbook        workBook;
    HSSFSheet           sheet;
    HSSFRow             row;
    HSSFCell            cell;
    HSSFCellStyle       cellStyle;
    HSSFDataFormat      dataFormat;
    HSSFFont            font;

    // metoda, která se zavolá ihned po startu aplikace
    public static void main(String[] args) throws IOException
    {
        // hlášení pro uživatele
        System.out.println("zahajuji generování xls souboru "+xlsName);
        short rownum;

        // vytvoření souboru pro uložení sešitu
        FileOutputStream out = new FileOutputStream(xlsName);

        // vytvoření objektu s novým sešitem a listem
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet s = wb.createSheet();

        // objekty řádku tabulky a buňky na řádku
        HSSFRow r = null;
        HSSFCell c = null;

        // objekty se stylem buněk a formátem číselných hodnot
        HSSFCellStyle cs = wb.createCellStyle();
        HSSFDataFormat df = wb.createDataFormat();
        HSSFFont f = wb.createFont();

        // nastavení fontů použitých v buňkách
        f.setFontHeightInPoints((short) 10);
        f.setColor( (short)0xc );
        f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        // nastavení formátu číselných hodnot
        cs.setFont(f);
        cs.setDataFormat(df.getFormat("#,##0.0"));

        // nastavení jména jediného listu v sešitu
        wb.setSheetName(0, "První list");

        // vyplnění jednoho listu sešitu
        for (rownum = (short) 0; rownum < 30; rownum++) {
            r = s.createRow(rownum);

            // vyplnění buněk na řádku
            for (short cellnum = (short) 0; cellnum < 10; cellnum ++) {
                // vytvoření buňky v daném řádku
                c = r.createCell(cellnum);
                // uložení číselné hodnoty do buňky
                c.setCellValue(rownum+100*cellnum);
                c.setCellStyle(cs);
                // nastavení šířky buňky
                s.setColumnWidth((short) (cellnum + 1),
                (short) ((30 * 8) / ((double) 1 / 20)));
            }
        }

        rownum++;
        rownum++;

        // sloučení několika buněk do oblasti
        Region region=new Region(4, (short)4, 6, (short)6);
        s.addMergedRegion(region);

        // vytvoření souhrnu přes řádky tabulky
        // (skupina či též přehled)
        s.groupRow( 5, 14 );
        s.groupRow( 7, 14 );
        s.groupRow( 16, 19 );

        // vytvoření souhrnu přes sloupce tabulky
        // (skupina či též přehled)
        s.groupColumn( (short)4, (short)7 );
        s.groupColumn( (short)9, (short)12 );
        s.groupColumn( (short)10, (short)11 );

        // nastavení stránkových okrajů pro tisk či prohlížení
        s.setRowBreak(5);
        s.setRowBreak(15);
        s.setColumnBreak((short)2);
        s.setColumnBreak((short)3);

        r = s.createRow(rownum);

        // vyplnění buněk na konci stránky
        for (short cellnum = (short) 0; cellnum < 50; cellnum++) {
            // vytvoření prázdných buněk
            c = r.createCell(cellnum);
            // nastavení černého okraje buněk
            c.setCellStyle(cs);
            c.setCellValue("okraj");
        }

        // uložení sešitu do výstupního souboru
        wb.write(out);
        out.close();

        // hlášení pro uživatele
        System.out.println("ukončuji generování souboru "+xlsName);
    }
} 

10. Závěr

V této sérii článků jsme si ukázali možnost tvorby tiskových sestav i jiných typů dokumentů pomocí dvou systémů: FOP a POI. První systém byl zaměřen především na tvorbu dokumentů v „tiskovém” formátu PDF, druhý systém na manipulaci se sešity Microsoft Excelu. Každý z těchto systémů má své klady a zápory, které je nutné zvážit při jejich praktické aplikaci.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.