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


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

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

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

Процедуры pgxls.format_cell и pgxls.format_row изменяют форматирование текущей ячейки и строки соответственно.

Для удобства использования определяется текущий столбец, который сбрасывается при добавлении строки и увеличивается при установке значения поля без указания столбца. При установке значения ячейки с указанием столбца текущий столбец переопределяется на указанный. При помощи процедур 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.put_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 !~ '^[\w]+.xlsx$' then
    raise exception 'Invalid file name';   
  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();


Примеры


Быстрый старт (простой пример)


-- 1. Создаем и получаем файл(bytea) по SQL-запросу
select pgxls.get_file_by_query('select * from pg_tables');

-- 2. Сохраняем Excel-файл на сервере по SQL-запросу
call pgxls.save_file_by_query('/tmp/top_relations_by_size.xlsx', 'select oid,relname,pg_relation_size(oid) from pg_class order by 3 desc limit 10');

-- 3. Создаем функцию, возвращающую файл(bytea)
create or replace function excel_top_relations_by_size() returns bytea language plpgsql as $$
declare 
  rec record;
  xls pgxls.xls; 
begin
  -- Создаем документ, в параметрах указываем ширины и заголовки столбцов      
  xls := pgxls.create(array[10,80,15], array['oid','Name','Size, bytes']);
  -- В цикле выбираем данные по запросу
  for rec in
    select oid,relname,pg_relation_size(oid) size from pg_class order by 3 desc limit 10    
  loop
    -- Добавляем строку
    call pgxls.add_row(xls);
    -- В ячейки устанавливаем данные из запроса
    call pgxls.put_cell(xls, rec.oid);      
    call pgxls.put_cell(xls, rec.relname);   
    call pgxls.put_cell(xls, rec.size);
  end loop;  
  -- Возвращаем файл(bytea)
  return pgxls.get_file(xls);      
end
$$;
-- Получаем файл
select excel_top_relations_by_size();

Форматирование различными способами, настройка печати


-- Create function that returns file
create or replace function example.excel_format_and_page() returns bytea language plpgsql as $$
declare 
  xls pgxls.xls; 
begin
  -- Create excel document without sheet 
  xls := pgxls.create();
  -- Add the first required sheet named "Styles" with one column of 30 characters wide
  call pgxls.add_sheet(xls, array[30], name=>'Styles');
  -- Set value and style of cell through universal procedure
  call pgxls.put_cell(xls, 'Example full'::text, font_name=>'Times New Roman', font_size=>24, font_color=>'FF0000');
  -- Set value and style of cell through base procedures
  call pgxls.add_row(xls, 2);
  call pgxls.put_cell_timestamp(xls, now()::timestamp);
  call pgxls.format_cell(xls, border_around=>'thin');
  --
  call pgxls.add_row(xls, 2);
  call pgxls.put_cell_integer(xls, 123);  
  call pgxls.format_cell(xls, alignment_horizontal=>'left');
  --
  call pgxls.add_row(xls, 2);
  call pgxls.put_cell_numeric(xls, 1234567.89);  
  call pgxls.format_cell(xls, format_code=>pgxls.get_format_code_numeric(3, true), font_name=>pgxls.font_name$monospace(), font_bold=>true);  
  --------------------------------------------------------------------------------------------------------------------------------
  -- Add sheet named "Columns"
  call pgxls.add_sheet(xls, array[10,15,50], array['x','x/3','md5(x)'], 'Columns');
  -- Set format of column for numeric type 
  call pgxls.set_column_format_numeric(xls, 2, format_code=>'0.0000', font_name=>pgxls.font_name$sans_serif());
  -- Set alignment of column for all types
  call pgxls.set_column_format(xls, 3, alignment_horizontal=>'center');
  -- Set cell values, style defined by column and data type
  for x in 1..10 loop
    call pgxls.add_row(xls);
    call pgxls.put_cell(xls, x);
    call pgxls.put_cell(xls, x/3.0);
    call pgxls.put_cell(xls, md5(x::text));
  end loop;
  --------------------------------------------------------------------------------------------------------------------------------
  -- Add sheet with merged cells
  call pgxls.add_sheet(xls, array_fill(10, array[10]), null, 'Merge cells');
  for row in 1..10 loop
    call pgxls.add_row(xls);
    for col in 1..10 loop      
      call pgxls.put_cell(xls, row||','||col);
      if row=2 and col=2 then call pgxls.merge_cells(xls, 5/*column_count*/); call pgxls.format_cell(xls, fill_foreground_color=>pgxls.color$light_red());   end if;
      if row=4 and col=4 then call pgxls.merge_cells(xls, row_count=>5);      call pgxls.format_cell(xls, fill_foreground_color=>pgxls.color$light_green()); end if;
    end loop;    
    if row=6 then call pgxls.merge_cells(xls, 4, 4, 6); call pgxls.format_cell(xls, fill_foreground_color=>pgxls.color$light_blue(), column_=>6); end if;
  end loop;
  --------------------------------------------------------------------------------------------------------------------------------
  -- Add sheet with wrap text
  call pgxls.add_sheet(xls, array[40,30], name=>'Wrap text');
  call pgxls.set_column_format(xls, 1, alignment_horizontal=>'justify', alignment_text_wrap=>true);
  call pgxls.set_column_format(xls, 2, alignment_text_wrap=>true); 
  -- Text without line feed
  call pgxls.put_cell_text(xls, 'A database management system used to maintain relational databases is a relational database management system (RDBMS)');
  call pgxls.put_cell(xls, 'Row height calculated with assumptions and may be not optimal, usually line count is slightly larger'::text, font_size=>8); 
  -- Text with line feed <LF>
  call pgxls.add_row(xls,2);  
  call pgxls.put_cell_text(xls, 
    'PostgreSQL is a powerful, open source object-relational database system with over 35 years of active<LF>'|| chr(10) ||
    'development  that has earned it a strong reputation for reliability, feature robustness, and performance' 
  );
  --------------------------------------------------------------------------------------------------------------------------------
  -- Add sheet with print setup
  call pgxls.add_sheet(xls, array[10,15,10,60], name=>'Print setup');
  call pgxls.set_page_paper(xls, format=>'A5', orientation=>'landscape');
  call pgxls.set_page_header(xls, 'Example / sheet "Print setup" page &P of &N');
  call pgxls.set_page_rows_repeat(xls, 3); -- table header on each page  
  call pgxls.put_cell(xls, 'Use "Print preview"'::text, font_size=>20, alignment_horizontal=>'center');
  call pgxls.merge_cells(xls, 4);
  call pgxls.add_row(xls);
  call pgxls.set_all_format(xls, border=>'thin');
  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');
  call pgxls.set_all_format(xls, fill_foreground_color=>pgxls.color$light_gray());
  call pgxls.set_column_format_numeric(xls, 2, format_code=>'0.0000');
  call pgxls.set_column_format(xls, 4, alignment_horizontal=>'center');
  for x in 1..100 loop
    call pgxls.add_row(xls);
    call pgxls.put_cell(xls, x);
    call pgxls.put_cell(xls, sqrt(x)::numeric);
    call pgxls.put_cell(xls, x*x);
    call pgxls.put_cell(xls, md5(x::text));
  end loop;
  --------------------------------------------------------------------------------------------------------------------------------
  -- Return file  
  return pgxls.get_file(xls);      
