Afalina XL Report.

Средство достижения цели.

© 2003 Денис "Denver" Мигачёв

Глядя на всё с высоты птичьего полёта. При создании программных продуктов, которые предоставляют пользователю некую отчётную информацию, всегда встаёт вопрос – какой генератор отчётов использовать? Принятие решения зависит от сложности программы, от её направленности, от круга задач, ей решаемых. В каком-то случае достаточно будет QuickReport, кто-то обратиться к более серьёзному FastReport, а разработчики на Visual Studio наверняка предпочтут Crystal Reports. В конце концов, есть возможность самим разработать и написать генератор отчётов для конкретных целей.

Но все эти генераторы отчётов формируют документы в своих собственных форматах. Доступ извне к таким файлам труден или невозможен в принципе. Конечно, экспортирование в другие, более распространённые и популярные форматы, поддерживаются серьёзными разработками, такими, как FastReport. Но это, скорее, вынужденная мера. Так, работая с FastReport и получая в нём все отчёты, вам, допустим, ещё необходимо преобразовывать некоторые из них в формат MS Excel. Более того, часто данные, передаваемые в отчёт, остаются неизменными по структуре, а внешний вид документов может динамично меняться во времени. Следовательно, требуется решение, которое позволяет самому пользователю менять структуру документа при одинаковом наборе данных. Или, по крайней мере, это решение даёт достаточно свобод пользователю при формировании внешнего вида отчёта с неизменным набором данных. Следует учитывать, что доступ к документам должен быть и после формирования отчётов, на случай необходимости "что-то там подправить или изменить". И фактор пользователя, привыкшего в виду окон MS Office, и наотрез отказывающегося воспринимать что либо новое, также необходимо учитывать. Отношение к новым форматам и к непривычному внешнему виду вызывает недовольство и недоумение у заказчика, и это давно известно разработчикам.

Ну да хватит о грустном, лучше поговорить собственно о Afalina XL Report, ради чего и было такое большое лирическое отступление. XL Report свои отчеты строит в MS Excel. Поэтому часто здесь будут описываться очевидные решения для подготовленных пользователей Excel, но совсем не очевидные для Delphi-разработчиков, привыкших создавать свои отчеты с помощью стандартных средств. Так уж сложилось, что не каждый разработчик имеет представление о тех возможностях, которые заложены в эту мощную программу.

Для начала скачиваем демо-версию, которая находится по адресу http://www.afalinasoft.com/rus/download-xl-report.html в размере примерно 6.5 Мб. Инструкции по установке содержатся в файле readme.txt из установочного комплекта XL Report. Обязательно ознакомьтесь с содержимым этого файла, равно как и со всеми текстовыми файлами из поставки XL Report. Также перед работой в программе Excel 2000 необходимо включить доверительный доступ к VB-проектам. Это можно сделать в меню "Сервис /Макрос /Безопасность" на закладке "Надёжные источники". Четвёртая версия пакета, а именно такая была доступна для загрузки и ознакомления, может работать с тремя версиями MS Excel – от 97 SR2 до 2002.

В этой версии разработчики многое основательно переделали. По-прежнему в палитре компонентов XL Report будет представлен всего одним компонентом. Но изнутри XL Report значительно изменился и теперь представляет собой иерархию классов, позволяющую создавать несколько уровней абстракций. Разработчику и конечному пользователю это даёт множество преимуществ. Основываясь на абстрактных классах, на которых построен XL Report, строится описание опций шаблона и их обработка. Допускается перегрузка существующих опций, расширение её возможностей или даже их полное переопределение. Такой класс, содержащий все необходимые настройки и помещённый на форму приложения, автоматически регистрирует свои опции, что позволит использовать их в шаблонах вместе со своими опциями. В рамках этой технологии все без исключения опции шаблонов представлены отдельными классами. Классы собраны в один пакет стандартных опций, который устанавливается вместе с XL Report.

Как и все современные генераторы отчётов, XL Report поддерживает неограниченную вложенность наборов данных Master-Detail, связанных связью "один-ко-многим". Для этого в шаблоне создаётся область главного и область подчинённого наборов данных и область подчинённого "вкладывается" в область главного. А в элементе DataSources указывается значение свойства MasterSource. Глубина вложенности таких построений может быть неограниченной, требования к дизайну областей – минимальны.

