If there is a requirement to produce output from an application into Excel, you would probably create a CSV (Comma Separated File) with the data and start Excel to show the data - at least that's what I did...until now. The drawback of this solution is that you could only produce data and no nice layout. But Excel is also capable of opening HTML-files and using this you could create Excel files with data and magnificent layout!
Let me give an example:
1. Create a procedure to show the data in formatted in an HTML table.
![HTML-table in the browser](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_ug36AXFBNBs_sK5JeczZFnVtuEEuZ1xKhG_o-WnQWGNTb7-BZwFqz-nggoB3jHgWcoowhwQWbGJtIii7wMnc-F4E2lRdqwdOfX4C_tQ5xRSI5syG3njRjfRHfhn1MrU4sUf-dbCXv9T6mnRtm7=s0-d)
3. By adding the owa_util lines in the procedure and executing it in your browser you’ll get a download option window:
![Download option window](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_sSFzXVV8a6yBtf0PtC9h5VfijDYEeik1-z2J21sZdwhCSEDno1Hezd-NIX8j_6t5XO9advX904I-QUasio75uTb4unqEqwttv5F35lK8NEuySmFjVkAfgwlfuhTobdUz3Ala-B_70wMOqy=s0-d)
4. If you select “Openen met” (”Open with”) Excel starts and the document looks like this:
![Results in Excel](https://lh3.googleusercontent.com/blogger_img_proxy/AEn0k_s7NzXhLq0s2B2BCJqPghZRC1VauYTpR2uKHiVkkLRMBHIvO5W00SBPNyeDGQJIS2IoWkvWVUq4qwnykK5-raETcSgOnmwnIl-BKheZuXbp2Tj4AfpzD3-ongFhFQUQH-9S_YUIAinDkJC318A=s0-d)
So that creates the possiblity to create Excel output just the way your user likes it!
Let me give an example:
1. Create a procedure to show the data in formatted in an HTML table.
2. In the browser the table looks like this:
CREATE OR REPLACE PROCEDURE display_emp_list IS
v_emp_count NUMBER(5);
v_empno NUMBER(8);
v_ename VARCHAR2(50);
v_job emp.job%TYPE;
v_sal emp.sal%TYPE;
v_bg_color VARCHAR2(10) := '';
CURSOR c_emp IS
SELECT empno,
initcap(ename),
job,
sal
FROM emp
ORDER BY ename;
BEGIN
SELECT COUNT(*)
INTO v_emp_count
FROM emp;
owa_util.mime_header('application/ms-excel', FALSE);
htp.p('Content-Disposition: filename="test.xls"');
owa_util.http_header_close;
htp.htmlopen;
htp.bodyopen;
htp.header(5, '<font color="RED"> <center> EMPLOYEE INFO </center></font>');
htp.tableopen(cattributes=>'border="2",bordercolor="BLACK",width="60%",align="CENTER"');
htp.tablerowopen(cattributes => 'bgcolor="GREEN"');
htp.tableheader(cattributes => 'colspan="4", align="CENTER"'
,cvalue => '<font face="ARIAL" size="2.5" color="WHITE">'
|| 'Employees. (List Count:' || v_emp_count || ')');
htp.tablerowclose;
htp.tablerowopen(cattributes => 'align="LEFT", bgcolor="YELLOW"');
htp.tableheader(cvalue => '<font face="ARIAL" size="2.25" color="BLUE">' || 'No.');
htp.tableheader(cvalue => '<font face="ARIAL" size="2.25" color="BLUE">' || 'Name');
htp.tableheader(cvalue => '<font face="ARIAL" size="2.25" color="BLUE">' || 'Job');
htp.tableheader(cvalue => '<font face="ARIAL" size="2.25" color="BLUE">' || 'Sal');
htp.tablerowclose;
OPEN c_emp;
FETCH c_emp
INTO v_empno,
v_ename,
v_job,
v_sal;
WHILE c_emp % FOUND
LOOP
IF MOD(v_emp_count, 2) = 0
THEN
v_bg_color := 'SILVER';
ELSE
v_bg_color := 'WHITE';
END IF;
htp.tablerowopen(cattributes => 'bgcolor=' || v_bg_color);
htp.tabledata(cattributes => 'align="LEFT"'
,cvalue => '<font face="ARIAL" size="2" color="BLACK">' || v_empno);
htp.tabledata(cattributes => 'align="LEFT"'
,cvalue => '<font face="ARIAL" size="2" color="BLACK">' || v_ename);
htp.tabledata(cattributes => 'align="LEFT"'
,cvalue => '<font face="ARIAL" size="2" color="BLACK">' || v_job);
htp.tabledata(cattributes => 'align="LEFT"'
,cvalue => '<font face="ARIAL" size="2" color="BLACK">' || v_sal);
htp.tablerowclose;
v_emp_count := v_emp_count -1;
FETCH c_emp
INTO v_empno,
v_ename,
v_job,
v_sal;
END LOOP;
CLOSE c_emp;
htp.tablerowclose;
htp.tableclose;
htp.bodyclose;
htp.htmlclose;
EXCEPTION
WHEN no_data_found
THEN
NULL;
END;
3. By adding the owa_util lines in the procedure and executing it in your browser you’ll get a download option window:
4. If you select “Openen met” (”Open with”) Excel starts and the document looks like this:
So that creates the possiblity to create Excel output just the way your user likes it!
Comments
I tried executing you proc. It executed fine, but I do not know where to retrieve the "test.xls" file from. I tried specifying a path such as "c:\test.xls", but it is not there.
Let me know
Thanks
I see you have a internet explorer.
But I am using PL/SQL developer.
I am trying to find a way to create a excel sheet from Oracle and came across you article.
Thanks,
HTH
Roel
http://sanjeev-oracle-world.blogspot.com
if we can also create tabs in excel workbook. i mean more than two sheets in a excel workbook.
Check out this PL/SQL tool kit we started using. It let's the PL/SQL developer call a couple of procs to do this and more. It supports functions that our business folks in finance love. It's at http://www.peak42solutions.com. It has a weird name excellant.
Thanks,
Bill
I know this is an old post, does it still work though?