end
$$;

-- Get file
select example.excel_format_and_page();

Вывод таблицы и данных SQL-запроса


-- Create function that returns file
create or replace function example.excel_table_and_query() returns bytea language plpgsql as $$
declare 
  xls pgxls.xls;
  rec record; 
begin
  -- Create excel document
  xls := pgxls.create();
  -- Add sheet by query
  call pgxls.add_sheet_by_query(xls, 'select * from pg_class order by 1', 'pg_class table');
  -- Formatting rows and cells is not possible because the data has already been output
  -- It is only possible to customize the current page.
  call pgxls.set_page_paper(xls, format=>'A5', orientation=>'landscape');  
  --------------------------------------------------------------------------------------------------------------------------------
  -- Add sheet 
  call pgxls.add_sheet(xls, array[10,15,50,15], array['OID','Schema','Table name','Owner'], 'Columns');
  --  Set format for new rows, current row with header not changed
  call pgxls.set_column_format_numeric(xls, 1, format_code=>pgxls.get_format_code_numeric(decimal_places=>0, thousands_separated=>true));
  call pgxls.set_column_format_numeric(xls, 4, font_size=>10);
  for rec in
      select oid,relnamespace::regnamespace as schema,
             relname                        as table_name,
             relowner::regrole::name       as owner
        from pg_class
        where relkind = 'r'
        order by 2,3    
  loop
    -- Add row
    call pgxls.add_row(xls);
    -- Set data from record into cells
    call pgxls.put_cell(xls, rec.oid);      
    call pgxls.put_cell(xls, rec.schema);   
    call pgxls.put_cell(xls, rec.table_name);
    call pgxls.put_cell(xls, rec.owner);
    --
    if rec.owner=current_user then
      call pgxls.format_row(xls, font_size=>12, font_bold=>true);
    end if;
  end loop;  
  -- Returns file (bytea type)
  return pgxls.get_file(xls);      
end
$$;
  
-- Get file
select example.excel_table_and_query();

Создание и получение файла большого размера


-- Create function that returns large file by parts
create or replace function excel_large_file() returns setof bytea language plpgsql as $$
declare 
  xls pgxls.xls; 
  v_value bigint;