Возможность создавать композитные отчёты позволяет эффективно управлять процессом создания отчётов по сложно структурированным данным любых приложений.

А что внутри? XL Report - это набор Delphi–компонент для построения отчётов в MS Excel с использованием технологии OLE Automation. Разработчикам удалось найти алгоритм быстрой передачи больших объёмов данных в книги Excel, поэтому использование OLE совершенно не отражается на производительности. Пакет работает на раннем связывании и использует только Native-типы данных, что также положительно отзывается на времени генерации документов.

Для того, чтобы эффективно использовать XL Report, требуется разделить задачи между приложениями. Пусть мы будем считать, что MS Excel является частью нашего приложения. Хотя это и громкое заявление, никто не будет пытаться писать код для "прямых" транзакций на VBA. Однако, как средство построения отчётов, средство для анализа данных, Excel подходит как нельзя лучше. А с помощью VBA отчёты можно заставить интерактивно реагировать на действия пользователя. В свою очередь, XL Report будем расценивать как средство, которое предоставляет нам массив данных для дальнейшей их обработки в Excel. Именно там мы получим максимум интерактивных визуальных инструментов для отображения информации из базы данных, ActiveX-элементы, средства публикации в Internet, фильтры и сводные таблицы. Такая система анализа данных будет доступна и открыта для последующих изменений. Максимальное количество настроек и программирования перенесены из XL Report в Excel, шаблоны упрощены, алгоритм построения ускорен и если вы владеете такой программой, как MS Excel, XL Report значительно облегчит вам жизнь и сэкономит массу времени.

И ещё. XL Report не является band-ориентированным. Такие понятия, как Footer, Header, Detail, тут отсутствуют. В этом плане разработчику предоставлена полная свобода. XL Report работает со всеми потомками TDataSet. Он одинаково хорошо будет функционировать с наборами данных BDE, ODBC, FIBPlus, IBX.

Компоненты XL Report позволяют строить отчёты по одному или нескольким наборам данных или их потомков. В основе XL Report лежит компонентный класс TxlReport, инкапсулирующий необходимые методы и свойства для доступа к одной книге Excel посредством OLE и передачи в неё данных. Вся работа построена на шаблонах (XLS-файлах) – книгах Excel, содержащих описание формы отчёта, опции книги, листов и областей отчёта. Специальные формулы полей и области данных описывают данные в структуре отчёта, которые необходимо передать в Excel. XL Report сам вызовет отчёт, заполнит ячейки данными из указанных наборов и "покажет" Excel. Опубликованные свойства XL Report позволяют сделать процесс построения отчётов максимально простым.

А пример? Все примеры, приведённые в статье, взяты из одного демонстрационного проекта – QDemo.dpr. Проект содержит формы-примеры соответственно темам по построению отчётов. Каждый из проектов демонстрирует решение какой либо конкретной задачи. Почти каждая форма содержит блок комментариев, в котором описаны тонкости шаблона отчёта. Необходимо учитывать, что данные примеры приведены только для того, чтобы сохранить простоту и ясность примеров этого проекта. Сложный код, нестандартные приёмы программирования и громоздкие компоненты не использовались.

