Часто приходится делать различные выгрузки отчётов в формате 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;
Итоговый эксель-файл выглядит так:
