Печать из delphi в excel по шаблону

Содержание

Программирование Delphi

Все о программировании.

Главное меню

Печать из Delphi с возможностью просмотра

Печать сейчас широко используется в приложениях Delphi, когда нужно напечатать текст, изображение и т.д. Большинство приложений Windows поддерживают возможность печати. В Delphi есть несколько способов печати, в зависимости от качества, которого Вы хотите достичь.

Печать формы

В Delphi у формы Form имеется функция Print, которая может выводить на печать форму.

Также Вы можете использовать свойство PrintScale, которое изменяет масштаб печатаемого объекта. Это свойство содержит три опции:

  • poNone — печать будет произведена с настройками принтера.
  • poProportional — печать страницы, которая будет иметь те же размеры, что и на экране.
  • poPrintToFit — размер изменяется в зависимости от размера страницы.

При этом получается не самое высокое качество печати.

Печать управления TRichEdit

Функция Print имеется также у компонента TRichEdit.

Как видите, здесь функция Print получает один строковой параметр, который будет отображаться в очереди печати как имя документа.

Печать текстовых файлов при помощи ShellExecute

Также можно использовать функцию API ShellExecute для печати текстового документа.

При этом открывается приложение, которое ассоциировано с файлом. В моем случае это Блокнот.

Диалоговое окно печати

В Delphi имеется два диалоговых окна для печати: диалоговое окно при помощи компонента TPrintDialog и при помощи диалогового окна установок принтера TPrinterSetupDialog.

Диалоговое окно TPringDialog

Компонент диалогового окна TPrintDialog Вы можете использовать непосредственно перед началом печати. Компонент TPrintDialog имеет свои свойства и метода, которые Вы сможете найти в справке по Delphi. Диалоговое окно вызывается конструкцией:

Диалоговое окно Настройка печати

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

TPrinter

Объект TPrinter используется для печати документов, текста и т.д. Вот пример использования TPrinter для печати прямоугольника. Не забудьте добавить модуль Printers в раздел uses формы.

Таким же образом, на холсте Canvas объекта Printer можно напечатать и текст.

А также вывести растровое изображение на печать, словно на холст.

При печати растровое изображение будет небольшим, чтобы вывести нужный Вам размер на печать, используйте StretchDraw.

Реализация Просмотра Печати

Предварительный просмотр печати важен в приложениях для пользователя, потому как позволяет просматривать изображение или текст перед выводом его на печать. Здесь мы создадим предварительный просмотр печати с возможностью изменения масштаба изображения.

Небольшое приложение с использованием предварительного просмотра печати Вы можете посмотреть здесь.

Копирование содержимого формы в буфер обмена

Создаем свой генератор отчетов Microsoft Excel для Delphi

Зачем нужна система формирования отчетов

В свое время, когда для системы учета потребовалось сделать систему вывода информации на печать перебрал много разных систем формирования отчетов — некоторые, как FastReport, имели в составе редакторы, и замечательно формировали печатные формы, но чаще всего пользователям нравится, когда можно быстро и красиво получить информацию в ихнем любимом Excel, не прибегая к конверторам и т.п.

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

Когда каждый отчет полностью формировался кодом на Delphi недостаток такого метода был в том, что за делфийским кодом не было видно логики построения отчета, а самое главное — для изменения любой мелочи в оформлении приходилось вносить изменения в код и перекомпилировать проект. Тогда возникла идея написать свой маленький генератор отчетов, причем шаблон отчета — это обычный экселевский файл, в котором любой пользователь сможет подправить то что ему нужно, и определить заранее формат вывода на печать.

Устройство собственного генератора отчетов для Excel

Основу шаблона составляют “бэнды”. Бэнд это одна или более строк, расположенных подряд и имеющих одну и ту-же метку — название бэнда. Оно проставляется в первой колонке каждой строки. Вот так примерно будет выглядеть готовый шаблон отчета:

Наш компонент будет уметь открывать шаблон, вставлять заданный бэнд, вставлять значение переменных на последнем вставленном бэнде, показывать прогресс в виде количества выведенных строк (для упрощения не будем возиться с просчетом общего количества), а также собственно открывать сам результат.

Сам класс отчета будет очень простым:

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

Здесь упоминается объект TA7xProgress, который представляет собой просто форму, с парой меток, для вывода пользователю прогресса построения отчета, чтобы он не подумал что программа висит.

После того как шаблон открыт, код построения отчета будет вызвать метод PasteBand всякий раз, как нужно будет добавить на изначально чистый лист очередной кусочек отчета из шаблона.

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

Далее этот найденный шаблон копипастим сразу за последним вставленным нами бэндом, если такой уже был:

Ну и изменяем переменные указывающие на позицию последней строки отчета и где теперь находится скопированный нами бэнд. Последнее нужно для того, чтобы знать в каком диапазоне срок искать нужное нам имя переменной для замены его значениями:

Следующий метод, который будет использоваться для вывода значений на уже скопированный кусок шаблона – SetValue. Код этого метода предельно прост, так как выполняет поиск-замену значения в заданном диапазоне средствами самого экселя:

Метод SetValue должен вызываться столько раз, сколько у нас находится значений на нужном нам бэнде. Ну и наконец после того как все бэнды будут выведены, вызывается последнй метод – Show, в котором наконец удаляется сам шаблон, который вытеснялся в конец документа, и эксель перевдится из невидимого состояния в видимое.

Здесь стоит упомянуть, что если скажем прервать отладку отчета до вызова Excel.Visible := true; то эксель так и останется висеть в памяти невидимкой, а для следующего отчета будет создана новый экземпляр Excel.

Как выглядит применение генератора отчетов в Delphi-коде

Теперь самое интересное – пример использования этого генератора отчетов:

Привожу полностью процедуру, которая используя показанный выше шаблон выводит в эксель заданного формата накладную:

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

Канал в Telegram

Вы здесь

Экспорт данных в Excel из Delphi

В прошлой статье (Читаем файл Excel (xls) в Delphi) был рассмотрен способ чтения данных из xls файла и его импорт в Delphi. Теперь перейдем к сохранению, т.е. к экспорту данных из Delphi. Экспорт, как и импорт, будет осуществляться через посредника, т.е. Excel. Поэтому для работы приложения потребуется установленная копия MS Excel 2003-2010 (выше не тестировал).

Добавьте на форму кнопку, диалог сохранения, и таблицу StringGrid. Для того чтоб появилась возможность редактирования таблицы StringGrid необходимо в ее свойствах включить опцию goEditing:

Визуальные приготовления для нашего примера готовы. Переходим к написанию кода.

Как и в случае чтения xls нам понадобится библиотека ComObj. Добавьте ее в uses. Ниже приведен листинг процедуры экспорта, добавьте его после ключевого слова implementation.

procedure Xls_Save(XLSFile:string; Grid:TStringGrid);
const
xlExcel9795 = $0000002B;
xlExcel8 = 56;
var
ExlApp, Sheet: OLEVariant;
i, j, r, c:integer;

begin
//создаем объект Excel
ExlApp := CreateOleObject(‘Excel.Application’);

//делаем окно Excel невидимым
ExlApp.Visible := false;

//создаем книгу для экспорта
ExlApp.Workbooks.Add;

//создаем объект Sheet(страница) и указываем номер листа (1)
//в книге, в который будем осуществлять экспорт
Sheet := ExlApp.Workbooks[1].WorkSheets[1];

//задаем имя листу
Sheet.name:=’Данные_из_Delphi’;

//считываем кол-во столбцов и строк в StringGrid
r:=Grid.RowCount;
c:=Grid.ColCount;

//считываем значение из каждой ячейки и отправляем в таблицу Excel
for j:= 1 to r do
for i:= 1 to c do
sheet.cells[j,i]:=Grid.Cells[i-1,j-1];

//отключаем все предупреждения Excel
ExlApp.DisplayAlerts := False;

//обработка исключения при сохраннении файла
try
//формат xls 97-2003 если установлен 2003 Excel
ExlApp.Workbooks[1].saveas(XLSFile, xlExcel9795);
showmessage(‘Файл сохранил 2003-ий офис’);
except
//формат xls 97-2003 если установлен 2007-2010 Excel
ExlApp.Workbooks[1].saveas(XLSFile, xlExcel8);
showmessage(‘Файл сохранил 2007 или 2010-ый офис’);
end;

//закрываем приложение Excel
ExlApp.Quit;

//очищаем выделенную память
ExlApp := Unassigned;
Sheet := Unassigned;

Заполнить по шаблону

Данная функция является частью надстройки MulTEx

  • Описание, установка, удаление и обновление
  • Полный список команд и функций MulTEx
  • Часто задаваемые вопросы по MulTEx
  • Скачать MulTEx

Вызов команды:
MulTEx -группа Книги/ЛистыКнигиЗаполнить по шаблону

Команда Заполнить по шаблону создает множество заполненных на основании выбранного шаблона файлов из данных в таблице Excel. Например, есть таблица с продукцией примерного такого вида:

Только строк не один десяток и необходимо создать ценники на весь перечисленный товар по шаблону:

и либо распечатать, либо создать на каждый товар по отдельному файлу. Вручную делать такое не просто нудно — это к тому же займет кучу времени.
Однако, если шаблон привести к нужному виду, а в таблицу добавить еще одну строку — то можно использовать команду Заполнить по шаблону и она за несколько минут(зависит от вида шаблона и количества данных для заполнения) сделает все сама.
Естественно, программу можно применять не только для заполнения ценников, но и для заполнения любых шаблонных форм: договора, анкеты, квитанции, накладные, штапмы, открытки для рассылок и т.п. Например, если ведется учет клиентов компании в таблице и периодически на основании этих данных заполняются файлы договоров на продление услуг, дополнительные соглашения, ежемесячные акты выполненных работ и т.п., то данная команда избавит от необходимости делать это каждый раз вручную. Достаточно на каждый случай составить по одному шаблону и далее просто на основании уже имеющегося списка просто заполнять шаблоны.

Илон Маск рекомендует:  Что такое код swfmorph

Подготовка данных (файл Excel и шаблон Word)
Самая главная сложность в работе с данной командой это настроить шаблон и исходные таблицы. Хотя сделать это совсем не сложно.
Подготовка файла Excel

    В качестве исходных данных может быть применена любая таблица Excel, в каждом столбце которой расположены свои данные. Чтобы программа могла однозначно понять откуда какие значения брать необходимо расставить «метки»(я их так назвал). Лучше всего, чтобы список имел заголовки и сразу над/под заголовками как раз создать метки (на рисунке в первой строке):

Метки могут содержать любой текст, но обязательно должны быть заключены в фигурные скобки <>. Это необходимо, чтобы максимально исключить возможность совпадения с меткой текста, который заменять не требуется. Например на рисунке выше меткой для наименования товара является <ТОВАР>. Не рекомендуется в качестве меток применять набор символов вроде двоеточий, запятых и прочих служебных символов. Это может привести к неправильной работе программы.
В итоге таблица должна иметь следующую структуру: строки заголовков и меток и сами данные. Т.е. одна или две служебных строки(метки и заголовок) и данные. Пропусков между строками данных и заголовками и метками быть не должно. Также для удобства работы с программой лучше располагать данные, начиная с первого столбца листа. Самый лучший вариант расположения данных — как на рисунке выше.

Подготовка файла Word

    Шаблоном может быть любой файл Word в одном из форматов: .doc, .dot, .docx, .docm, .dotx, .dotm, .rtf. В этом файле на местах, в которые необходимо вставить данные из листа Excel, необходимо записать точно такие же метки, которые используются в строке меток листа Excel. На примере шаблона ценника (приведенного выше): в нем в нужные места необходимо вставить поочередно метки с фигурными скобками:

Далее метки в шаблоне будут заменены текстом из файла Excel по следующей схеме:

Как это работает: программа последовательно берет каждую метку из строки в Excel и заменяет точно такой же текст во всем шаблоне Word на данные ячейки из основной таблицы(ищет <ТОВАР>в шаблоне и если находит заменяет на Йогурт черничный). Как итог результатом работы программы получим три заполненных ценника:

При этом для каждой строки Excel будет создан свой документ Word. Сам исходный шаблон при этом не изменяется.

Важно: программа заполнит шаблон данными только тех столбцов, над которыми установлены метки( <ТОВАР>, <Категория>, <Производитель>и т.д.). Если строка с метками пустая, либо записанная метка отсутствует в шаблоне, либо не заключена в фигурные скобки — ошибки это не вызовет, но и данные таких столбцов не будут записаны в шаблон.

Брать значения из:

  • всего диапазона активного листа — в этом случае наличие данных и их расположение будет определено программой автоматически. Не рекомендуется применять, если не уверены, что на листе нет лишних данных(не используемые шапки таблиц, подписи под данными и т.п.). Так же для этого желательно, чтобы данные располагались в строгой последовательности: строка меток, заголовок, таблица данных
  • указанного диапазона — будут обрабатываться данные в пределах указанного диапазона. В этом случае в диапазон необходимо обязательно включать строку меток и заголовков(если заголовки идут после строки с метками)

Данные содержат заголовки — если установлен, то обработка выбранных данных будет начата с третьей строки(1-я строка метки, 2-я заголовки).

Номер строки с метками для шаблона: указывается номер строки выбранного диапазона, в котором записаны метки. По умолчанию применяется значение 1, но метки могут быть и второй строкой. Хоть программа и допускает выбор от 1 до 256 лучше в качестве меток использовать первую или вторую строку. Что следует учитывать: указывать необходимо номер строки в указанном диапазоне по счету, а не на листе в целом. Если выбрано Брать значения из указанного диапазона и диапазон указан скажем A10:F15 (т.е. начинается с 10-й строки) и метки расположены в этой 10-ой строке, то следует указать 1, т.к. в указанном диапазоне это первая по счету строка.

Файл шаблона для заполнения: нажатием на кнопку правее поля выбирается файл Word для заполнения. Путь к выбранному файлу будет отображаться в этом поле.

Сохранять выбранные файлы:

  • В новую папку с выбранным шаблоном — в папке с указанным шаблоном будет создана папка в формате «Файлы от ДД-ММ-ГГГГ чч-мм-сс» (где ДД-ММ-ГГГГ текущая дата, а чч-мм-сс время создания папки) и все созданные на основе выбранного шаблона файлы будут помещены в эту папку
  • в указанную папку — активируется поле и кнопка, после нажатия которой необходимо выбрать папку для сохранения созданных файлов

Заполнять только из строк, отмеченных в столбце №:
указывается номер столбца по счету в заданном диапазоне(именно номер столбца по счету, а не на листе). Необходимо, если не требуется заполнять шаблоны всего списка, а только определенные. Допускается выбрать один из вариантов отбора строк:

  • не пустая — скорее всего самый распространенный в использовании вариант. Создание файлов будет происходить только в том случае, если ячейка в указанном столбце содержит любое значение. Здесь важно помнить, что пробел или перенос строки в ячейке хоть и не заметен, но он не означает, что ячейка пустая. Поэтому если вдруг выбран данный пункт, но пустые строки все равно заполняются — проверьте, нет ли в них каких-то не заметных символов
  • содержит текст — указывается произвольный текст и если значение в ячейке в указанном столбце будет равно указанному, то будет создан новый файл на основе шаблона. В противном случае строка будет пропущена

Для чего это нужно: в больших таблицах программа может работать довольно долго. И чтобы как-то распределить рабочее время на создание файлов и иные задачи можно просто отмечать строки порционно.

Производить замену текста в объектах — некоторые шаблоны могут быть созданы на основании таких объектов, как Надписи, WordArt, Фигуры, Картинки и т.п. Даже стандартная замена в Word не заменяет текст в таких объектах для всего документа сразу. Так же шаблоны могут содержать смешанные данные: и объекты и обычный текст. Поэтому если шаблон содержит такие объекты и текст внутри объектов содержит метки — необходимо установить этот пункт. Однако следует помнить, что такая замена может работать дольше, чем с шаблонами на основе обычного текста. Поэтому не следует применять опцию без необходимости.

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

Метки столбцов, в которых ссылки на изображения (Печать, Подпись, Логотип и т.п.) — применяется в случаях, если шаблон представляет собой некий документ, в котором в зависимости от данных так же должны вставляться различные картинки. На примере печати этикеток разберем подробнее как использовать данную опцию. Предположим, что этикетка товара содержит помимо просто описания еще и картинку категории продукта:

При этом картинка должна изменяться в зависимости от категории: для молочных одна, для сыров другая, для фруктов третья и т.д. Тогда в сам шаблон необходимо будет добавить в нужном месте метку:

а в изначальную таблицу данных надо добавить еще один столбец — Иконка категории. В этом столбце необходимо будет указать полный путь до иконки каждой категории:

Для указания полного пути к файлам лучше воспользоваться командой MulTEx — Путь к файлу . Она вставит пути правильно и не придется беспокоиться за различные нюансы написания путей, расширений файлов и т.п.
Так же в качестве пути к файлу можно указать путь к файлу картинки, расположенной не только на ПК, но и в интернете, если путь до них начинается с » http:// «. Например, можно указать картинку, расположенную на любом доступном сервисе или сайте: http://www.iconsearch.ru/uploads/icons/crystalproject/16×16/aim_online.png .
Если по указанному в ячейках пути не будет картинки или она будет недоступна для открытия, то для такой строки действий по замене картинки производиться не будет и метка останется в шаблоне нетронутой. Если метку необходимо удалять в случае невозможности вставить картинку, то необходимо включить пункт Удалять из шаблона метку, если картинка недоступна.
Теперь останется в строке для меток указать метку в фигурных скобках — .
В результате помимо заполненной основной информации получим для каждой категории свою иконку на ценнике:

Конечно, данную возможность можно применять не только для ценников и этикеток — это так же актуально и для многих других шаблонов, документов. Например, это могут быть:

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

Если в одном шаблоне используется несколько картинок для вставки, то создается столько столбцов, сколько применяется различных картинок в шаблоне и каждому назначается своя уникальная метка. Метки в поле при этом необходимо перечислить через запятую: ПЕЧАТЬ,ПОДПИСЬ,ЛОГОТИП .

Удалять из шаблона метку, если картинка недоступна — применяется в случаях, если не для всех строк есть картинка. При обычных настройках если картинки нет или она недоступна по указанному пути, то метка для вставки остается в шаблоне. Если же установить данную опцию, то при невозможности вставить картинку в шаблон, метка для картинки из шаблона будет удалена. Таким образом шаблон можно сразу отправить на печать, не беспокоясь о том, что в распечатанном документе будут находится всякие метки, которые не должны быть в конечном документе. Если заранее известно, что для данной строки нет картинки и она не должна быть вставлена, то поле можно просто оставить пустым. Картинка не будет вставлена, а метка будет удалена. И это не будет считаться ошибкой заполнения.

Метки столбцов, в которых адреса( A1:C10 ) таблиц Excel (Таблица, Прайс, Перечень услуг и т.п.) — применяется в случаях, если в шаблон необходимо вставить целую таблицу из файла Excel. Наиболее актуальна вставка целых таблиц в приложениях к договорам, где необходимо приводить перечень оборудования, материалов, видов работ и т.д., которые изменяются для каждого проекта. Например, в шаблонах спецификаций, проектов на строительство и т.п. Также таблицы могут применяться для вставки в договора реквизитов сторон:

Как применять: для начала необходимо определить адрес ячеек вставляемой таблицы или именованный диапазон(так же можно использовать имена «умных» таблиц -вкладка ВставкаТаблица), содержащий необходимую информацию:

Если используются «умные» таблицы, то название заголовка таблиц в конечный шаблон не вставляется — только данные.
далее в таблицу Excel с данными добавить еще один столбец — назовем его » Реквизиты организации «. В нем указывается адрес ячеек этой таблицы или её имя:

Метка столбца на картинке выше названа <РЕКВИЗИТЫ ТБЛ>. Её же используем для указания в поле » Метки столбцов, в которых адреса. «:


    Если таблиц несколько, то создается столько столбцов, сколько применяется различных таблиц в шаблоне и каждому назначается своя уникальная метка. Метки в поле при этом необходимо перечислить через запятую: РЕКВИЗИТЫ ТБЛ,РАСЧЕТЫ ТБЛ,МАТЕРИАЛЫ ТБЛ .

Удалять из шаблона метку, если таблица недоступна — применяется в случаях, если не для всех строк есть таблица. При настройках по умолчанию, если таблицы нет или она недоступна по указанному адресу, то метка для вставки остается в шаблоне. Если же установить данную опцию, то при невозможности вставить таблицу в шаблон, метка для вставки таблицы из шаблона будет удалена. Таким образом шаблон можно сразу отправить на печать, не беспокоясь о том, что в распечатанном документе будут находится всякие лишние метки, которые не должны быть в конечном документе. Если заранее известно, что для данной строки нет таблицы и она не должна быть вставлена, то поле можно просто оставить пустым. Таблица не будет вставлена, а метка будет удалена. И это не будет считаться ошибкой заполнения.