Многие простейшие первичные документы представлены всего двумя таблицами с отношением "один-ко-многим". Для этого примера добавим форму FrmQuickStart в проект QDemo.dpr (рис. 1). Поместим на форму также по два экземпляра TDataSource и TTable и соединим их с таблицами Customer.db и Orders.db из стандартной поставки DBDemos. Присвоим компонентам таблиц и источникам данных соответствующие имена и свяжем их связью "один-ко-многим". Для того, чтобы видеть, по каким данным будет сформирован отчёт, добавим на форму ещё два DBNavigator`а и несколько полей редактирования TDBEdit для таблицы "Клиенты" и навигатор и сетку TDBGrid для таблицы "Счета". Также рядом с навигатором для таблицы Customers.db мы разместили две кнопки TSpeedButton, с помощью которых станет возможно построить отчет или отредактировать его шаблон. Мы изменили свойство Caption у этих кнопок на, соответственно, "Report" и "Template". Проделав все это и сделав активными Active:=true оба набора данных, мы полностью подготовились к созданию отчета.

XL Report добавляет в палитру компонентов Delphi один не визуальный компонент – TxlReport (TxlReportG2 оставлен для совместимости с предыдущей версией XL Report, поэтому его рассматривать не будем). Для создания отчета мы добавили на форму один экземпляр этого компонентного класса и назвали его xlReport. Так как практически вся работа по созданию отчета сводится к проектированию шаблона, нам необходимо создать этот шаблон. Для этого нажатием правой кнопки мыши вызовем на компоненте xlReport контекстное меню и выберем пункт "Edit template…" (можно просто дважды щелкнуть мышью на этом компоненте). Редактором компонента для TxlReport является Microsoft Excel. Поэтому в результате этого действия произойдет вызов Excel и добавление в него пустой книги. Эту книгу мы и будем использовать как шаблон будущего отчета.

Добавление новой книги в Excel вызвано тем, что свойство XLSTemplate не заполнено. В этом свойстве указывают имя и путь к книге Excel, которая используется в качестве шаблона. Если имя книги-шаблона указано, то по вызову "Edit template…" будет открыта именно эта книга. Разрешено опускать путь к книге-шаблону. В таком случае подразумевается, что во время редактирования проекта шаблон расположен в пути проекта (там, где находится файл проекта - .dpr). Допустимо использование и относительного пути ("..\Templates"). Создадим шаблон отчета, который отобразит текущую видимую запись из "мастер-таблицы" Customer и все подчиненные ей записи из таблицы Orders. Для вывода полей из Customers в любые ячейки текущего листа напишем формулы вида "=Alias_FieldName", где Alias – Customers, а FieldName – любое поле из этой таблицы. В нашем примере мы использовали поля CustNo, Company, Add1, Addr2, City, State, Country, Phone, Fax, Zip и Contact. Не стоит обращать внимание на значения ячеек (#NAME?), в которые записаны формулы полей. Excel просто не находит ячеек с такими именами в шаблоне.

Но это только пока. В шаблонах отчетов можно применять различное форматирование ко всем ячейкам книги, вставлять рисунки и изменять параметры самой книги. В этом примере мы отключили у книги показ нулевых значений и сетку, а также отформатировали страницу для печати. Вы должны быть уверены в том, что XL Report сохранит при построении отчета все изменения в шаблоне, сделанные вами.

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

Из рисунка видно, что столбцы D и E являются скрытыми, но мы всё равно вписали в них формулы полей. Это было сделано потому, что мы хотим разместить в ячейках G полный адрес отгрузки, который, и состоит из этих двух полей.

Используя XL Report, вы можете применять и обыкновенные формулы Excel. Чтобы показать это, мы поместили в ячейку G стандартную формулу Excel по объединению строк – =""&D15&" "&E15. Из формулы видно, что полученное значение будет объединением скрытых ячеек столбцов D и E. Чтобы ещё раз показать применение формул Excel, используем полей SpecialTax, которое всегда меньше стандартного TaxRate на величину значения ячейки L4. Для этого в ячейку J14 была вписана формула =I13-L$4.

Итак, на текущий момент мы имеем шаблон отчёта, в котором закреплена область прокрутки за шапкой таблицы, применено различное форматирование ячеек, которое придаст отчёту более удобный вид. В качестве примера можно выделить цветом те записи, оплата по которым произведена картой Visa. Ячейку G13, содержащую метод оплаты, условно отформатируем так: =$G13="Visa". Для таких счетов это поле будет выделено другим цветом шрифта. Этот же прием мы использовали и для ячейки SpecialTax. Мы создали для нее условное форматирование, в результате которого все отрицательные значения будут выделены красным. Сейчас необходимо сообщить XL Report о существовании области, в которую необходимо поместить записи о счетах заказчика. Для этого выделим прямоугольную область "A13:L16" и поименуем ее, используя для этого поле редактирования с выпадающим списком, расположенное левее строки формул. Мы использовали в качестве имени OrdersRange (см.рис. 2).

Эта область включает на один столбец слева и одну строку снизу больше, нежели необходимо. Эти ячейки используются в XL Report для описания дополнительных действий, которые могут быть произведены над областью с данными. В текущем же примере мы оставили их пустыми.

Почему A13:L16? Вы, наверняка, заметили, что в именованную область OrdersRange не был включен заголовок таблицы. Дело в том, что в XL Report, область описывает формат вывода каждой записи связанного с этой областью набора данных. Все строки этой области, кроме нижней служебной, будут размножены столько раз, сколько записей в этом наборе.

После формирования шаблона сохраняем книгу в каталоге проекта или в любом другом пути. Для полученной книги мы использовали имя "tQuickStart.xls" и сохранили ее в каталог проекта. После сохранения закроем Excel и вернемся в среду Delphi к проектируемой форме. Для того чтобы связать компонент xlReport с шаблоном, необходимо указать имя и путь этого файла в свойстве XLSTemplate компонента. Хотя, его можно и не указывать в том случае, если вы сохранили его в каталоге проекта. В общем же случае, имени файла достаточно только при следующих условиях: для design-time – шаблон должен находиться в каталоге проекта, для run-time – шаблон должен находиться в каталоге запуска приложения. Чтобы полностью завершить разработку отчета, мы должны как-то связать компонент xlReport с наборами данных, используемыми в отчете. Это делается при помощи свойства-коллекции компонента DataSources. Каждый элемент этой коллекции позволяет добавить в отчет один набор данных. Добавляем в эту коллекцию два элемента, указав в свойстве DataSet одного из них набор данных Customers, а в этом же свойстве другого – Orders. В последнем случае нам придется еще изменить свойство Range элемента коллекции на "OrdersRange" – имя области, в которую должны быть выведены счета текущего заказчика (см. рис. 3).

Необходимо заметить также, что при выборе набора данных свойство Alias, используемое в формулах полей шаблона, автоматически принимает значение свойства Name выбранного набора TDataSet.

Теперь, если вы точно следовали инструкциям, то нажатие пункта контекстного меню xlReport вызовет создание отчёта. Не покидая среды разработки, у нас получилось создать шаблон отчёта и незамедлительно посмотреть результат его работы. Чтобы вызвать отчёт во время выполнения программы, напишем обработчик события для кнопки "Report…", который состоит всего из одной строки кода:

procedure TfrmQuickStart.btnReportClick(Sender: TObject);
begin
  xlReport.Report;
end;

А для того, чтобы была возможность редактировать шаблон в процессе выполнения программы, добавим следующий обработчик для кнопки "Template":

procedure TfrmQuickStart.btnTemplateClick(Sender: TObject); begin   xlReport.Edit; end;

Послесловие. В XL Report вы можете управлять загрузкой Excel. В свойстве Options компонента xlReport есть флаги xroOptimizeLaunch и xroNewInstance которого позволяют изменить стандартное поведение XL Report при работе с Excel. Включив опцию xroNewInstance, вы заставите XL Report использовать отдельный экземпляр Excel. Отключив xroOptimizeLaunch, вы сообщите XL Report о необходимости освобождать все интерфейсы Excel сразу после построения очередного отчета. "Освободить интерфейсы "в данном случае не значит "выгрузить процесс Excel". Excel всегда закрывается пользователем самостоятельно, но от состояния xroOptimizeLaunch зависит, будет ли тогда выгружен процесс Excel. В XL Report добавлена также возможность принудительного освобождения всех интерфейсов Excel независимо от установок опции xroOptimizeLaunch. Используйте для этого метод класса TxlReport.ReleaseExcelApplication, доступный из модуля xlReport.

Copyright© 2003 Денис "Denver" Мигачёв  Специально для Delphi Plus

2011123456789101112
2010123456789101112
2009123456789101112
2008123456789101112
2007123456789101112
2006123456789101112
2005123456789101112
2004123456789101112
2003123456789101112
2002123456789101112
2001123456789101112
2000123456789101112
1999123456789101112

Последние статьи
Литература