Easy table export to XLS (based on HTML)

Von Tobias Arnhold 6.22.2012
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


Post Tags:

6 Comments " Easy table export to XLS (based on HTML) "

Carsten

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 04 July, 2012 00:05

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

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 11 July, 2012 20:44

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é

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 09 January, 2013 18:09

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?