Настройки на этой вкладке дают возможность управлять правилами сохранения файлов и разрешения конфликтов сохранения.

Давать новым файлам имена:

  • простая нумерация — в этом случае созданным файлам будут даны имена в виде номеров в том порядке, в котором были созданы. Первый созданный будет назван 1.docx , второй — 2.docx , третий — 3.docx и т.д
  • нумерация с текстом: в этом случае созданным файлам будут даны имена в виде номеров в том порядке, в котором были созданы, только перед номерами будет еще добавлен текст, который необходимо указать в соответствующем поле. Если в поле указать «товар», то первый созданный файл будет назван товар1.docx , второй — товар2.docx , третий — товар3.docx и т.д.
  • на основании значений столбцов: в данном случае созданным файлам будут даны имена, созданные на основании значений ячеек указанных столбцов, объединенных в том порядке, в котором указаны столбцы. На примере приведенной в самом начале таблицы товара. Если необходимо файлам дать имена по Наименованию товара(т.е. такие же, какие значения в первом столбце таблицы), то следует в поле указать цифру 1 . Тогда новым файлам будут даны имена: первому Йогурт черничный.docx , второму — Ряженка топленая.docx , третьему — Творог 5%.docx .

Если в поле указать 1,2 , то новым файлам будут даны имена: первому Йогурт черничныйМолочная продукция.docx , второму — Ряженка топленаяМолочная продукция.docx , третьему — Творог 5%Молочная продукция.docx .
Номера столбцов можно располагать в нужном порядке. Например, если необходимо называть файлы по имени производителя и наименованию товара, то следует указать порядок: 3,1 . Тогда созданным файлам будут даны имена: первому ПростоквашиноЙогурт черничный.docx , второму — ПростоквашиноРяженка топленая.docx , третьему — ПростоквашиноТворог 5%.docx

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

  • Создать копию — при совпадении имен будет создан файл с таким же именем, но на конце файла будет добавлена номер копии в скобках(Йогурт черничный(1).docx, Йогурт черничный(2).docx и т.д.)
  • Перезаписать — при совпадении имен старый файл будет удален и вместо него будет создан новый
  • Пропустить — при совпадении имен в папке будет оставлен старый файл, а новый не будет сохранен

Сохранять так же в PDF — в данном случае помимо сохранения файлов в формат Word, файлы будут так же сохранены в формат PDF. Имена файлов PDF будут полностью совпадать с именами файлов Word.

Отправлять файлы на печать на указанный принтер:
Если установить, то станет активным окно выбора доступных на ПК принтеров. Необходимо выбрать принтер, на котором необходимо будет распечатать каждый документ. Если ни один из принтеров не доступен, то при самом запуске команды появится предупреждение, что доступных для печати принтеров не обнаружено.

Распечатать копий каждого файла: указывается сколько раз необходимо распечатать каждый новый файл.

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

Если во время заполнения шаблонов возникнут ошибки заполнения, то по окончании обработки программа выдаст предупреждение следующего вида:

В данном сообщении будут перечислены общие сведения о типах ошибок. Если выбрать Да, то будет создана новая книга, в которой программа создаст более развернутый отчет с именами файлов(включая имя папки с итоговым файлом), в которых возникли ошибки и типами ошибок:

Вставка картинок — в этом столбце перечислены файлы (в формате » имя папки\ имя файла «), в которых возникла ошибка вставки одной или нескольких картинок. В каких случаях это может происходить:

  • если в качестве картинки указан URL-адрес и отсутствует подключение к интернету;
  • картинка недоступна или не существует по указанному пути.

Вставка таблиц — в этом столбце перечислены файлы (в формате » имя папки\ имя файла «), в которых возникла ошибка вставки одной или нескольких таблиц. Чаще всего это может происходить в случае, если метка для вставки таблицы располагается внутри другой таблицы шаблона:

Поэтому не следует располагать метки таблиц в других таблицах, если не уверены, что это отработает без ошибок.

Иные ошибки — в этом столбце перечислены файлы (в формате » имя папки\ имя файла «), в которых возникла любая ошибка, не связанная со вставкой картинок или таблиц. Это может происходить по множеству причин:

  • неверные форматы данных;
  • защищенный шаблон;
  • слишком сложная структура документа;
  • ошибочные значения в таблицах и т.д.

Для чего вообще необходимо оповещение о подобных ошибках? Если такое сообщение не выводить, то при создании множества документов по шаблону, ошибка даже в одном из них может привести к печальным последствиям. Например, если при создании договора возникнет ошибка и какие-либо реквизиты или данные не будут вставлены корректно — велик шанс, что вторая сторона(Заказчик) может в последний момент отказаться от контракта.
Данная же опция позволяет легко выявить проблемы с заполнением и сама показывает, к каким файлам и их настройкам следует присмотреться.

Примечание: использование данной команды требует установленного на ПК MS Word.

Печать из delphi в excel по шаблону

Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.5.2008

Репутация: нет
Всего: нет

Уважаемые знатоки делфи =) Был бы очень благодарен если подскажите как сделать двухстороннюю печать из делфи в Excel, а точнее настроить принтер на двустороннюю печать заранее спасибо.

Это сообщение отредактировал(а) альмольдегид — 16.5.2008, 14:42

Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

Albinos_x
Дата 16.5.2008, 16:35 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Комодератор
Сообщений: 3281
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 15
Всего: 108

Albinos_x
Дата 16.5.2008, 16:55 (ссылка) | (нет голосов) Загрузка .
Google
Дата 12.11.2020, 21:55 (ссылка)

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

Экспорт данных из Delphi в Excel (исходники)

Рано или поздно практически каждый программист сталкивается с необходимостью организовать экспорт данных в MS Office. При этом каждое «поколение» программистов натыкается на одни и те же вилы.

Вот три часто встречающихся вопроса:

  • 1. Как определить установлен ли Excel
  • 2. Как определить запущен ли Excel
  • 3. Как вывести данные в Excel

Большую помощь в понимании этих и других вопросов приносит чтение исходных текстов функций модуля ComObj. :)

Во всех случаях следует подключить модули ComObj и ActiveX

1. Как определить установлен ли Excel

Функция возвращает True если найден OLE-объект. Пример использования:

Если нужна более подробная информация об объекте, можно почитать хелп по функции API CLSIDFromProgID.

2. Как определить запущен ли Excel

Данный пример ищет активный экземпляр Excel и делает его видимым:

3. Как вывести данные в Excel

Можно выводить данные последовательно в каждую ячейку, но это очинь сильно замедляет работу. Лучше сформировать вариантный массив, и выполнить присвоение области (Range) этого массива.

Работа с Excel в Delphi. Основы основ.

Видимо любители экономить килобайты оперативной памяти могут меня закидать помидорами или ещё чем по-хуже, но все-таки я скажу, что интеграция приложений (мегабайты оперативы) — это большой плюс нынешней разработки приложений.
Как ни крути, а время DOS и килобайтов оперативной памяти прошло. Вряд ли кто-то всерьез сейчас задумывается над тем куда это с винчестера пропал мегабайт? Да и использование в своих приложениях функциональности программ, которых ты не писал, но которые выполняют что-то лучше — это всё-таки больший прогресс, нежели корпеть год-два над программой, а потом узнать, что время-то прошло.

План статьи:

Итак, цель сегодняшней статьи — поделиться с Вами опытом работы с Microsoft Excel в приложениях, написанных на Delphi.
Вспомнился сейчас один случай. Когда я только начинал работать по своей специальности, пригласили меня написать программу-расчётник для экологов нашего нефтезавода. В принципе ничего серьёзного — программа считает выброс от нагревательной печи и выдает табличку результатов, которую необходимо распечатать и уложить в толстую папку с отчётами. Естественно, что в области разработки подобных приложения я далеко не пионер, поэтому дали взглянуть на аналог будущей программы, который работал ещё под DOS и печатались отчёты на дико скрипящем матричном принтере с 12-ю иголками. Ну посмотрел, элементарная таблица, расчёт немного запутан, но жить можно — начал по-тихоньку писать. И попалась мне тогда на глаза статейка про работу с Excel в Delphi. Вот я и решил попробовать выдавать отчёт не только на форму приложения, а ещё и скидывать весь ход расчёта с формулами и прочим делом в Excel…Надо сказать более сильно детской радости начальника отдела я не видел до сих пор :). Люди, всю жизнь проработавшие в DOS увидели как тот же самый расчёт может выглядеть в современных условиях. Вот теперь при определении технических заданий на каждую новую программу, обязательно присутствует пункт, гласящий, что программа должна передавать данные либо в MS Word либо в MS Excel.Соответственно и цена на разработку возрастает, иногда значительно.

Отсюда можно сделать простой и однозначный вывод — заказчики готовы пожертвовать лишними деньгами только для того, чтобы всё в программе было красиво. Excel может дать вашему приложению ту самую красоту и удобство.

Ну, а для того, чтобы каждый раз не утруждать себя выполнением однотипных операций, я разработал небольшой модуль для работы с Excel. Этот же модуль я в настоящее время дорабатываю под ещё одну задачу, но об этом после. Сегодня основы основ работы с Excel в Delphi.

1. Как проверить установлен ли Excel на компьютере пользователя?

Создаем новый модуль (unit) и подключаем в uses следующие модули:

Delphi. Различные способы печати из приложений

Итак, начнем рассмотрение этих способов.

Печать с помощью функций файлового ввода/вывода

Здесь мы будем использовать простейшие функции ввода/вывода в файл, только свяжем выходной поток не с файлом, а с принтером. Рассмотрим пример печати текста, содержащегося в компоненте TEdit:

var P:TextFile;
begin
AssignPrn(P);
Rewrite(P);
Writeln(P, Edit1.text);
CloseFile(P);
End;

Здесь мы объявляем переменную P типа TextFile. Процедура AssignPrn является разновидностью процедуры Assign. Она настраивает переменную P на порт принтера и позволяет работать с ним как с файлом. Rewrite открывает порт для работы, а WriteLn — выводит информацию на печать. Важно закрыть порт принтера командой CloseFile.

Этот способ можно использовать для распечатки строк списка или каких-нибудь других данных, по мере их поступления в программу.

Печать текстов в обогащенном формате методом Print

Если Вы пытались попробовать распечатать тексты из Вашего приложения, то , наверно, Вам известно, что компонент TRichEdit имеет метод Print, позволяющий печатать текст, хранящийся в этом компоненте. Этот метод имеет только один параметр — строку, которая при просмотре в Windows очереди печатаемых заданий является именем задания. Приведу пример использования (хотя он очевиден :)

