Delphi создание отчета в excel
Прилагается исходный код компонента ExcelView и процедуры экспорта и печати по шаблону в Excel для Delphi 2010/XE/XE2. Доступна полная версия с примерами использования.
Зачем это нужно?
Excel в современном офисе фактически стал стандартом для ввода и анализа данных, создания итоговых отчетов и презентаций. В первую очередь, благодаря наглядности подхода и простоте освоения. Создать "табличку" с нужными автоматическими расчетами, добавить промежуточные итоги по нескольким критериям и построить по этим итогам круговую диаграмму - все это можно сделать без специальной подготовки, легко и непринужденно.
Что и как экспортировать?
Предполагается, что нам нужно заполнять предварительно созданные шаблоны Excel. Под шаблонами подразумеваются обычные Excel-файлы, в которых отдельные ячейки и области обозначаются именами переменных. Туда и будут вставляться наши данные.
В шаблоне могут использоваться в качестве переменных:
- все published свойства формы-владельца
- все компоненты, принадлежащие форме-владельцу, и их published свойства
- все наборы данных (наследники TDataSet) обрабатываются специальным образом, в шаблон подставляются значения их полей
Готовые решения на основе шаблонов
Компоненты для вывода в Excel довольно легко найти в интернете, например:
Do It Yourself
Библиотеки компонентов всем хороши (кроме стоимости, конечно), но даже наличие исходных текстов не всегда спасает от возможных неприятностей. Проблема в том, что кода становится слишком много. Например, один из лучших (на мой взгляд) - FlexCelReport - это 916 Кб в 174 исходных файлах. Переносить этот проект на современные версии Delphi становится проблематично.
Таблицы и поля в шаблонах
Мы хотим еще проще. Только FieldName и ничего лишнего.
А где задается DataSet?
В первой колонке. Отведем всю колонку под служебную информацию, благо в Экселе их (колонок) и так более чем достаточно. При выводе будем эту колонку скрывать.
Еще одно допущение - если мы хотим вывести все записи из DataSet-а в виде таблицы, ставим перед его именем звездочку (*tblOrders). Без звездочки будут выводиться только значения полей текущей записи.
Свойства и компоненты в шаблонах
Для вывода в шаблоне published свойства текущей формы запишем в ячейке имя этого свойства в квадратных скобках: [Caption], [Tag]. Свойства компонентов формы записываются с именем компонента через точку: [Memo1.Lines]. Поддерживаются (пока) свойства следующих типов: Integer, Int64, String, Double, Boolean, TStrings.
Реализация
Весь код находится в файле ExcelView.pas (7 Кб). Компонент TExcelView имеет единственное published свойство TemplateFileName - это имя файла шаблона. Метод Show открывает Excel и запускает процесс экспорта.
Можно и не устанавливать компонент в палитру, а сразу выполнить процедуру
Обратите внимание на параметр Owner! Это тот компонент (форма, датамодуль), чьи свойства, компоненты, датасеты и будут экспортироваться в Excel.
Взаимодействие с Excel происходит через OLE:
Для вывода набора данных сначала формируется вариантный массив:
ArrayData := VarArrayCreate ( [ 1 , DataSet. RecordCount , 1 , FieldList. Count ] , varVariant ) ;
y := 1 ;
while not DataSet. Eof do
begin
z := 1 ;
for i := 0 to FieldList. Count - 1 do begin
if FieldList [ i ] = '' then ArrayData [ y , z ] := ''
else begin
if DataSet. FieldByName ( FieldList [ i ] ) . DataType = ftFloat then
ArrayData [ y , z ] := DataSet. FieldByName ( FieldList [ i ] ) . AsFloat
else ArrayData [ y , z ] := DataSet. FieldByName ( FieldList [ i ] ) . Value ;
end ;
inc ( z ) ;
end ;
DataSet. Next ;
inc ( y ) ;
end ;
А потом уже вставляется в нужное место:
Для вывода свойств используется модуль Rtti:
c := TRttiContext. Create ;
t := c. GetType ( cmp. ClassInfo ) ;
p := t. GetProperty ( PropName ) ;
if p <> nil then begin
IsNumeric := false ;
if p. PropertyType . ToString = 'TStrings' then PropValue := p. GetValue ( cmp ) . AsType . Text
else if p. PropertyType . ToString = 'Boolean' then PropValue := BoolToStr ( p. GetValue ( cmp ) . AsBoolean , true )
else
case p. PropertyType . TypeKind of
tkInteger ,
tkInt64 : begin
PropValue := IntToStr ( p. GetValue ( cmp ) . AsInteger ) ;
IsNumeric := true ;
end ;
tkString ,
tkUString ,
tkLString : PropValue := p. GetValue ( cmp ) . AsString ;
tkFloat : begin
PropValue := FloatToStr ( p. GetValue ( cmp ) . AsExtended ) ;
IsNumeric := true ;
end ;
else PropValue := '' ;
end ;
if IsNumeric and ( Trim ( Copy ( st , 1 , i1 - 1 ) ) = '' ) and ( Trim ( Copy ( st , i2 + 1 , length ( st ) ) ) = '' ) then
Sheet. Cells [ Row , Col ] := StrToFloat ( PropValue )
else Sheet. Cells [ Row , Col ] := Copy ( st , 1 , i1 - 1 ) + PropValue + Copy ( st , i2 + 1 , length ( st ) ) ;
end ;
c. Free ;
Ребят такая загвоздка у меня. Как с делфи с сетки грид вывести инфу в excel так что бы excel документ был уже подготовлен типо формы и выглядеть должен типо отчета. Помогите, разъясните или пощюпать дайте готовые наброски если кому не сложно и не жалко. Заранее спасибо большое за понимание
Формирование отчета из Delphi в Excel
Здравствуйте. Нужна помощь. Необходимо при нажатии BitBtn (сформировать), из компонентов Edit1.
Вывод отчета в юникоден на печать под Delphi 7
Какие генераторы отчетов можно использовать под Delphi 7, поддерживающие вывод на печать юникода и.
Вывод отчета из Delphi в Excel через ADOQuery
Ребятки, помогите пожалуйста, может я тупой просто, но нужно вывести отчет из Delphi в Excel из.
Не могу на Delphi 10.1 сделать вывод отчета из DBGRid в Excel!
Вот код, просьба знающим подсказать в решении моего вопроса, спасибо) По нажатию на кнопку BitBtn4.
Проблема. Надо что бы программа брала инфу из DBGrid и заносила в готовый шаблон в Excel, но при этом шаблон остался без изменения, а исходный файл Excel можно было сохранить куда душе захочется.
Есть какие то наброски программы найденные в интернете но как реализовать задумку я не знаю
Вот пример excel_export_in_delphi.zip
помогите сделать так что бы брала из excel шаблон шапки пример
Не совсем понятно, в чем проблема?
Поместите на форму SaveDialog, пусть пользователь выберет путь сохранения и укажет имя файла. Далее скопируйте свой шаблон по указанному пути с указанным именем и заполняйте уже этот файл из БД.
Создание отчета из таблицы Delphi в Excel
Здравствуйте. Помоги пожалуйста, у меня база данных по учету комп.техники, и мне нужно создать.
Delphi 7 вывод отчёта в word
Ребята помогите,мне надо чтобы таблица в DBGrid1 выводилась в word
Вывод данных из БД FireBird в виде Excel-отчета
В своей программе добавил возможность создание Excel-отчета, и столкнулся с такой проблемой: когда.
Вывод отчета в Excel
Подскажите, как создать запрос, который будет выводить результаты сразу в Excel?
Вывод отчета в Excel
Имеет 2 кнопки .Отчет по должникам и отчет по месяцу. Проблема такова. У меня 12 листов на них.
Здравствуйте, сразу же скажу, много тем и информации (хотя не совсем работоспособной) в интернетах, по поводу Excel отчетов в Delphi. У меня 2 вопроса, как организовать код и куда конкретно он должен вставляться(м/у какими кодовыми строками) , для авто-подбора ширины столбца ? И как обвести выводимую таблицу ?
Работа с Excel из Delphi
есть функция, которая считывает из TStringGrid в файл Excel и сохраняет. нужно, чтобы считывало.
Работа с Excel в Delphi.
Еще раз здравствуйте, уже весь день ломаю голову над такой штукой: я работаю с xlm файлом, я из.
Работа с Excel в Delphi
Нужна программа для открытия любой книги Excel в Delphi а затем редактирование книги. Если кто.
Работа с Excel (формулы) в Delphi
Добрый день! Нужна ваша помощь знатоки! ) Есть шаблон документа, я его заполняю и делаю.
Решение
Достаточно открыть MS Excel, запустить запись макроса, создать на листе обрамление для некоторой области ячеек. Затем, выполнить для какого-нибудь столбца автоподбор ширины и прервать запись макроса. После этого, в главном меню MS Excel 2003 выбираем: Сервис - Макрос. - Редактор Visual Basic - Откроется редактор VBA. В нём находим модуль с кодом макроса и изучаем какие команды использовались для тех действий на листе, которые мы сделали. Такие же команды надо вызывать в коде Delphi.
---
Вот пример, как запустить и подключиться к MS Excel, создать рабочую книгу и на первом листе этой книги оформить диапазон - с линовкой, и выравниваем ширины ячеек.
Для начала, в MS Excel записываем макрос и смотрим его код:
Теперь пишем код на Delphi и применяем в нём те же методы, которые были употреблены в макросе.
Окончательный код в Delphi получился таким:
Спасибо большое за развернутый ответ !
Добавлено через 31 минуту
Хотел бы узнать, а как обрамить рамкой ячейки автоматически (кол-во столбцов статическое, а вот строк не постоянное)?
Хотел бы узнать, а как обрамить рамкой ячейки автоматически (кол-во столбцов статическое, а вот строк не постоянное)?
Здесь разные способы можно применить.
Наверное, лучше всего подсчитывать количество строк во время их записи на лист Excel. Пускай, например, нам известно, что левая верхняя ячейка, начиная с которой идёт запись на лист Excel, имеет координаты: номер строки = 5, номер столбца = 3. Всего столбцов в таблице: 10.
Тогда определить диапазон можно так:
Ещё можно использовать объекты, которые можно получить через свойства UsedRange и CurrentRegion. Но чтобы воспользоваться этими объектами и получить верный результат, нужно соблюсти некоторые условия.
Способ с применением UsedRange.
Если известно, что после записи таблицы на лист Excel, ниже таблицы нет ни одной используемой ячейки, то можно воспользоваться объектом UsedRange. UsedRange - это объект, представляющий диапазон, который охватывает все используемые ячейки на листе. Если в ячейку записано значение, формула или изменено её форматирование (шрифт, выравнивание, обрамление) - то такая ячейка является используемой.
Здесь:
UsedRange.Row - номер верхней строки в используемом диапазоне.
UsedRange.Rows.Count - общее количество строк в используемом диапазоне.
Способ с применением CurrentRange.
Под пустой ячейкой будем понимать ячейку, в которой не записано значение. В такой ячейке может быть записана формула или может быть изменено оформление.
Пускай нам известна координата хотябы одной ячейки внутри таблицы. И если известно, что непосредственно к таблице по её краям (сверху, снизу и по бокам) не примыкают какие-нибудь непустые ячейки и в таблице нет полностью пустых строк и полностью пустых столбцов. Тогда можно применить способ с CurrentRegion.
В свое время, когда для системы учета потребовалось сделать систему вывода информации на печать перебрал много разных систем формирования отчетов — некоторые, как FastReport, имели в составе редакторы, и замечательно формировали печатные формы, но чаще всего пользователям нравится, когда можно быстро и красиво получить информацию в ихнем любимом Excel, не прибегая к конверторам и т.п.
В интернете уже давно существует море информации, по взаимодействию Delphi и Microsoft Excel, и я не буду писать еще одно руководство. Вместо этого я предлагаю посмотреть, как можно довольно просто разработать свою систему вывода отчетов в Excel, причем достаточную для решения пусть и не всех, но большинства задач.
Устройство собственного генератора отчетов для Excel
Основу шаблона составляют “бэнды”. Бэнд это одна или более строк, расположенных подряд и имеющих одну и ту-же метку — название бэнда. Оно проставляется в первой колонке каждой строки. Вот так примерно будет выглядеть готовый шаблон отчета:
Наш компонент будет уметь открывать шаблон, вставлять заданный бэнд, вставлять значение переменных на последнем вставленном бэнде, показывать прогресс в виде количества выведенных строк (для упрощения не будем возиться с просчетом общего количества), а также собственно открывать сам результат.
Сам класс отчета будет очень простым:
Начинаться построение любого отчета будет вызовом процедуры OpenTemplate, которая будет запускать эксель, открывать в нем нужный шаблон, а также инициализировать нужные далее переменные:
Здесь упоминается объект TA7xProgress, который представляет собой просто форму, с парой меток, для вывода пользователю прогресса построения отчета, чтобы он не подумал что программа висит.
После того как шаблон открыт, код построения отчета будет вызвать метод PasteBand всякий раз, как нужно будет добавить на изначально чистый лист очередной кусочек отчета из шаблона.
Технология добавления бэндов предполагает что мы вставляем бэнды сразу перед шаблоном, оставляя таким образом шаблон всегда в конце документа. Для этого мы находим нужный нам бэнд по имени, начиная искать после последнего вставленного нами бэнда и далее, а кроме того определяем и длину найденного бэнда. Тоесть следующий кусок кода в переменных FirstBandLine и LastBandLine сохранит начало и конец бэнда:
Далее этот найденный шаблон копипастим сразу за последним вставленным нами бэндом, если такой уже был:
Ну и изменяем переменные указывающие на позицию последней строки отчета и где теперь находится скопированный нами бэнд. Последнее нужно для того, чтобы знать в каком диапазоне срок искать нужное нам имя переменной для замены его значениями:
Следующий метод, который будет использоваться для вывода значений на уже скопированный кусок шаблона – SetValue. Код этого метода предельно прост, так как выполняет поиск-замену значения в заданном диапазоне средствами самого экселя:
Метод SetValue должен вызываться столько раз, сколько у нас находится значений на нужном нам бэнде. Ну и наконец после того как все бэнды будут выведены, вызывается последнй метод – Show, в котором наконец удаляется сам шаблон, который вытеснялся в конец документа, и эксель перевдится из невидимого состояния в видимое.
Здесь стоит упомянуть, что если скажем прервать отладку отчета до вызова Excel.Visible := true; то эксель так и останется висеть в памяти невидимкой, а для следующего отчета будет создана новый экземпляр Excel.
Как выглядит применение генератора отчетов в Delphi-коде
Теперь самое интересное – пример использования этого генератора отчетов:
Привожу полностью процедуру, которая используя показанный выше шаблон выводит в эксель заданного формата накладную:
Как видно, логика формирования печатной формы полностью прозрачна и не отягощена техническим кодом вывода значений в нужные ячейки Microsoft Excel – обо всем этом заботится наш компонент отчета, а кроме того в отличии от многих генераторов отчетов, у нас имеется вся мощь Delphi для расчета и получения нужных нам значений в разных частях процедуры построения отчета.
Шаблон отчета представляет собой один лист Microsoft Excel, содержащий уже готовые части и разметку отчета.
Первая колонка содержит текстовое имя бэнда (секции), причем если бэнд имеет больше одной строки в высоту, то его имя должно повторяться на каждой строке. Объединение ячеек для этой колонки использовать нельзя. После построения отчета эта колонка останется пустой, поэтому ее можно сделать очень узенькую, либо вообще скрыть — на работоспособность это не повлияет.
Вся остальная часть строки, это разметка отчета, содержащая заголовки, рамки, установленные шрифты, свойства ячеек, и где надо объединения. Можно использовать даже формулы, если они ссылаются на ячейки в пределах строки или бэнда.
Так может выглядеть готовый шаблон для вывода в Excel накладной с ценами и суммами.
Что нужно знать для построения отчета
После того, как вы разместили компонент отчета на своей форме, вам остается только вызывать в нужных местах его процедуры, для построения отчета и выдачи его пользователю.
В начале построения отчета вызываем метод OpenTemplate( FileName : string), с указанием файла-шаблона. Далее происходит наполнение листа бэндами и данными, последовательными вызовами методов PasteBand и SetValue. В конце построения вызываем Show() и пользователю открывается экселевский отчет, в режиме «только чтение», это сделано для того чтобы он случайно не перезаписал шаблон. При попытке сохранить его, эксель предложит выбрать место сохранения и имя файла.
Метод PasteBand( Name : string) — добавляет на лист нужный нам бэнд (бэнд — это одна или несколько строк, имеющих в первой ячейке одно и тоже имя).
Дополнительные возможности при построении отчетов
Метод SetValueAsText( varName : string; Value : string) работает медленнее метода SetValue и не способен найти имя переменной внутри текстовой строки, но нужен для обхода дурной привычки Excel автоматически форматировать текст в виде даты там где этого не нужно. Например значение «10.10» подменяется экселем на «10 окт.», а этот метод позволяет этого избежать.
OpenTemplate есть вариант вызова с указанием нужно ли давать пользователю видеть как в экселе происходит заполнение отчета, при этом если параметр равен Visible=True то окно прогресса не показывается.
OpenWorkSheet( Name : string) переключает вывод отчета на новый лист. Используется если вам нужно делать много-листовые отчеты.
SetSumFormula ( VarName : string; FirstLine , LastLine : Integer) вставляет в ячейку VarName формулу суммирования по строкам FirstLine .. LastLine (по типу «=СУММ(C10:C25)»). Значения FirstLine и LastLine нужно сохранить предварительно самостоятельно, взяв номер строки из переменной CurrentLine в начале и в конце вывода нужной секции.
SetColor( VarName : string; Color :Variant) устанавливает цвет ячейки, либо очищает если Color=null;
Для всего что не предусмотрено можно пойти путем прямого управления экселем, например:
Закрепить область можно таким кодом:
Работа с комментариями:
SetComment( VarName : string; Value : Variant) — позволяет установить комментарий для ячейки с меткой VarName .
GetComment( VarName : string): string — позволяет прочитать содержимое комментария над ячейкой с меткой VarName .
GetAndClearComment( VarName : string): string — тоже что и предыдущий вариант, но после чтения комментарий уничтожается. Это удобно если в комментарии нужно разместить какие-либо контекстные параметры, видеть которые конечному пользователю в отчете не нужно.
Важно помнить, что пользоваться этими функциями нужно ДО заполнения ячейки с комментарием, иначе процедура не найдет метку. Пример использования есть в прилагаемом демонстрационном приложении.
Поддерживаемые версии Excel и Delphi:
Не стоит пугаться, увидев в папке с компонентом только версию под Delphi 7 и Delphi XE2 — думаю при установке компонента и на другие версии проблем не возникнет.
Работа компонента была протестирована на компьютерах с установленным Microsoft Office 2003, 2007, 2010, 2013, но к сожалению без установленного офиса вывод информации в Excel работать не будет!
Читайте также: