Принцип использования


Для создания файла Excel на процедурном языке PL/pgSQL создается функция, которая выполняет следующее: определяет документ (pgxls.create), заполняет его (pgxls.add_row, pgxls.put_cell, pgxls.add_sheet), формирует и возвращает файл (pgxls.get_file).

Кол-во столбцов и их ширина определяются при создании документа или добавлении листа. Для каждого столбца можно переопределить формат в зависимости от типа данных c помощью процедур pgxls.set_column_format_[type].

Процедура pgxls.put_cell устанавливает значение ячейки и формат в зависимости от типа значения (настраивается для столбца), имеет необязательные параметры для изменения свойств форматирования.

Процедуры pgxls.format_cell, pgxls.format_row и pgxls.format_all изменяют форматирование.

Для удобства использования определяется текущий столбец, который сбрасывается при добавлении строки и увеличивается при установке значения поля без указания столбца. При установке значения ячейки с указанием столбца текущий столбец переопределяется на указанный. При помощи процедур pgxls.set_column_current и pgxls.next_column можно изменять текущий столбец.

При добавлении строки или листа текущая строка записывается во временную таблицу в виде подготовленной части файла и не может быть изменена. Высота строки вычисляется автоматически, но может быть установлена вручную процедурой pgxls.set_row_height.

Настройка печати позволяет для каждого листа установить формат и ориентацию бумаги, заголовок, повторяющиеся строки ("шапку" таблицы) и отступы. Выполняется процедурами pgxls.set_page_paper, pgxls.set_page_header, pgxls.set_page_rows_repeat и pgxls.set_page_margins соответственно.

При создании больших файлов для заполнения ячеек необходимо использовать процедуры pgxls.set_cell_[type] и получать файл частями (pgxls.get_file_parts_query).

Для создания файла по SQL-запросу создана функция-обертка pgxls.get_file_by_query, а для добавления листа - процедура pgxls.add_sheet_by_query.

Процедуры-обертки pgxls.save_file и pgxls.save_file_by_query сохраняют документ в файл на сервере, выполняются под суперпользователем.

Не разрешается обращение к внутренним полям pgxls.xls и использование процедур и типов, начинающихся с подчеркивания "_"

Безопасность


Хранимые процедуры создаются с правами вызывающего (security invoker), соотвественно, передаваемые через параметры динамические SQL-запросы вызываются с этими правами.

При необходимости доступа разработчика к сохранению файлов на сервере суперпользователь создает процедуру-обертку с правами владельца (security definer) и необходимыми проверками.

Пример:
-- postgres create wrapper for procedure pgxls.save_file with option security definer and access check,
-- grant privilege on wrapper    
create or replace procedure example.save_file_to_share_reports(inout xls pgxls.xls, filename varchar) security definer language plpgsql as $$  
begin 
  if filename like '%/%' then
    raise exception 'File name cannot contain path';   
  end if;
  call pgxls.save_file(xls, '/mnt/share/reports/'||filename);
end 
$$;
grant execute on procedure example.save_file_to_share_reports to developer_1;

-- developer_1 create report and save it using wrapper example.save_file_to_share_reports
create or replace procedure example.my_report() language plpgsql as $$
declare 
  xls pgxls.xls; 
begin
  xls := pgxls.create(array[10,10]);   
  call pgxls.put_cell_text(xls, 'My');      
  call pgxls.put_cell_text(xls, 'Report'); 
  call example.save_file_to_share_reports(xls, 'MyReport.xlsx');      
end
$$;
call example.my_report();

pgxls.add_row


Процедура добавляет одну или несколько строк на лист, обнуляет текущий столбец

Параметры:
xlspgxls.xls-документ
countint-кол-во строк (необязательный, по умолчанию 1)

Примеры использования:
call pgxls.add_row(xls);
call pgxls.add_row(xls, 5);

pgxls.add_row_texts


Процедура добавляет строку с текстовыми значениями, позволяет менять параметры стиля

Параметры:
xlspgxls.xls-документ
textstext[]-значения ячеек
font_boldboolean-жирный шрифт (необязательный)
fill_foreground_colorvarchar(6)-цвет заливки в формате 'RRGGBB' или 'none' (необязательный)
alignment_horizontalpgxls.alignment_horizontal-выравнивание по горизонтали (необязательный)

Примеры использования:
call pgxls.add_row_texts(xls, array['ID','Name']);
call pgxls.add_row_texts(xls, array['x','√x','x²','md5(x)'], font_bold=>true, fill_foreground_color=>pgxls.color$dark_gray(), alignment_horizontal=>'center');

pgxls.add_sheet


Процедура добавляет новый лист в документ

Параметры:
xlspgxls.xls-документ
columns_widthsint[]-ширины столбцов
columns_captionstext[]-заголовки столбцов (необязательный)
namevarchar-имя листа (необязательный)

Пример использования:
call pgxls.add_sheet(xls, array[10,20], array['ID','Name'], 'Sheet2');

pgxls.add_sheet_by_query


Процедура добавляет новый лист в документ

Параметры:
xlspgxls.xls-документ
columns_widthsint[]-ширины столбцов
columns_captionstext[]-заголовки столбцов (необязательный)
namevarchar-имя листа (необязательный)

Пример использования:
call pgxls.add_sheet_by_query(xls, 'select * from pg_class', 'Query data');

pgxls.alignment_horizontal


Тип enum, определяет выравнивание по горизонтали
Значения: top,center,bottom,justify,distributed

pgxls.alignment_vertical


Тип enum, определяет выравнивание по вертикали
Значения: top,center,bottom,justify,distributed

pgxls.border_line


Тип enum, определяет внешний вид границы.
Значения: none,thin,thick,dashed,dotted,dashDot,dashDotDot,double

pgxls.clear_file_parts


Процедура удаляет файл из временной таблицы, используется совместно с pgxls.get_file_parts_query

Параметр:
xlspgxls.xls-документ

pgxls.color$[name]


Функция возвращает цвет (тип varchar(6)) по названию

Параметр:
name-название: light_red,light_green,light_blue,light_gray,dark_red,dark_green,dark_blue,dark_gray

Примеры использования:
call pgxls.set_cell_font(xls, color=>pgxls.color$light_red());
call pgxls.set_all_fill(xls, foreground_color=>pgxls.color$dark_gray());

pgxls.create


Функция создает, инициализирует и возращает документ (тип pgxls.xls)

Параметры:
columns_widthsint[]-ширины столбцов
columns_captionstext[]-заголовки столбцов (необязательный)
sheet_namevarchar-имя листа (необязательный)

Примеры использования:
declare 
  xls pgxls.xls; 
begin
  xls := pgxls.create(array[10,20,30], sheet_name=>'My sheet');
  xls := pgxls.create(array[15,30,30], array['x','√x','x²'], 'Columns');

pgxls.font_name$[family]


Функция возвращает имя (тип varchar) по семейству шрифта

Параметр:
family-семейство шрифта: sans,sans_serif,monospace

Примеры использования:
call pgxls.set_column_font(xls, 1, name=>pgxls.font_name$sans_serif(), size=>16);
call pgxls.set_cell_value(xls, 123, font_name=>pgxls.font_name$monospace());

pgxls.format_cell


Процедура форматирует ячейку

Параметры:
xlspgxls.xls-документ
column_int-столбец (необязательный, по умолчанию текущий)
format_codevarchar-код формата (необязательный)
font_namevarchar-имя шрифта (необязательный)
font_sizeint-размер шрифта (необязательный)
font_boldboolean-жирный шрифт (необязательный)
font_italicboolean-шрифт курсивом (необязательный)
font_underlineboolean-подчеркнутый шрифт (необязательный)
font_strikeboolean-зачеркнутый шрифт (необязательный)
font_colorvarchar(6)-цвет шрифта в формате 'RRGGBB' или 'auto' (необязательный)
border_aroundpgxls.border_line-граница всех сторон (необязательный)
border_leftpgxls.border_line-граница слева (необязательный)
border_toppgxls.border_line-граница сверху (необязательный)
border_rightpgxls.border_line-граница справа (необязательный)
border_bottompgxls.border_line-граница снизу (необязательный)
fill_foreground_colorvarchar(6)-цвет заливки в формате 'RRGGBB' или 'none' (необязательный)
alignment_horizontalpgxls.alignment_horizontal-выравнивание по горизонтали (необязательный)
alignment_indentint-отступ при выравнивании (необязательный)
alignment_verticalpgxls.alignment_vertical-выравнивание по вертикали (необязательный)
alignment_text_wrapboolean-перенос текста при выравнивании (необязательный)

Примеры использования:
call pgxls.format_cell(xls, 2, format_code=>'dd.mm.yyyy hh:mm');
call pgxls.format_cell(xls, font_size=>10, font_bold=>true, fill_foreground_color=>'AA00EE');
call pgxls.format_cell(xls, border_around=>'thin', alignment_horizontal=>'left', alignment_indent=>2);

pgxls.format_row


Процедура форматирует все ячейки строки

Параметры:
xlspgxls.xls-документ
font_namevarchar-имя шрифта (необязательный)
font_sizeint-размер шрифта (необязательный)
font_boldboolean-жирный шрифт (необязательный)
font_colorvarchar(6)-цвет шрифта в формате 'RRGGBB' или 'auto' (необязательный)
borderpgxls.border_line-граница всех сторон (необязательный)
fill_foreground_colorvarchar(6)-цвет заливки в формате 'RRGGBB' или 'none' (необязательный)
alignment_horizontalpgxls.alignment_horizontal-выравнивание по горизонтали (необязательный)
alignment_verticalpgxls.alignment_vertical-выравнивание по вертикали (необязательный)
alignment_text_wrapboolean-перенос текста при выравнивании (необязательный)

Примеры использования:
call pgxls.format_row(xls, font_size=>10, font_bold=>true, fill_foreground_color=>pgxls.color$light_green());
call pgxls.format_row(xls, border=>'thin', alignment_horizontal=>'center');

pgxls.get_cell_height


Функция возвращает высоту ячейки, обычно используется при явном указании высоты строки при вертикальном объединении ячеек

Параметры:
line_countint-кол-во строк (необязательный, по умолчанию 1)
font_sizeint-размер шрифта (необязательный)

Пример использования:
call pgxls.set_row_height(xls, pgxls.get_cell_height());

pgxls.get_column_name


Функция возвращает высоту ячейки, обычно используется при явном указании высоты строки при вертикальном объединении ячеек

Параметр:
column_int-столбец

Пример использования:
column_name := pgxls.get_column_name(5);

pgxls.get_file


Функция формирует и возвращает файл (тип bytea)

Параметр:
xlspgxls.xls-документ

Пример использования:
return pgxls.get_file(xls);

pgxls.get_file_by_query


Функция создает документ с данными по SQL-запросу, формирует и возвращает файл (тип bytea)

Параметр:
querytext-SQL-запрос

Пример использования:
select pgxls.get_file_by_query('select * from pg_class');

pgxls.get_file_parts_query


Функция формирует файл и возвращает SQL-запрос (тип varchar) для получения файла по частям.Используется при получении больших файлов, после вычитывания файла необходимо вызвать процедуру pgxls.clear_file_parts

Параметр:
xlspgxls.xls-документ

Пример использования:
return query execute pgxls.get_file_parts_query(xls);

pgxls.get_format_code_boolean


Функция формирует логический код формата (тип varchar)

Параметры:
text_truevarchar-текст для истинного значения (необязательный)
text_falsevarchar-текст для ложного значения (необязательный)
text_nullvarchar-текст для неопределенного значения (необязательный)

Примеры использования:
format1 := pgxls.get_format_code_boolean('Yes', 'No', 'Null');
format2 := pgxls.get_format_code_boolean(text_true=>'1');

pgxls.get_format_code_numeric


Функция формирует логический код формата (тип varchar)

Параметры:
decimal_placesint-кол-во знаков после запятой
thousands_separatedboolean-разделение тысяч (необязательный)

Примеры использования:
format1 := pgxls.get_format_code_numeric(3);
format2 := pgxls.get_format_code_numeric(decimal_places=>0, thousands_separated=>true);

pgxls.merge_cells


Процедура объединяет ячейки

Параметры:
xlspgxls.xls-документ
column_countint-кол-во столбцов (необязательный, по умолчанию 1)
row_countint-кол-во строк (необязательный, по умолчанию 1)
column_int-столбец, с которого начинается объединение (необязательный, по умолчанию текущий)

Примеры использования:
call pgxls.merge_cells(xls, 5);
call pgxls.merge_cells(xls, row_count=>5);
call pgxls.merge_cells(xls, 4, 4, 6);

pgxls.next_column


Процедура увеличивает текущий столбец

Параметр:
xlspgxls.xls-документ

Пример использования:
call pgxls.next_column(xls);

pgxls.page_paper_format


Тип enum, определяет формат бумаги.
Значения: A3,A4,A5

pgxls.page_orientation


Тип enum, определяет ориентацию страницы.
Значения: portrait,landscape

pgxls.pgxls_version


Функция возвращает версию инструмента

pgxls.put_cell


Процедура заполняет ячейку: устанавливает значение и позволяет менять параметры стиля, присваивает значение текущего столбца

Параметры:
xlspgxls.xls-документ
valueanyelement-значение
column_int-столбец (необязательный, по умолчанию текущий)
format_codevarchar-код формата (необязательный)
font_namevarchar-имя шрифта (необязательный)
font_sizeint-размер шрифта (необязательный)
font_boldboolean-жирный шрифт (необязательный)
font_italicboolean-шрифт курсивом (необязательный)
font_underlineboolean-подчеркнутый шрифт (необязательный)
font_strikeboolean-зачеркнутый шрифт (необязательный)
font_colorvarchar(6)-цвет шрифта в формате 'RRGGBB' или 'auto' (необязательный)
border_aroundpgxls.border_line-граница всех сторон (необязательный)
border_leftpgxls.border_line-граница слева (необязательный)
border_toppgxls.border_line-граница сверху (необязательный)
border_rightpgxls.border_line-граница справа (необязательный)
border_bottompgxls.border_line-граница снизу (необязательный)
fill_foreground_colorvarchar(6)-цвет заливки в формате 'RRGGBB' или 'none' (необязательный)
alignment_horizontalpgxls.alignment_horizontal-выравнивание по горизонтали (необязательный)
alignment_indentint-отступ при выравнивании (необязательный)
alignment_verticalpgxls.alignment_vertical-выравнивание по вертикали (необязательный)
alignment_text_wrapboolean-перенос текста при выравнивании (необязательный)

Примеры использования:
call pgxls.put_cell(xls, 123);
call pgxls.put_cell(xls, now(), 2, format_code=>'dd.mm.yyyy hh:mm');
call pgxls.put_cell(xls, 'Hello'::text, font_size=>10, font_bold=>true, fill_foreground_color=>'AA00AA');
call pgxls.put_cell(xls, true, border_around=>'thin', alignment_horizontal=>'left', alignment_indent=>2);

pgxls.put_cell_[type]


Процедура устанавливет значение ячейки, присваивает значение текущего столбца.

Используется при создании больших документов, т.к. не требуется проверка типа и изменение стиля. В остальных случая рекомендуется использовать pgxls.put_cell

Параметры:
type-тип данных: text,integer,numeric,date,time,timestamp,boolean
xlspgxls.xls-документ
value[type]-значение
column_int-столбец (необязательный, по умолчанию текущий)

Примеры использования:
call pgxls.put_cell_integer(xls, 123);
call pgxls.put_cell_numeric(xls, 123.4567, 2);
call pgxls.put_cell_text(xls, 'Hello');
call pgxls.put_cell_boolean(xls, false, column_=>4);

pgxls.save_file


Процедура сохраняет документ в файл на сервере, выполняется под суперпользователем (необходимы права на выполнение lo_export)

Параметры:
xlspgxls.xls-документ
filepathvarchar-абсолютный путь к файлу

Примеры использования:
call pgxls.save_file(xls, '/tmp/myreport.xlsx'); 
call pgxls.save_file(xls, 'C:\Reports\report1.xlsx'); 

pgxls.save_file_by_query


Процедура создает документ по SQL-запросу и сохраняет его в файл на сервере, выполняется под суперпользователем (необходимы права на выполнение lo_export)

Параметры:
filepathvarchar-абсолютный путь к файлу
querytext-SQL-запрос

Примеры использования:
call pgxls.save_file_by_query('/tmp/pg_class.xlsx', 'select * from pg_class'); 
call pgxls.save_file_by_query('C:\Reports\customers.xlsx', 'select name,code,is_vip,amount from customers order by name'); 

pgxls.set_all_format


Процедура устанавливает формат ячеек для всех столбцов и всех типов данных

Параметры:
xlspgxls.xls-документ
column_int-столбец (необязательный, по умолчанию текущий)
font_namevarchar-имя шрифта (необязательный)
font_sizeint-размер шрифта (необязательный)
font_boldboolean-жирный шрифт (необязательный)
font_colorvarchar(6)-цвет шрифта в формате 'RRGGBB' или 'auto' (необязательный)
borderpgxls.border_line-граница всех сторон (необязательный)
fill_foreground_colorvarchar(6)-цвет заливки в формате 'RRGGBB' или 'none' (необязательный)
alignment_horizontalpgxls.alignment_horizontal-выравнивание по горизонтали (необязательный)
alignment_verticalpgxls.alignment_vertical-выравнивание по вертикали (необязательный)
alignment_text_wrapboolean-перенос текста при выравнивании (необязательный)

Примеры использования:
call pgxls.set_all_format(xls, font_size=>10, font_bold=>true, fill_foreground_color=>pgxls.color$light_green());
call pgxls.set_all_format(xls, border=>'thin', alignment_horizontal=>'center');

pgxls.set_column_current


Процедура устанавливет текущий столбец

Параметры:
xlspgxls.xls-документ
column_int-столбец

Пример использования:
call pgxls.set_column_current(xls, 5);

pgxls.set_column_format_[type]


Процедура устанавливет формат ячеек столбца в зависимости от типа данных.
Если тип данных не указан (процедура pgxls.set_column_format), то формат устанавливается для всех типов

Параметры:
type-тип данных: text,integer,numeric,date,time,timestamp,boolean
xlspgxls.xls-документ
column_int-столбец (необязательный, по умолчанию текущий)
format_codevarchar-код формата (необязательный, только для процедур с типом)
font_namevarchar-имя шрифта (необязательный)
font_sizeint-размер шрифта (необязательный)
font_boldboolean-жирный шрифт (необязательный)
font_italicboolean-шрифт курсивом (необязательный)
font_underlineboolean-подчеркнутый шрифт (необязательный)
font_strikeboolean-зачеркнутый шрифт (необязательный)
font_colorvarchar(6)-цвет шрифта в формате 'RRGGBB' или 'auto' (необязательный)
border_aroundpgxls.border_line-граница всех сторон (необязательный)
border_leftpgxls.border_line-граница слева (необязательный)
border_toppgxls.border_line-граница сверху (необязательный)
border_rightpgxls.border_line-граница справа (необязательный)
border_bottompgxls.border_line-граница снизу (необязательный)
fill_foreground_colorvarchar(6)-цвет заливки в формате 'RRGGBB' или 'none' (необязательный)
alignment_horizontalpgxls.alignment_horizontal-выравнивание по горизонтали (необязательный)
alignment_indentint-отступ при выравнивании (необязательный)
alignment_verticalpgxls.alignment_vertical-выравнивание по вертикали (необязательный)
alignment_text_wrapboolean-перенос текста при выравнивании (необязательный)

Примеры использования:
call pgxls.set_column_format_numeric(xls, font_size=>10, font_bold=>true, fill_foreground_color=>pgxls.color$light_green());
call pgxls.set_column_format(xls, border_around=>'thin', alignment_horizontal=>'center');

call pgxls.set_column_format_numeric  (xls, 10, format_code=>'0.000');
call pgxls.set_column_format_timestamp(xls, 11, format_code=>'dd.mm.yyyy hh:mm');

call pgxls.set_column_format_integer(xls, 10, format_code=>pgxls.get_format_code_numeric(decimal_places=>0, thousands_separated=>true));
call pgxls.set_column_format_boolean(xls, 11, format_code=>pgxls.get_format_code_boolean('Yes', 'No', 'Null'));

pgxls.set_page_paper


Процедура устанавливет параметры бумаги: формат и ориентацию

Параметры:
xlspgxls.xls-документ
formatpgxls.page_paper_format-формат (необязательный)
orientationpgxls.page_orientation-ориентация (необязательный)

Примеры использования:
call pgxls.set_page_paper(xls, 'A3', 'portrait');
call pgxls.set_page_paper(xls, orientation=>'landscape'); 

pgxls.set_page_header


Процедура устанавливет заголовок страницы

Параметры:
xlspgxls.xls-документ
header text-текст заголовка, значение null удаляет заголовок
alignmentpgxls.alignment_horizontal-расположение по горизонтали: left,center,right (необязательный, по умолчанию right)
font_namevarchar-имя шрифта (необязательный, по умолчанию Arial)
font_sizeint-размер шрифта (необязательный, по умолчанию 6)

Примеры использования:
call pgxls.set_page_header(xls, 'MyReport, page &P of &N', alignment=>'center', font_size=>12);
call pgxls.set_page_header(xls, null); 

pgxls.set_page_margins


Процедура устанавливет отступы страницы

Параметры:
xlspgxls.xls-документ
left_numeric-отступ слева (необязательный)
topnumeric-отступ сверху (необязательный)
right_numeric-отступ справа (необязательный)
bottomnumeric-отступ снизу (необязательный)

Примеры использования:
call pgxls.set_page_margins(xls, 0.15, 0.2, 0.15, 0.4);
call pgxls.set_page_margins(xls, bottom=>2); 

pgxls.set_page_rows_repeat


Процедура устанавливет строки, повторяющиеся на каждой странице

Параметры:
xlspgxls.xls-документ
row_fromint-номер начальной строки, значение null отменяет повторение строк
row_toint-номер конечной строки (необязательный, по умолчанию row_from)

Примеры использования:
call pgxls.set_page_rows_repeat(xls, 1);
call pgxls.set_page_rows_repeat(xls, 3, 5); 

pgxls.set_row_height


Процедура устанавливет высоту текущей строки

Параметры:
xlspgxls.xls-документ
heightint-высота

Пример использования:
call pgxls.set_row_height(xls, 20);

pgxls.xls


Составной тип, содержит информацию по документу