RichEdit1.Print(‘Print of our RichEdit1’);

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

Печать с помощью объекта Printer

В Дельфи имеется класс печатающих объектов TPprinter, который обеспечивает печать текстов, изображений и других объектов, расположенных на его канве (Canvas).

Модуль Дельфи Printers, содержит переменную Printer, которая является объектов типа TPrinter. Поэтому для использования этой переменной в Ваших программах, надо подключить модуль Printers в оператор Uses (к сожалению автоматически этого не делается)

Рассмотрим подробнее некоторые свойства и методы объекта TPrinter:

Правила форума «Delphi: ActiveX/СОМ/CORBA»

Свойство, метод Описание
Canvas Канва — место в памяти, в котором формируется страница или документ перед печатью.
TextOut Метод канвы, позволяющий посылать в нее текст
BeginDoc Используется для начала задания печати
EndDoc Используется для завершения задания печати. При этом печать начинается только после вызова этого метода!
PageHeight Возвращает высоту страницы в пикселах
NewPage Принудительно начинает новую страницу
PageNumber Возвращает номер печатаемой страницы

Приведу два примера печати с помощью объекта TPrinter текста и изображения.

Печать текста можно осуществить так:

Printer.BeginDoc;
Printer.Canvas.TextOut(10,10,’Печатаем с помощью объекта Printer’);
Printer.EndDoc;

Если Вы хотите напечатать изображение, находящееся, например, в компоненте Image1, то код может быть таким: Printer.BeginDoc;
with Image1.Picture.Bitmap do Printer.Canvas.CopyRect(Rect(0,0,Height,Width),Canvas,Rect(0,0,Height,Width));
Printer.EndDoc;

Казалось и бы и здесь все просто, но у объекта Printer есть существенный недостаток: он не производит автоматическое разбиение на строки и страницы, поэтому печатать длинные тексты предпочтительнее с помощью компонента RichEdit или Memo.

Печать форм

У форм в Delphi есть метод Print, который печатает всю клиентскую область формы. При этом полоса заголовка и полоса главного меню формы не печатаются.

Свойство PrintScale определяет опции масштабирования изображения формы при печати:

poNone Масштабирование не используется. Размер изображения может изменяться в зависимости от используемого принтера
poPrintToFit Делается попытка напечатать изображение формы того же размера, который виден на экране
poProportional Увеличивает или уменьшает размер изображения, подгоняя его под размер страницы.

На этом мы заканчиваем обзор способов печати данных из Ваших приложений. Надеюсь, что еще одним вопросом у Вас стало меньше :))

ASD-SOFT

Программирование. Теория и практика.

Обмен данными с MS Excel в Delphi при помощи OLE.

Обмен данными с MS Excel в Delphi при помощи OLE.

Здравствуйте уважаемые коллеги!

Все мы рано или поздно сталкиваемся с задачами обмена данных с приложениями пакета MS Office. Одно из них — это MS Excel. И именно о взаимодействии с данным продуктом MS Office пойдет речь в данной статье.

Один из способов взаимодействия Delphi c MS Excel — это подключиться к нему как к OLE объекту.

Итак.
Прежде всего для работы с MS Excel и OLE добавим в секцию Uses модули ComObj и ActiveX.

И первое что нам нужно проверить, а установлен ли MS Excel на компьютере пользователя в принципе.
Для этого воспользуемся функцией CLSIDFromProgID, которая ищет в реестре CLSID для переданного ProgID:
Справка из MSDN: Метод CLSIDFromProgID
Параметры:
pszProgID: POleStr — Строка с именем объекта
clsid: TCLSID — Указатель на структуру TGUID в которую передается найденный объект;
Возвращает:
HRESULT — Результат, который может принимать значения:
S_OK — объект найден;
CO_E_CLASSSTRING — Зарегистрированный CLSID для ProgID является недействительным;
REGDB_E_WRITEREGDB — Ошибка записи CLSID в реестр.
Из перечисленных результатов нам нужен S_OK.
Напишем функию для определения наличия Excel у пользователя:

Если Excel установлен, тогда выполним подключение к нему. Сделать это можно двумя способами: GetActiveOleObject — Получить ссылку на уже запущенный экземпляр Excel или CreateOleObject — Создать новый экземпляр Excel.
Если у нас стоит задача получать данные из запущенного Excel, тогда мы должны использовать только первый вариант, в остальных случаях пробуем подключиться и если не получается, то создаем.
Напишем 2 функции, для подключения XlsConnect и запуска нового XlsStart:
Добавим переменную FXlsApp с типом Variant, которая будет содержать в себе ссылку на объект Excel.

Теперь можно добавить кнопку, на клик которой подключимся к MS Excel используя написанные функции:

По умолчанию окно Excel запускается в фоновом режиме. Строка FXlsApp.Visible := True; делает фоновое окно Excel видимым.

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

Книга добавлена, теперь попробуем записать что-нибудь в неё.

Где Row — индекс строки, и Col — индекс столбца, которые начинаются с единицы.

Где Range — массив ячеек, а А1 — привычные для Excel координаты ячейки.
В качестве координат может быть указан диапазон. Например, код