begin
  xls := pgxls.create(array[80]);
  call pgxls.put_cell(xls, 'Large file'::text, font_bold=>true, font_size=>32, alignment_horizontal=>'center');
  call pgxls.add_row(xls);
  call pgxls.add_row(xls);
  call pgxls.put_cell(xls, '10 sheets * 4 columns * 100K rows = 40M cells'::text);
  for v_sheet in 1..10 loop
    call pgxls.add_sheet(xls, array[10,10,10,50], array['Sheet','Row','Value','md5'], v_sheet::text);
    call pgxls.set_column_format(xls, 4, font_name=>pgxls.font_name$monospace());
    for v_row in 1..100000 loop          
      v_value := v_sheet*v_row;
      call pgxls.add_row(xls);
      call pgxls.put_cell_integer(xls, v_sheet);     
      call pgxls.put_cell_integer(xls, v_row);      
      call pgxls.put_cell_integer(xls, v_value);
      call pgxls.put_cell_text(xls, md5(v_value::text));     
    end loop;
  end loop;
  return query execute pgxls.get_file_parts_query(xls);
  call pgxls.clear_file_parts(xls);
end
$$;

-- Get large file by parts
-- Each row is a bytea that must be read separately to avoid OutOfMemory error on the client 
-- Example, psql -Aqt -c "select excel_large_file()" | xxd -r -ps > excel_large_file.xlsx
select excel_large_file();




Документ и листы


pgxls.create



Функция создает, инициализирует и возвращает документ (тип pgxls.xls).
Если параметр columns_widths не задан, документ создается без листа и первый лист необходимо добавить вручную.
Если задан параметр columns_captions, то на лист добавляется строка с заголовками столбцов и к ней можно применить процедуру форматирования pgxls.format_row

Параметры
НаименованиеТипОписаниеОбязательныйПо умолчанию
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');
  call pgxls.format_row(xls, font_size=>10, fill_foreground_color=>pgxls.color$light_blue());

  xls := pgxls.create();
  call pgxls.add_sheet_by_query(xls, 'select * from pg_roles', 'Roles');

  ...

pgxls.add_sheet



Процедура добавляет новый лист в документ.
Если задан параметр columns_captions, то на лист добавляется строка с заголовками столбцов и к ней можно применить процедуру форматирования pgxls.format_row

Параметры
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент
columns_widthsint[]ширины столбцов
columns_captionstext[]заголовки столбцов
namevarcharимя листа

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

pgxls.add_sheet_by_query



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

Параметры
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент
querytextSQL-запрос
namevarcharимя листа

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

pgxls.get_file



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

Параметр
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент

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

pgxls.get_file_parts_query



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

Параметр
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент

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

pgxls.clear_file_parts



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

Параметр
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент

pgxls.get_file_by_query



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

Параметр
НаименованиеТипОписаниеОбязательныйПо умолчанию
querytextSQL-запрос

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

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абсолютный путь к файлу
querytextSQL-запрос

Примеры использования
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.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.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.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.set_column_current



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

Параметры
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент
column_intстолбец

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


Форматирование


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_format_[type]



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

Параметры
НаименованиеТипОписаниеОбязательныйПо умолчанию
typeтип данных:
text,integer,numeric,date,time,timestamp,boolean
xlspgxls.xlsдокумент
column_intстолбецтекущий
format_codevarcharкод формататолько для процедуры
pgxls.set_column_format
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.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.set_row_height



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

Параметры
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент
heightintвысота

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

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.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_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_header



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

Параметры
НаименованиеТипОписаниеОбязательныйПо умолчанию
xlspgxls.xlsдокумент
header textтекст заголовка, значение null удаляет заголовок
alignmentpgxls.alignment_horizontalрасположение по горизонтали: left,center,rightright
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_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.page_paper_format



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

pgxls.page_orientation



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

pgxls.alignment_horizontal



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

pgxls.alignment_vertical



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

pgxls.border_line



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

pgxls.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.get_column_name



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

Параметр
НаименованиеТипОписаниеОбязательныйПо умолчанию
column_intстолбец

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

pgxls.get_cell_height



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

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

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

pgxls.font_name$[family]



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

Параметр
НаименованиеТипОписаниеОбязательныйПо умолчанию
familyсемейство шрифта: sans,sans_serif,monospace

Примеры использования
call pgxls.format_row(xls, font_name=>pgxls.font_name$sans_serif());
call pgxls.put_cell(xls, 123, font_name=>pgxls.font_name$monospace());

pgxls.color$[name]



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

Параметр
НаименованиеТипОписаниеОбязательныйПо умолчанию
nameназвание цвета:
light_red,light_green,light_blue,light_gray,dark_red,dark_green,dark_blue,dark_gray

Примеры использования
call pgxls.format_cell(xls, font_color=>pgxls.color$dark_red(), fill_foreground_color=>pgxls.color$light_gray());
call pgxls.set_column_format(xls, 5, fill_foreground_color=>pgxls.color$light_green());

pgxls.pgxls_version



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