Часто приходится делать различные выгрузки отчётов в формате XLSX из Oracle, используя PL/SQL developer (Oracle 11g2). Так часто, что решил автоматизировать этот процесс на Java. Язык Java изучаю сам по книгам и видеокурсам уже давно, поэтому если будут какие-то дополнения или замечания по коду, то опишите их здесь.
Выгрузка из PL/SQL делается при помощи библиотеки AS_XLSX.
Gui создан для удобства. Скачал jar, открыл его (должна быть установлена Java на компьютере), указал параметры и столбцы, нажал кнопку, получил готовый код для вставки в пакет PL/SQL (сэкономил нервы и время).

Возможности программы:
Формирование кода объектов PL/SQL производится после ввода параметров и столбцов при нажатии на кнопку "Create objects";
Столбцы можно редактировать вручную или загружать их по кнопке "Open file" из файлов формата CSV или TXT.

Пример содержимого файла CSV Record создаётся на выбор в 2 вариантах:
- на основе %TYPE view или таблицы (не %ROWTYPE т.к. чаще нужны не все поля для выгрузки);
- на основе введённых типов в таблице Columns.Возможность очистки списка параметров и столбцов;
Добавлены комбобоксы со шрифтами, типами данных, boolean переменными и выравниванием в ячейках;
Цвет фона заголовков можно увидеть сразу в параметрах. При указании другого кода цвета, фон ячейки поменяет цвет на указанный;
Столбцы с типом данных DATE будут приведены к типу 'DD.MM.YYYY'.
Код, получаемый после ввода параметров и 3 столбцов:
-- Package specification -- version 1 type t_type_of_record is record ( BD_ID table_or_view.BD_ID%TYPE, BD_NAME table_or_view.BD_NAME%TYPE, BD_DATE table_or_view.BD_DATE%TYPE ); -- version 2 type t_type_of_record is record ( BD_ID NUMBER, BD_NAME VARCHAR2(4000), BD_DATE DATE ); type t_type_of_record_tbl is table of t_type_of_record; function get_xls_function(p_type in t_type_of_record_tbl) return blob; -- Package body -- procedure procedure get_xls_from_table is l_file BLOB; l_file_name varchar2(30) := 'file_name'; l_type t_type_of_record_tbl; begin select BD_ID, BD_NAME, BD_DATE bulk collect into l_type from table_or_view where column_name between sysdate and sysdate + 1; l_file := get_xls_function(l_type); if lengthb(l_file) > 0 then api_datasource.setColumnValue('BLOB_DUAL_ds.blob', l_file); api_datasource.download('BLOB_DUAL_ds.blob', l_file_name||'.xlsx'); end if; exception when others then sb_util.write_log('package.get_xls_from_table ошибка: ' || sqlerrm ||chr(13)|| dbms_utility.format_error_backtrace, 'info'); end; -- function function get_xls_function(p_type in t_type_of_record_tbl) return blob is row_num number := 0; v_file blob; begin as_xlsx.clear_workbook; as_xlsx.new_sheet('tab1'); row_num := row_num + 1; as_xlsx.set_row(row_num, p_fontId => as_xlsx.get_font('Times New Roman', p_fontsize => 13, p_bold => true), p_fillId => as_xlsx.get_fill('solid', 'FFCC66'), p_borderId => as_xlsx.get_border); -- headers as_xlsx.set_row_height(1, 25); as_xlsx.set_column_width(1, 10); as_xlsx.cell(1, 1, 'id', p_alignment => as_xlsx.get_alignment (p_horizontal => 'center', p_vertical => 'center', p_wraptext => true)); as_xlsx.set_column_width(2, 20); as_xlsx.cell(2, 1, 'name', p_alignment => as_xlsx.get_alignment (p_horizontal => 'center', p_vertical => 'center', p_wraptext => true)); as_xlsx.set_column_width(3, 18); as_xlsx.cell(3, 1, 'date', p_alignment => as_xlsx.get_alignment (p_horizontal => 'center', p_vertical => 'center', p_wraptext => true)); FOR i IN 1..p_type.count loop row_num := row_num + 1; as_xlsx.set_row(row_num, p_fontId => as_xlsx.get_font('Times New Roman', p_fontsize => 12), p_borderId => as_xlsx.get_border); as_xlsx.set_row_height(row_num, 25); -- as_xlsx.cell(1, i + 1, coalesce(p_type(i).BD_ID, '-'), p_alignment => as_xlsx.get_alignment (p_horizontal => 'center', p_vertical => 'center', p_wraptext => true), p_fontId => as_xlsx.get_font('Times New Roman', p_fontsize => 12, p_bold => false, p_italic => false)); as_xlsx.cell(2, i + 1, coalesce(p_type(i).BD_NAME, '-'), p_alignment => as_xlsx.get_alignment (p_horizontal => 'center', p_vertical => 'center', p_wraptext => true), p_fontId => as_xlsx.get_font('Times New Roman', p_fontsize => 12, p_bold => false, p_italic => false)); as_xlsx.cell(3, i + 1, coalesce(to_char(p_type(i).BD_DATE, 'dd.mm.yyyy'), '-'), p_alignment => as_xlsx.get_alignment (p_horizontal => 'center', p_vertical => 'center', p_wraptext => true), p_fontId => as_xlsx.get_font('Times New Roman', p_fontsize => 12, p_bold => false, p_italic => false)); end loop; v_file := as_xlsx.finish; RETURN v_file; exception when others then sb_util.write_log('package.get_xls_function ошибка: ' ||sqlerrm||chr(13)|| dbms_utility.format_error_backtrace, 'info'); END;
Итоговый эксель-файл выглядит так:

