• Leistungsspektrum
    Die passenden Lösungen für Ihre Anforderungen.
    Mehr Details unter der Rubrik: Leistungen
  • Professionelle Anwendungen
    Holen Sie mehr aus Ihren APEX Applikationen heraus.
  • Neueste Designs
    Nutzung von erweiterten Web 2.0 Möglichkeiten und Entwicklung von Corporate Designs
  • Individuelle Lösungen
    Entwicklung von Business-Anwendungen genau nach Ihren Wünschen.
  • Upgrade Lösungen
    Weiterentwicklung bestehender Anwendungen.
  • Schulungen und Vorträge
    Die passenden Schulungen genau für Sie zugeschnitten. Beispiel: Navigationsbeispiele
  • Plugins und Third Party Erweiterungen
    Erweitern Sie die Funktionalität ihrer Anwendungen mit einem modularen Entwicklungsansatz.

22 June, 2012

Easy table export to XLS (based on HTML)

There is a quite easy way to generate nice looking Excel files based on your APEX reports. It doesn't require any special printing engine and should work even with Excel 2003.

It supports all kind of report views as long as they are build as tables. In my case I created an export based on this pivot table output: http://gumption.org/2004/pivot_table/test_page.html
Of course my pivot table is build up as plug-in and selects data from my project data tables.

All you need to do is to get the table element (including all html code) from your rendered page and write it into a blank XLS-file.
Those are the steps you have to follow:

1. Create a new APEX item: textarea
Textarea - P1_EXPORT_DATA
HTML Form Element Attributes: style="display:none;"

2. Create a button
Button: P1_EXPORT
Action: Defined by Dynamic Action

3. Edit your table region
Static ID: YOUR_APEX_TABLE_ID
Info: Check your report template. Your table element should look similar to this:
<table border="0" cellpadding="0" cellspacing="0" summary="" id="report_#REGION_STATIC_ID#"

3. Create a Dynamic Action
Event: Click
Selection Type: Button
Button: P1_EXPORT
Actions: Execute Javascript Code & Submit Page
 - Execute Javascript Code:
$('#P1_EXPORT_DATA').val($('#YOUR_APEX_TABLE_ID').wrap('<p/>').parent().html());
$('#YOUR_APEX_TABLE_ID').unwrap();
 - Submit Page:
EXPORT

4. Create a new Branch
Branch to Page or URL - OnSubmit
Page: 1
Request: Export
Conditions - PL/SQL
:REQUEST = 'EXPORT'

5. Add a new process
Process: Export
Type: PL/SQL
Process Point: On Load - Before Header
Process:
DECLARE
     l_mime        VARCHAR2 (255);
     l_length      NUMBER;
     l_file_name   VARCHAR2 (2000);
     lob_loc       BLOB;
BEGIN
     dbms_lob.createtemporary(lob_loc, TRUE);
     DBMS_LOB.WRITE(lob_loc, LENGTH(:P1_EXPORT_DATA), 1, UTL_RAW.CAST_TO_RAW(:P1_EXPORT_DATA));
     OWA_UTIL.mime_header ('application/xls', FALSE);
     HTP.p ('Content-Length: ' || DBMS_LOB.GETLENGTH(lob_loc));
     HTP.p ('Content-Disposition: attachment; filename="my_xls_doc.xls"');
     OWA_UTIL.http_header_close;
     WPG_DOCLOAD.download_file(lob_loc);
END;

The output will look like this:


It also supports images but they must include the complete URL.

Btw.: APEX 4.2 EA is out. New Application Builder looks mostly nice but I think the region headers are far to big. Check it out yourself: https://apexea.oracle.com/i/index.html
New feature list: http://www.grassroots-oracle.com/2012/06/oracle-apex-42-early-adopter-announced.html


6 comments:

Carsten said...

Hallo Tobias,

ich habe versucht, dein Beispiel anzuwenden. Sobald ich den PageProcess anlege und die Seite neu starte, bekomme ich nur noch ein ORA-06502: PL/SQL: numeric or value error.

Fehlt da noch eine Abhängigkeit, damit der Prozess erst startet, wenn die Textarea gefüllt ist?

Tobias Arnhold said...

Hi Carsten,

ich werde demnächst mal ein Beispiel online bringen, dann checke ich den gesamten Code auch noch mal. Den ORA-06502 nach zustellen ist recht mühselig.

Grüße Tobias

Jürgen Schuster said...

Hallo Tobias,

die Lösung funktioniert aber nur mit den Daten, die ich auf der einen Seite sehen kann, wenn der Report mehrere Seiten hat, gibts da auch eine Lösung?

Kann man Formatierungen (Farben, Fett, ...) für Excel mitgeben?

Grüße, Jürgen

Tobias Arnhold said...

Hi Jürgen,
"wenn der Report mehrere Seiten hat, gibts da auch eine Lösung?" --> Mit der vorgeschlagenen Lösung würde es so nicht funktionieren, mit etwas Javascript könnte man aber bestimmt was umsetzen.
Ansonsten bleibt noch das Excel Plugin oder eine Server Lösung ala JasperReports oder biPublisher.

"Kann man Formatierungen (Farben, Fett, ...) für Excel mitgeben?" --> Soweit ich weiß nicht. Aber da bin ich mir nicht hundert pro sicher.

Grüße

Tobias

René said...

Sali Tobias

Oben schreibst du "ich werde demnächst mal ein Beispiel online bringen"
Wäre echt super, wenn ich so ein Beispiel hätte. Ist dein Beispiel online.

Vielen Dank und Gruss
René

ellen said...

I think I'm getting the same error as Carsten, ORA-06502: PL/SQL: numeric or value error., but I don't speak German so I dont understand your answer... can u explain in english please?