Kromě toho, že programuji v Javě pro náš MoroSystems, pracuji také jako externí programátor v PHP npro Grafické studio Vlado. Minulý týden jsem dostal úkol předělat data z plain textu do nějakého uživatelštějšího formátu. Měl jsem na výběr z několika možností jako jsou HTML, CSV, Excel, mbd apod. Jelikož to byla jednorázová off-line akce, řekl jsem si, proč to neudělat v Javě a nenaučit se tak něco nového.

Vybral jsem si tedy Excel a našel knihovnu jExcelApi. Nevěděl jsem kolik to zabere času (čas jsou peníze), ale vůle naučit se něco jiného, nového, byla silnější.

Nakonec se stejně ukázalo, že to bylo stejně rychlé nebo snad i rychlější než naprogramovat podobnou fci v PHP. Nehledě na to, že v PHP se export do Excelu vůbec nedá uskutečnit.

Manipulace s Excel soubory pomocí jExcelApi je velmi jednoduchá. Pokud chceme data z Excelu číst, stačí nám následující konstrukce. Příklad není kompletní, chybí zachytávání výjimek.

Kromě toho, že programuji v Javě pro náš MoroSystems, pracuji také jako externí programátor v PHP npro Grafické studio Vlado. Minulý týden jsem dostal úkol předělat data z plain textu do nějakého uživatelštějšího formátu. Měl jsem na výběr z několika možností jako jsou HTML, CSV, Excel, mbd apod. Jelikož to byla jednorázová off-line akce, řekl jsem si, proč to neudělat v Javě a nenaučit se tak něco nového.Vybral jsem si tedy Excel a našel knihovnu jExcelApi. Nevěděl jsem kolik to zabere času (čas jsou peníze), ale vůle naučit se něco jiného, nového, byla silnější.

Nakonec se stejně ukázalo, že to bylo stejně rychlé nebo snad i rychlější než naprogramovat podobnou fci v PHP. Nehledě na to, že v PHP se export do Excelu vůbec nedá uskutečnit.


 import java.io.File;
 import java.util.Date;
 import jxl.*;

 //zpristupnime excelovsky soubor, tzv. workbook
 Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));

 //budeme pracovat s jeho prvnim listem
 Sheet sheet = workbook.getSheet(0);

 /* Zpristupneni jednotlivych bunek daneho listu, kde sloupec A a prvni radek
  * je indexován jako (0, 0), druhy radek sloupce A jako (0, 1) apod.
  */

 Cell a1 = sheet.getCell(0,0);
 Cell b2 = sheet.getCell(1,1);
 Cell c2 = sheet.getCell(2,1); 

 //pro ziskani textoveho retezce z bunky pouzijeme fci
 String text = a1.getContents();

 /* Jelikoz je vsak pri ziskavani obsahu bunek velmi dulezite pouzivat
  * spravne funkce na zaklade typu obsahu, jExcelApi disponuje nasledujicim aparatem.
  */

 int numberb2 = 0;
 Date datec2 = null;
 if (b2.getType() == CellType.NUMBER) {
   NumberCell nc = (NumberCell) b2;
   numberb2 = nc.getValue();
 }

 if (c2.getType() == CellType.DATE) {
   DateCell dc = (DateCell) c2;
   datec2 = dc.getDate();
 }
 //pokud chceme ukoncit praci s workbookem, jednoduse jej uzavreme
 workbook.close();


Jednoduché ne? Podobně se postupuje i se zápisem excelovských sešitù.



 import java.io.File;
 import java.util.Date;
 import jxl.*;
 import jxl.write.*; 

 //zpristupnime Excelovsky soubor, tzv. workbook
 Workbook workbook = Workbook.getWorkbook(new File("output.xls"));

 //vytvorime prvni list a pojmenujeme si ho jako "The First Sheet"
 WritableSheet sheet = workbook.createSheet("The First Sheet", 0);

 /* Vytvorime jednotlive bunky se spravnym typem a pozici. Opet se bunky zacinaji
  * indexovat od pozice (0, 0), tedy od sloupce A a prvniho radku.
  */
 //textova bunka
 Label label = new Label(0, 0, "Header");
 sheet.addCell(label);

 //ciselna bunka
 Number number = new Number(0, 1, 3.1459);
 sheet.addCell(number); 

 //pridame listy do workbooku a ukoncime praci
 workbook.write();
 workbook.close();


V předcházejícím textu jsem vám ukázal základní práci s excelovskými dokumenty pomocí jExcelApi. To ale není vše, co jExcelApi umí. Další funkce:

  • čte data z Excelů verzí 95, 97, 2000,
  • čte a zapisuje formule Excelù verzí 97 a pozdšjších,
  • vytváří listy formátu Excel verze 2000,
  • podporuje formátování fontů, čísel a dat,
  • podporuje stínování a obarvování buněk,
  • dokáže modifikovat stávající Excelovské dokumenty,
  • podoruje práci s obrázky,
  • dokáže zkopírovat makra bez poškození, nedokáže je však vytvořit.

Dokumentace k tomuto výbornému API, odkud jsem čerpal oba příklady zachycené v mém článku, není sice nejrozsáhlejší, ale je výstižná a pro běžnou práci s excelovskými dokumenty postačující.

Na závěr by bylo dobré poznamenat, že existuje i další API pro přístup k dokumentům vytvářených pomocí sady MS Office, které se jmenuje Jakarta POI. Zatím dokáže manipulovat pouze s dokumenty typu MS Excel, ale připravuje se podpora i pro další formáty.

Jen pro zajímavost, i framework Spring má v sobě podporu pro export dokumentů do Excelu, při kterém využívá právě knihovnu Jakarta POI.

To je pro dnešek vše. Téma manipulace se soubory formátů dokumentù MS Office je však natolik zajímavé, že se k němu možná ještě vrátíme.