заполнит цифрой 5 все ячейки с А3 по А10, а код

выделит тот же диапазон светло-зеленым цветом.
В обратную сторону, то есть для получения данных из Excel, работает так же. Строка

Выведет сообщение с содержимым ячейки с координатами: Строка=5, Столбец=1.

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

Где ActiveWorkbook — текущая книга.
И закрыть приложение Excel командой:

Как понимаете этим возможности управления Excel из Delphi не ограничиваются. И есть один достаточной простой способ узнать, как выполнить необходимо действие с Excel из Delphi.
Называется оно — Макросы.

Представим, что нам необходимо выполнить объединение нескольких ячеек в одну и мы не знаем как это сделать. Но хотим узнать. Для этого выполняем следующие шаги:
1. Запускаем Excel и создаем пустую книгу.
2. Запускаем команду «Записать макрос», по умолчанию название макроса будет «Макрос1». (В разных версиях Excel данная команда находится в разных пунктах меню).
3. Выделяем некоторый диапазон ячеек и нажимаем кнопку «Объединить и поместить в центре».
4. Останавливаем запись макроса.
5. Вызываем список макросов и выбираем там свой записанный макрос.
6. Нажимаем кнопку «Изменить»
Запускается редактор Microsoft Visual Basic for Application в котором видим код проделанных действий:

Давайте разберем по подробнее, что же такого он нам тут написал:
With Selection
— Для выделенного диапазона ячеек настраиваем свойства:
HorizontalAlignment = xlCenter — Горизонтальная ориентация = по центру.
VerticalAlignment = xlBottom — Вертикальная ориентация — по нижнему краю.
WrapText = False — Перенос текста по словам — выключен.
Orientation = 0 — Ориентация 0 градусов.
AddIndent = False — Использование автоматического отступа вкл/выкл.
IndentLevel = 0 — Уровень отступа в 0.
ShrinkToFit = False — Сжимать текст по размерам столбца вкл/выкл.
ReadingOrder = xlContext — Порядок чтения по контексту.
MergeCells = False — Объединенные ячейки вкл/выкл
End With — Конец секции работы с выделенным диапазоном.
Selection.Merge — Объединить выделенный диапазон.

Теперь попробуем объединить ячейки из Delphi:

Выделяем нужный нам диапазон.

Объединяем ячейки задав свойство. Или при помощи метода:

Таким способом можно получать код практически для любых необходимых манипуляций.
А если какое-то свойство или метод вызывает вопросы, то можно воспользоваться справкой на MSDN.

Обратите внимание на особенность работы с массивами в VBA. Индексы в массивах в Delphi оборачиваются в квадратные скобки, в то время как в VBA они будут в круглых. И код в Delphi

в VBA будет выглядеть как

Ниже приведу небольшой FAQ по вопросу взаимодействия с Excel из Delphi

Как определить значения констант в Excel для использования в Delphi?

В редакторе VBA ставим точку остановки напротив интересующей константы. Нажимаем выполнить и когда выполнение остановиться, наводим на интересующую константу:

Как отключить выводы сообщений в Excel?

Как получить список книг из Excel?

Как отключить отображение сетки?

Как вывести текущий лист на предпросмотр печати?

Как выделить жирным часть текста в ячейки?

Как выполнить автоподбор высоты строки для склеенной ячейки?

Как получить используемый диапазон ячеек?

Как получить букву столбца по индексу?

Печать из delphi в excel по шаблону

В Excel создан шаблон на Листе1, в который подтягиваются данные из строки с Листа2. Этот шаблон необходимо распечатывать после каждого введения новых значений в строку. Вопрос: Возможно ли на Листе2 создать список всех необходимых значений так, чтобы после нажатия на иконку «печать» с Листа1 распечатались шаблоны с каждым из уже введённых значений на Листе2?

Например: на Листе2 вводим список из цифр 1 2 3 4 5; нажимаем на печать (перед этим можно выделить этот список); на печать выводится лист с цифрой 1, лист с цифрой 2 и т.д. — итого 5 листов.

В Excel создан шаблон на Листе1, в который подтягиваются данные из строки с Листа2. Этот шаблон необходимо распечатывать после каждого введения новых значений в строку. Вопрос: Возможно ли на Листе2 создать список всех необходимых значений так, чтобы после нажатия на иконку «печать» с Листа1 распечатались шаблоны с каждым из уже введённых значений на Листе2?

Например: на Листе2 вводим список из цифр 1 2 3 4 5; нажимаем на печать (перед этим можно выделить этот список); на печать выводится лист с цифрой 1, лист с цифрой 2 и т.д. — итого 5 листов. MiK

Сообщение В Excel создан шаблон на Листе1, в который подтягиваются данные из строки с Листа2. Этот шаблон необходимо распечатывать после каждого введения новых значений в строку. Вопрос: Возможно ли на Листе2 создать список всех необходимых значений так, чтобы после нажатия на иконку «печать» с Листа1 распечатались шаблоны с каждым из уже введённых значений на Листе2?

Например: на Листе2 вводим список из цифр 1 2 3 4 5; нажимаем на печать (перед этим можно выделить этот список); на печать выводится лист с цифрой 1, лист с цифрой 2 и т.д. — итого 5 листов. Автор — MiK
Дата добавления — 06.02.2014 в 01:13

Илон Маск рекомендует:  Что такое код getdosenvironment
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL