Aleš Tryml
představení informačního systému účel produktu použité programové prostředky výsledek zajímavé pasáže z implementace komunikace s MS Office tiskové sestavy
Účel produktu: software na zakázku zastřešení všech provozních dat CK tiskové sestavy vouchery, zasedací pořádky, pojištění, všemožné seznamy Výsledek: tlustý klient + možnost propojit s WWW jazyk Java databáze PosgreSQL
vytváření dokumentů čitelných v MS Office textové soubory bez stylů (Word), data oddělená středníkem (Excel) formáty XML se styly úprava již vytvořených dokumentů Apache POI POIFS - OLE 2 Compound Document format HWPF, HSSF, HSLF, HPSF, HDGF přímá komunikace s MS Office Java native interface (JNI)
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="
... EUROSKI.CZ, Resslova 3 Seznam pojištění pro zájezd č.: XX/ Číslo pojistné smlouvy Příjmení ...
nízko-úrovňové API zpřístupňuje data uložená v OLE 2 Compound Document format základ pro HWPF, HSSF,... možno srovnat s „zip“ knihovnou
Horrible (Word, Spreadsheet, …) Processor Format Java API pro zpracování MS Excel souborů Podpora Office Office 2007 není OLE2 formát Omezené možnosti použití
založení sešitu HSSFWorkbook wb = new HSSFWorkbook(); FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); založení nového listu HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet1 = wb.createSheet("new sheet"); HSSFSheet sheet2 = wb.createSheet("second sheet"); FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close();
JNI dovoluje využití knihoven napsaných v jiných jazycích nutno vytvořit wrapper pro obě strany poměrně zdlouhavý a těžkopádný zvážit, zda není jednodušší použít externí C# program, který bude Java přes parametry pouze spouštět
vyvolání tiskového dialogu a tisk na libovolnou tiskárnu java.awt.print (JDK 1.1) PrinterJob – zajišťuje samotný tisk Printable, Pageable – popisují obsah podpůrné třídy: PageFormat – popisuje tisknutelnou oblast Graphics, Graphics2D – zajišťuje vlastní vykreslování obsahu - stejné jako kreslení na obrazovku
try { // fetch a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); //ziskani printable VoucherPrintable voucherPrintable = new VoucherPrintable(parametry, data); job.setPrintable(voucherPrintable); // create an attribute set to store attributes from the print dialog PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet(); attr.add(new MediaPrintableArea(10, 7, 190, 283, MediaPrintableArea.MM)); // display a print dialog and record whether or not the user cancels it boolean printAccepted = job.printDialog(attr); if (printAccepted) { // if the user didn't cancel the dialog // do the printing (may need to handle PrinterException) job.print(attr); } } catch (PrinterException pe) { System.err.println("Error printing: " + pe.getMessage()); }
public int print(Graphics g, PageFormat pf, int page) throws PrinterException { if (page > 0) { /* We have only one page, and 'page' is zero-based */ return NO_SUCH_PAGE; } /* User (0,0) is typically outside the imageable area, so we must * translate by the X and Y values in the PageFormat to avoid clipping */ Graphics2D g2d = (Graphics2D)g; g2d.translate(pf.getImageableX(), pf.getImageableY()); /* Now we perform our rendering */ g.drawString("Hello world!", 100, 100); /* tell the caller that this page is part of the printed document */ return PAGE_EXISTS; }
int getNumberOfPages() PageFormat getPageFormat(int pageIndex) Printable getPrintable(int pageIndex)
klasický print všech Swingů problém stránkování rozřezání vs konkrétní implementace print Java 1.6 problém doplňujících údajů
děkuji za pozornost