Delphi — компонент для вывода отчетов в Excel

Пример размещения Delphi компонента

A7rexcel это компонент формирования отчетов в Excel для Delphi 7Delphi XE2 (Embarcadero RAD Studio XE2). Компонент полностью бесплатен и свободен для использования где угодно и как угодно, единственная просьба — ссылка на этот сайт при упоминании этого компонента на просторах интернета.

Зачастую отчетные системы предназначены для выдачи результата сразу на печать с предпросмотром, и возможность сохранения в Excel это лишь опция, иногда работающая так, что сохраненный файл выходит не очень похожим на оригинал, и   представляет собой нагромождение объединенных ячеек, а иногда еще и с неправильным форматом данных. Для того чтобы избежать этих неприятностей, можно использовать отчетную систему, которая будет выводить информацию напрямую в Excel.

Результат работы Delphi компонентаA7rexcel  позволяет выводить информацию в Excel используя в качестве шаблона xls-файл, благодаря чему становится просто настроить внешний вид получаемого документа, ориентацию листа, поля, нумерацию, и все остальное что можно настраивать в экселевском документе.

Предлагаемый компонент настолько прост, что в его внутренностях сможет разобраться даже начинающий программист, если потребуется расширение функционала. Так же он прекрасно подходит для тех, кто просто хочет разобраться как работать из Delphi-приложения с Microsoft Excel.

Исходные коды компонента на hithub — github.com/a7in/a7rexcel

Скачать компонент и демо-проект — a7rexcel.zip

Пример простейшего отчета:

 Компонент работает со всеми версиями офиса — 2003,2007,2010,2013.

5 комментариев: Delphi — компонент для вывода отчетов в Excel

  1. Андрей говорит:

    Большое вам спасибо! Отличный компонент!

  2. User говорит:

    Отличный компонент. Просто супер. Только не сделан SetValue с сохранением форматирования в шаблоне. Потратил день на изучение вопроса, но все же сделал. Теперь, например, можно сделать ячейку вида «_#day#_»_#month#_#year#_г и после моей функции сделает так: «_11_»_08_2017_г. Конечно цифры будут подчеркнуты. Цвет, жирность, размер отдельных символов также сохраняется. Если надо, могу скинуть, также реализовал изменение окошка прогресса с полоской Gauge, только оно зависит от числа repeat-строк, которые нужно передать из программы (главная таблица отчета), Header и Footer не учитывал, главное же основная таблица у меня в отчете, там много строк обычно, их счетчик и отображается в прогрессе.

  3. cyrax1000 говорит:

    Вот полностью доделал и протестировал функцию вставки текста без потери форматирования символов в шаблоне. Пользуйтесь на здоровье.
    //Edited by cyrax1000, 2017-08-11
    procedure TA7Rep.SetValueF(VarName: string; Value: Variant);
    var
    x, y, p: Integer;
    begin
    x:= 0;
    while x >= 0 do
    begin
    ExcelFind(VarName, x, y, xlValues);
    if x > 0 then
    begin
    TemplateSheet.Cells[y, x].Select;
    p:= Pos(VarName, TemplateSheet.Cells[y, x]);
    if p > 0 then
    if Value = Null then
    Excel.ActiveCell.Characters[Start:= p, Length:= Length(»)].Insert(Value)
    else
    Excel.ActiveCell.Characters[Start:= p, Length:= Length(VarName)].Insert(Value);
    end;
    end;
    end;

    • admin говорит:

      Огромное персональное спасибо за такую инициативу! Я тоже протестирую и добавлю чтобы все пользовались 😉

  4. cyrax1000 говорит:

    И еще одно извращение от меня, вдруг кому понадобится. Может проще есть способ. Нужно было в таблице отчета у 3 столбцов сделать объединение их ячеек между шапкой и строкой «Итого». В шаблоне в самом низу в футере под каждым нужным столбцом вписал #MERGE_1# , #MERGE_2# и #MERGE_3#. Сделал грубо перебор до 10, чтобы потом не перекомпилировать, если шаблон менять придется.
    Rep.PasteBand(‘LINE’, i, LinesCount) — это Gauge прогресса в допиленном окошке.
    А вот сам код (с генерацией таблицы):

    var cf, cl: Integer

    cf:= Rep.CurrentLine;
    for i:= 1 to SG1.RowCount-1 do
    begin
    Rep.PasteBand(‘LINE’, i, LinesCount);
    Rep.SetValue(‘#REPEAT_N_01#’, SG1.Cells[0, i]);
    Rep.SetValue(‘#REPEAT_EXPENSE_ID_01#’, SG1.Cells[100, i]);
    Rep.SetValue(‘#REPEAT_ITEM_NAME_01#’, SG1.Cells[1, i]);
    Rep.SetValue(‘#REPEAT_EDIZM_01#’, SG1.Cells[2, i]);
    Rep.SetValue(‘#REPEAT_COUNT_01#’, SG1.Cells[3, i]);
    Rep.SetValue(‘#REPEAT_COUNT_02#’, SG1.Cells[4, i]);
    Rep.SetValue(‘#REPEAT_COST_01#’, SG1.Cells[5, i]);
    Rep.SetValue(‘#REPEAT_SUM_01#’, SG1.Cells[6, i]);
    end;
    cl:= Rep.CurrentLine — 1;

    Rep.PasteBand(‘FOOT’);

    // Merge Cells >>>
    for i:= 1 to 10 do
    begin
    Rep.ExcelFind(‘#MERGE_’ + IntToStr(i) + ‘#’, x, y, xlValues);
    if (x >= 0) and (y >= 0) then
    begin
    Rep.TemplateSheet.Cells[cf, x].Resize[cl-cf+1, 1].Merge;
    Rep.SetValue(‘#MERGE_’ + IntToStr(i) + ‘#’, »);
    end;
    end;
    // Merge Cells <<<

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *