Программирование 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 -группа Книги/Листы —Книги —Заполнить по шаблону
Команда Заполнить по шаблону создает множество заполненных на основании выбранного шаблона файлов из данных в таблице Excel. Например, есть таблица с продукцией примерного такого вида:
Только строк не один десяток и необходимо создать ценники на весь перечисленный товар по шаблону:
и либо распечатать, либо создать на каждый товар по отдельному файлу. Вручную делать такое не просто нудно — это к тому же займет кучу времени.
Однако, если шаблон привести к нужному виду, а в таблицу добавить еще одну строку — то можно использовать команду Заполнить по шаблону и она за несколько минут(зависит от вида шаблона и количества данных для заполнения) сделает все сама.
Естественно, программу можно применять не только для заполнения ценников, но и для заполнения любых шаблонных форм: договора, анкеты, квитанции, накладные, штапмы, открытки для рассылок и т.п. Например, если ведется учет клиентов компании в таблице и периодически на основании этих данных заполняются файлы договоров на продление услуг, дополнительные соглашения, ежемесячные акты выполненных работ и т.п., то данная команда избавит от необходимости делать это каждый раз вручную. Достаточно на каждый случай составить по одному шаблону и далее просто на основании уже имеющегося списка просто заполнять шаблоны.
Подготовка данных (файл 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
Albinos_x |
|
|
Albinos_x |
|
|
|
||||||||||||||||||||||||
Правила форума «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