Re: Best way to Extract Data from Oracle into Excel
Date: 17 Feb 2005 02:07:39 -0800
Message-ID: <1108634859.259596.189500_at_l41g2000cwc.googlegroups.com>
[Quoted] I have written a procedure in PL/SQL for Oracle Forms which takes a block and export its columns into an external Excel file. In fact, this file is an HTML with special tags recognized by the MS Office tools. With these tags you can virutally create a sheet with any functionality, event charts. An easy way to find which tag to use is to create you customized Excel file and save it is as "Web Page". Then you can edit the saved file in any text editor to view the generated tags. The below procedure can be adapted to run on the server too.
procedure cp_mwt_export_to_excel is
type t_format_mask is table of varchar2(30) index by binary_integer; type t_item_type is table of varchar2(15) index by binary_integer; type t_data_type is table of varchar2(15) index by binary_integer; type t_multi_line is table of varchar2(5) index by binary_integer; type t_display is table of boolean index by binary_integer; type t_item_id is table of item index by binary_integer; v_format_mask t_format_mask; v_item_type t_item_type; v_data_type t_data_type; v_multi_line t_multi_line; v_display t_display; v_item_id t_item_id; v_char varchar2(4000);
v_number number;
v_date date;
v_list_value varchar2(100); v_prompt_text varchar2(60); v_hint_text varchar2(60); v_label varchar2(60); v_user_url varchar2(50); v_user_directory varchar2(50); v_name varchar2(30); v_filename varchar2(16); v_status varchar2(15); v_visible varchar2(5); v_export_item varchar2(1); v_rows pls_integer; v_columns pls_integer; v_lines pls_integer; v_index pls_integer; v_list_count pls_integer; v_list_index pls_integer; v_length pls_integer; v_type pls_integer; v_null boolean; v_block_id block; v_connection exec_sql.conntype; v_cursor exec_sql.curstype;
v_handle text_io.file_type;
begin
enter;
if form_failure = true then
raise form_trigger_failure;
end if;
v_status := get_block_property('DATA',status);
if v_status = 'NEW' then
cp_mwt_display_error('There is no data to be exported.'); raise form_trigger_failure;
end if;
if v_status <> 'QUERY' then
cp_mwt_display_error('Save changes before exporting.'); raise form_trigger_failure;
end if;
cp_mwt_question('Export','Are you sure you want to export to Excel (maximum of 65,535 records) ?');
v_filename := cf_mwt_generate_filename;
tool_env.getvar('USER_DIRECTORY',v_user_directory);
v_handle :=
text_io.fopen(lower(v_user_directory||'\'||v_filename)||'.xls','W');
text_io.put_line(v_handle,'<html
xmlns:o="urn:schemas-microsoft-com:office:office"');
text_io.put_line(v_handle,'xmlns:x="urn:schemas-microsoft-com:office:excel"');
text_io.put_line(v_handle,'xmlns="http://www.w3.org/TR/REC-html40">');
text_io.put_line(v_handle,'<body>'); text_io.put_line(v_handle,'<table border=1>'); text_io.put_line(v_handle,'<tr>');
v_connection := exec_sql.default_connection;
v_cursor := exec_sql.open_cursor(v_connection);
exec_sql.parse(v_connection,v_cursor,replace(get_block_property('DATA',last_query),'ROWID,'));
v_block_id := find_block('EXPORT');
v_columns := 0;
loop
v_columns := v_columns + 1; begin exec_sql.describe_column(v_connection,v_cursor,v_columns,v_name,v_length,v_type); exception when exec_sql.invalid_column_number then v_columns := v_columns - 1; exit; end; v_item_id(v_columns) := find_item('DATA.'||v_name||'_DISPLAY'); if id_null(v_item_id(v_columns)) = true then v_item_id(v_columns) := find_item('DATA.'||v_name||'_EDIT'); end if; if id_null(v_item_id(v_columns)) = true then v_item_id(v_columns) := find_item('DATA.'||v_name); end if; if id_null(v_block_id) = false then v_export_item := name_in('EXPORT.'||v_name); else v_export_item := 'Y'; end if; v_item_type(v_columns) := get_item_property(v_item_id(v_columns),item_type); v_data_type(v_columns) := get_item_property(v_item_id(v_columns),datatype); v_visible := get_item_property(v_item_id(v_columns),visible); v_prompt_text := get_item_property(v_item_id(v_columns),prompt_text); v_hint_text := get_item_property(v_item_id(v_columns),hint_text); if v_item_type(v_columns) = 'TEXT ITEM' then v_format_mask(v_columns) := get_item_property(v_item_id(v_columns),format_mask); else v_format_mask(v_columns) := null; end if; if v_hint_text is not null then v_label := v_hint_text; else v_label := v_prompt_text; end if; if v_item_type(v_columns) <> 'DISPLAY ITEM' and v_visible = 'TRUE' and v_export_item = 'Y' then v_display(v_columns) := true; else v_display(v_columns) := false; end if; if v_display(v_columns) = true then text_io.put_line(v_handle,'<td bgcolor="#FFFF00" x:autofilter="all"><b>'||v_label||'</b></td>'); end if; if v_data_type(v_columns) = 'CHAR' then if v_item_type(v_columns) = 'TEXT ITEM' then v_multi_line(v_columns) := get_item_property(v_item_id(v_columns),multi_line); else v_multi_line(v_columns) := 'FALSE'; end if;
exec_sql.define_column(v_connection,v_cursor,v_columns,v_char,v_length);
end if; if v_data_type(v_columns) = 'NUMBER' then if v_format_mask(v_columns) is not null then v_format_mask(v_columns) := replace(v_format_mask(v_columns),'9','#'); v_format_mask(v_columns) := replace(v_format_mask(v_columns),'G',','); v_format_mask(v_columns) := replace(v_format_mask(v_columns),'D','.'); end if; v_multi_line(v_columns) := 'FALSE';
exec_sql.define_column(v_connection,v_cursor,v_columns,v_number);
end if; if v_data_type(v_columns) in ('DATE','DATETIME') then v_multi_line(v_columns) := 'FALSE'; exec_sql.define_column(v_connection,v_cursor,v_columns,v_date); end if;
end loop;
text_io.put_line(v_handle,'</tr>');
v_rows := exec_sql.execute(v_connection,v_cursor);
v_lines := 0;
while exec_sql.fetch_rows(v_connection,v_cursor) > 0 loop
v_lines := v_lines + 1; text_io.put_line(v_handle,'<tr>'); for v_index in 1..v_columns loop v_null := false; if v_data_type(v_index) = 'CHAR' then exec_sql.column_value(v_connection,v_cursor,v_index,v_char); if v_char is null then v_null := true; end if; end if; if v_data_type(v_index) = 'NUMBER' then exec_sql.column_value(v_connection,v_cursor,v_index,v_number); if v_number is null then v_null := true; end if; end if; if v_data_type(v_index) in ('DATE','DATETIME') then exec_sql.column_value(v_connection,v_cursor,v_index,v_date); if v_date is null then v_null := true; end if; end if; if v_display(v_index) = true then if v_null = true then text_io.put_line(v_handle,'<td></td>'); else if v_data_type(v_index) = 'CHAR' then v_char := replace(v_char,' ',' '); if v_item_type(v_index) = 'CHECKBOX' then if v_char in ('Y','YES') then v_char := 'YES'; else v_char := 'NO'; end if; end if; if v_item_type(v_index) = 'LIST' then v_list_count := get_list_element_count(v_item_id(v_index)); for v_list_index in 1..v_list_count loop v_list_value := get_list_element_value(v_item_id(v_index),v_list_index); if v_list_value = v_char then v_char := get_list_element_label(v_item_id(v_index),v_list_index); exit; end if; end loop; end if; if v_multi_line(v_index) = 'TRUE' then text_io.put_line(v_handle,'<td style=''white-space:wrap'' x:str>'||v_char||'</td>'); else text_io.put_line(v_handle,'<td style=''white-space:nowrap'' x:str>'||v_char||'</td>'); end if; end if; if v_data_type(v_index) = 'NUMBER' then if v_format_mask(v_index) is not null then text_io.put_line(v_handle,'<tdstyle=''mso-number-format:"'||v_format_mask(v_index)||'"'' x:num>'||to_char(v_number)||'</td>');
else text_io.put_line(v_handle,'<td x:num>'||to_char(v_number)||'</td>'); end if; end if; if v_data_type(v_index) = 'DATE' then text_io.put_line(v_handle,'<td align=leftstyle=''mso-number-format:"dd-mmm-yyyy"'' x:num>'||to_char(v_date,'DD-MON-YYYY')||'</td>');
end if; if v_data_type(v_index) = 'DATETIME' then text_io.put_line(v_handle,'<td align=leftstyle=''mso-number-format:"dd-mmm-yyyy hh:mm:ss"'' x:num>'||to_char(v_date,'DD-MON-YYYY HH24:MI:SS')||'</td>');
end if; end if; end if; end loop; text_io.put_line(v_handle,'</tr>'); exit when v_lines = 65535;
end loop;
exec_sql.close_cursor(v_cursor);
exec_sql.close_connection(v_connection);
text_io.put_line(v_handle,'</table>'); text_io.put_line(v_handle,'</body>'); text_io.put_line(v_handle,'</html>');
text_io.fclose(v_handle);
if v_lines > 500 then
host('pkzip -add -silent
'||lower(v_user_directory||'\'||v_filename)||'.zip
'||lower(v_user_directory||'\'||v_filename)||'.xls');
host('del '||lower(v_user_directory||'\'||v_filename)||'.xls'); end if;
cp_mwt_display_message(to_char(v_lines)||' records were successfully exported - the file will now be downloaded.');
tool_env.getvar('USER_URL',v_user_url);
if v_lines > 500 then
web.show_document(v_user_url||lower(v_filename)||'.zip','_blank');
else
web.show_document(v_user_url||lower(v_filename)||'.xls','_blank');
end if;
end; Received on Thu Feb 17 2005 - 11:07:39 CET