Komplexe pe e Excel Berichte mit APEX und jxls erstellen Dietmar Aust Opal-Consulting, Köln www.opal-consulting.de
Agenda Excel Exporte mit APEX Die Möglichkeiten Das Open Source Projekt jxls Excel Templates zur Generierung verwenden Basiert auf Apache POI Die Integration mit APEX Wie wurde sie realisiert
Opal Consulting Dipl.-Inform. Dietmar Aust, Freelance Consultant 1997-2000: Consultant bei der Oracle Deutschland GmbH / Düsseldorf Schwerpunkte: Oracle Portal, Oracle Reports, Oracle Forms, PL/SQL, PLSQL Web Toolkit (OWA) Seit 09/2000: Freiberuflich Schwerpunkte: Oracle Portal, Oracle Reports, Oracle Application Express, Oracle Express Edition Seit Nov. 2005 ausschließlich APEX Entwicklung Mittlerweile 12 Jahre Erfahrung in der Erstellung von Webapplikationen, regelmäßig auf DOAG, ODTUG, OOW http://daust.blogspot.com/
Warum Excel-Exporte? Wozu benötigen wir die Daten im MS Excel Format? Ganz unterschiedliche Anwendungsfälle Mögliche Anforderungen Nur die Daten, ein einfacher Export der Daten reicht (Weiterverarbeitung in Excel oder Powerpoint) Einfache Formatierungen der Daten Daten auf multiplen l Datenblättern Kompatibilität mit älteren MS Excel Versionen notwendig Kundenanforderungen genau ermitteln, wenn möglich verhandeln! Nicht zu schnell die komplizierte Lösung umsetzen! Use Case des Vortrages: Speziell formatierte Excel Dateien erstellen (fachlich abgestimmt, enthält eventuell Makros) Geschäftsprozesse basieren darauf (Formularwesen) Schnittstellensysteme verarbeiten diese automatisiert weiter
Beispiele
Beispiele
Beispiele
Excel-Exporte mit APEX HTP.P P Ansätze APEX CSV-Export Excel Exporte mit APEX jxls Integration (Java Integration) BI-Publisher
APEX CSV-Export Standfunktionalität t a tät von APEX Einfach zu verwenden Einfach auf einer Region aktivieren fertig! Einschränkungen Nur die Daten keine Formatierungen, keine Logos, keine Makros, Autofilter, etc. Nur eine Abfrage pro Export möglich Excel versucht, intelligent zu sein => problematisch! Die Datentypen werden automatisch erkannt, leider nicht immer korrekt Führende Nullen werden abgeschnitten
BI-Publisher Elegante Lösung Sehr mächtig Gute Architektur, guter Ansatz Kostspielig Manchmal durchaus zu empfehlen, immer die aktuelle Situation beim Kunden für die Empfehlung beachten APEX Integration (Standard) Berichtsvorlage mit MS Word erstellen, kein echtes Excel Alternative: Excel Templates Plugin für MS Excel MS Excel Vorlagen => Diese Integration ist nicht im Standardumfang und muss selbst entwickelt werden
HTP.P Ansätze Wie funktioniert es? Mittels einer Stored Procedure wird der Export manuell programmiert (htp.p) Bsp. :http://spendolini.blogspot.com/2006/04/custom com/2006/04/custom-export- to-csv.html Alternativen CSV generieren (reiner Datenexport) HTML generieren (Daten + Formatierungen) HTML mit htp.p ausgeben, MIME-Typ auf MS Excel setzen (application/vnd.ms-excel) HTML Formatierungen werden konvertiert von MS Excel MS Office 2003 XML generieren Volle Formatierungsmöglichkeiten, multiple Datenblätter, etc. Excel Daten im XML Format speichern, dann dynamisieren
HTP.P Ansätze MS Excel 2003 Template <?xml version="1.0"?> <?mso-application progid="excel.sheet Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office xmlns:html="http://www.w3.org/tr/rec-html40"> <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> microsoft com:office:office <Author>Dietmar Aust</Author> <Created>2009-11-17T07:43:54Z</Created> </DocumentProperties> <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> microsoft com:office:excel </ExcelWorkbook> <Worksheet ss:name="tabelle1"> <Table ss:expandedcolumncount="1" ss:expandedrowcount="2" x:fullcolumns="1" x:fullrows="1" ss:defaultcolumnwidth="60" ss:defaultrowheight="15"> <Row> <Cell><Data ss:type="number">10</data></cell> </Row> <Row> <Cell><Data ss:type="number">20</data></cell> </Row> </Workbook>
HTP.P Ansätze Bsp. CSV Export BEGIN -- Set the MIME type OWA_UTIL.mime_header ('application/vnd.ms-excel', FALSE); -- Set the name of the file HTP.p ('Content-Disposition: attachment; filename="emp.csv"'); -- Close the HTTP Header OWA_UTIL.http_header_close; -- Loop through all rows in EMP FOR x IN (SELECT e.ename, e.empno, d.dname FROM emp e, dept d WHERE e.deptno = d.deptno AND e.deptno LIKE :p1_deptno) LOOP -- Print out a portion of a row, -- separated by commas and ended by a CR HTP.prn (x.ename ',' x.empno ',' x.dname CHR (13)); END LOOP; -- Send an error code so that the -- rest of the HTML does not render APEX_APPLICATION.g_unrecoverable_error := TRUE; END;
HTP.P Ansätze Vorteile Mehrfache Abfragen Abfragen nebeneinander Mutiple Datenblätter Nachteile Keine Trennung zwischen Layout und Daten! Schwierig zu warten, wenn es komplexer wird Mind. MS Excel 2003 für den XML Ansatz notwendig Ja, MS Excel 2000 wird immer noch verwendet
jxls Das Framework Was ist es? Kleine und leicht zu integrierende Java Bibliothek für die Erstellung von Excel Dateien basierend auf Templates http://jxls.sourceforge.net/ / Basiert auf dem Apache POI Projekt Java API für die nativen Microsoft Office Formaten Lesen und Schreiben von MS Office Dateien mit Java Hervorragende Bibliothek, wird sogar im Oracle SQL Developer verwendet (für den Excel Export) Low Level API => Nicht trivial, wenn komplexere Layouts erstellt werden sollen
jxls Funktionalitäten Unterstützt die MS Office Formate (97-2007), Apache POI wird kontinuierlich weiter entwickelt Template Sprache Schleifen IF THEN (kein direktes ELSE) Ausdrücke (JEXL) Mehrere Collections in einer Arbeitsmappe verwenden (Collection := Rowset, Zeilen einer Wertemenge) Eine einzelne Collection auf mehreren Datenblättern in derselben Arbeitsmappe verwenden Mehrere Spalten der Collection in einer Zelle verwenden Hallo ${user.first_name} ${user.last_name}
jxls Das Framework Daten gruppieren und filtern Spalten dynamisch ausblenden Zus. Funktionen, die in der implementierten i Integration nicht offengelegt wurden Direkter Zugriff auf POI Schicht XLS READER! Excel Datenblätter parsen und Daten auslesen SQL Abfragen in das Datenblatt integrieren, abhängige SQL Abfragen
jxls Das Framework Wie ist der generelle Ablauf? 1. Vorlage erstellen mit MS Excel (.xls) Variablen und Logik hinzufügen 2. Daten ermitteln mit Java (SQL Abfrage, Java Beans) 3. Java API aufrufen => Die Excel Arbeitsmappe wird erstellt
jxls Integration - Beispiele APEX / jxls Integration Eine Teilmenge der Funktionen offenlegen PL/SQL Interface Keine Java Programmierung notwendig! Bsp.: Daten aus zwei SQL Abfragen user_objects: summary:
jxls Beispiele Test application (Demo) Abfrage und Alias festlegen Samples_Template.xls Logo Collection mit den Summen Echte / native Excel Summen (=SUM(B11:B20)) Spalten konditional i einblenden Diagramm in Excel
jxls Beispiele Mehrere Datenblätter innerhalb einer Arbeitsmappe Daten aus zwei SQL Abfragen referenziert (user_objects, summary) Ausgabe von zwei Abfragen nebeneinander Mehrzeilige Listen ausgeben
jxls Template Syntax Wie sieht so ein Template aus? Einfache Spalte, die Zeilen werden automatisch expandiert ${Alias.Spalte}, z.bsp. ${summary.object_type} Explizite Schleifen <jx:foreach items="${summary}" var="s"> </jx> Die Kommandos werden anschließend entfernt
jxls Template Syntax Bedingungen <jx:if> </jx:if> Mehrzeilige Listen
Das Template ändern Formatierung ändern Das Diagramm ändern Eine neue Zeile in der mehrzeiligen Darstellung hinzufügen Neue Spalte object_id ausgeben
Die Integration Die Bestandteile 1. Die Java Applikation erstellen Eingabe: Template als Blob Eingabe: Maps als Varray(Varchar2) Eingabe: SQL Abfragen as Varray(Varchar2) Die jxls API aufrufen Ausgabe : Excel Arbeitsmappe als BLOB 2. Die Java Klassen und Bibliotheken in der Datenbank installieren (mit loadjava) 3. Die PL/SQL API erstellen 4. Die PL/SQL API aufrufen
1. Die Java Applikation Skelett der Java Klasse public class Template { public static BLOB render(oracle.sql.array l pmaps, oracle.sql.array pqueries, BLOB ptemplate) throws Exception, ClassNotFoundException, SQLException, NestableException { // Make internal nal database connection // Loop: Execute all queries and put them in HashMap // Create the XLSTransformer() // Transform into a new resultworkbook into a new BLOB } // Return the new BLOB
2. Installation Grants GRANT JAVASYSPRIV TO XLIB; //or JAVAUSERPRIV dbms_java.grant_permission( 'XLIB', 'SYS:java.lang.RuntimePermission', 'accessdeclaredmembers', '' ); Bibliotheken und Klassen in Oracle installieren loadjava -user xlib/xlib jxls-core-0.9.6.jar loadjava -user xlib/xlib jxls-reader-0.9.6.jar loadjava -user xlib/xlib poi-3.0.1-final-20070705.jar loadjava -user xlib/xlib Template.class
3. Die PL/SQL API PL/SQL Wrapper für die Java API FUNCTION render_template ( p_maps xlib_vc2_array_t, p_queries xlib_vc2_array_t, p_template BLOB ) RETURN BLOB AS LANGUAGE JAVA NAME 'de.oc.xlib.xls.template.render(oracle.sql.array, oracle.sql.array, oracle.sql.blob) return oracle.sql.blob';
4. Die PL/SQL API verwenden CREATE PROCEDURE XLIB.generate_template (p_fil_id IN NUMBER) is l_blob b BLOB; l_out_blob BLOB; l_maps xlib_vc2_array_t := xlib_vc2_array_t (); l_queries xlib_vc2_array_t := xlib_vc2_array_t (); BEGIN SELECT fil_blob_content INTO l_blob FROM xlib_cms_files WHERE fil_id id = p_fil_id; id l_maps.extend (); l_queries.extend (); l_maps (1) := 'user_objects'; l_queries (1) := 'select object_name from user_objects'; l_out_blob := xlib_xls.render_template (p_maps => l_maps, p_queries => l_queries, p_template => l_blob ); OWA_UTIL.mime_header ('application/vnd.ms-excel', FALSE); --htp.print('content- Disposition:attachment;filename="' v_report_title '.xls"'); OWA_UTIL.http_header_close; header WPG_DOCLOAD.download_file (p_blob => l_out_blob); END;
Mehr Beispiele Unser hauptsächlicher Use Case Erstellung von Formularen Versand von gefüllten Formularen per Email V d d K d il h lb Verwendung von der Kommandozeile ausserhalb der Datenbank
Fazit jxls ist ein eleganter Ansatz, um Excel Arbeitsmappen auf Basis von Templates zu erstellen Aktuelle Einschränkung: Die aktuelle Implementierung ist etwas langsam mit größeren Datenmengen Jedoch die perfekte e Lösung für den Use Case bei meinen e Kunden APEX zu erweitern ist einfach Keine Angst vor Java! Jemand kann die Java Klasse schreiben, wir nutzen sie nur über das PL/SQL Interface Hervorragende Möglichkeit, den gesamten Java Stack und all die coolen Bibliotheken zu nutzen
Integration kostenlos verfügbar Die Integration wird demnächst kostenlos verfügbar gemacht Dokumentation Installationsroutine Nur PL/SQL Interface nutzen, kein Java notwendig! Infos f dazu: http://daust.blogspot.com http://www.opal-consulting.de Email: dietmar.aust@opal-consulting.de
APEX Training - Ankündigung Oracle APEX: Knowhow aus der Praxis! 08.03 10.03.2010 in Bensheim http://www.opal-consulting.de/training Dozenten: Denes Kubicek ( APEX Entwickler des Jahres 2008; Oracle ACE) Dietmar Aust Praxisrelevant! Lessons learned von vielen APEX Projekten Hands-On Sessions
APEX / XE Buch Oracle APEX und XE in der Praxis Erscheint am 9.12.2009 Autoren: Denes Kubicek Jens-Christian Pokolm Dietmar Aust
Q&A Q&A Kontakt: Opal-Consulting Dietmar Aust Web: http://www.opal-consulting.de Blog: http://daust.blogspot.com/ p E-Mail: dietmar.aust@opal-consulting.de