Afalina XL-Report. Средство достижения цели

Глядя на все с высоты птичьего полета. При создании программных продуктов, которые предоставляют пользователю некую отчетную информацию, всегда встает вопрос: какой генератор отчетов использовать? Принятие решения зависит от сложности программы, от ее направленности, от круга задач, ею решаемых. В каком-то случае достаточно будет 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/files/xlr4dtrial123.exe  и имеет размер примерно 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. btnTemplate Click(Sender: TObject);
begin
xlReport.Edit;
end;

Послесловие
. В XL Report вы можете управлять загрузкой Excel. В свойстве Options компонента xlReport есть флаги xroOptimizeLaunch и xroNew Instance, которые позволяют изменить стандартное поведение XL Report при работе с Excel. Включив опцию xroNewInsta-nce, вы заставите XL Report использовать отдельный экземпляр Excel. Отключив xroOpti-mizeLaunch, вы сообщите XL Report о необходимости освобождать все интерфейсы Excel сразу после построения очередного отчета. "Освободить интерфейсы" в данном случае не значит "выгрузить процесс Excel". Excel всегда закрывается пользователем самостоятельно, но от состояния xroOptimize Launch зависит, будет ли тогда выгружен процесс Excel. В XL Report добавлена также возможность принудительного освобождения всех интерфейсов Excel независимо от установок опции xroOptimizeLaunch. Используйте для этого метод класса TxlReport.ReleaseExcelAppli-cation, доступный из модуля xlReport.

Денис "Denver" Мигачев, dtm@tut.by 


Компьютерная газета. Статья была опубликована в номере 27 за 2003 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета