Delphi заполнение word шаблона
В этой статье мы рассмотрим пример того, как управлять объектами Word-а (Excel - аналогично) из программ на Delphi.
Для чего это нужно ?
Задачи могут быть самые разные, в общем случае это использование возможностей Word-а в своей программе, н-р: проверка текста на орфографию; печать текста, графики; экспорт отчетов в Word или изначальное создание их там и т.д.
Подготовительные работы.
На самом деле существует несколько способов сделать это, мы рассмотрим только один (пример кроме Delphi 5, в Delphi5 для этого есть компоненты на закладке Servers переименуете в программе типы на соответствующие компоненты, дальше так же).
Для начала начнем новый проект File, New Application; File, Save All. Создадим отдельную папку для проекта и сохраним Unit1 как Main, а Project1 как WordWriter.
Далее для работы с Word-ом нам потребуется библиотека типов Word-а, это делается так: Project, Import Type Library, Add, далее переходим в папку, где стоит Word ( у меня это - "c:\program files\microsoft office) , заходим в папку Office и выбираем файл - msword8.olb (цифра -? версии Word-а - у Вас может отличаться ) или excel8.olb (для Excel).Нажимаем Оk. Delphi создаст 2 файла - Word_tlb.pas и Office_tlb.pas, их надо включить в раздел uses модуля Main нашего проекта:
Теперь займемся непосредственно программированием.
В разделе var опишем следующие переменные:
Далее проектируем форму:
- Поместим вверх нашей формы кнопку - button1 типа tbutton, поменяем заголовок (св-во Caption) на 'Старт'.
- Под кнопкой разместим панель - panel1 типа tpanel. Внутри панели поместим компонент - bevel1 типа tbevel, поменяем св-во Align на alClient (при этом рамка растянется на всю панель).
- Сверху панели (далее все компоненты будут размещаться внутри этой панели) разместим метку - label1 типа tlabel, поменяем значение св-ва Caption на 'Передать в ячейку':
- Ниже слева поместим метку - label1 типа tlabel, св-во Caption поменяем на 'X='
- Правее метки помещаем компонент Edit1 типа tEdit, св-во Text меняем на '1'
- По правой границе Edit1 помещаем компонент UpDown1 типа tUpDown, в списке св-ва 'Associate' выбираем Edit1, св-во 'Position' приравниваем '1'
- Чуть отступаем вправо и повторяем шаги 4-6 , заменив Edit1 на Edit2, UpDown1 на UpDown2, Label1 на Label2 соответственно.
- Ниже размещаем еще одну метку - label4 типа tlabel, меняем св-во 'Caption' на 'Новое значение ячейки:'
- Ниже размещаем компонент Edit3 типа tEdit, св-во Text меняем на '0'
- И, наконец, в самом низу панели размещаем кнопку BitBtn1 типа tBitBtn, меняем св-во 'Kind' на 'bkOk'.
Теперь напашем обработчики - именно в них и заключается вся функциональность программы:
1. Назначим обработчик OnClick компоненту Button1 :
2. Зададим обработчик формы:
3. Назначим обработчик OnClick компоненту Bitbtn1 :
Дополнительная информация
Справка Word-а (по Visual Basic, по умолчанию она не ставится - запустите заново Setup и поставте в соотв. месте галочку)
- Чарльз Калверт "Delphi 4. Энциклопедия пользователя" (издательство - DiaSoft)
- Марко Кэнту "Delphi4 для профессионалов" (издательство - Питер)
Если у Вас другая версия Word-а:
Параметры ф-ций могут отличаться - обратитесь к справке (см выше) или если у Вас версия Delphi 3 и выше, то используем универсальный метод - пишешь имя объекта, ставишь точку (если нужно посмотреть список параметров у функции , то после открывающей скобки ) , нажимаешь 'ctrl'+'пробел' и изучаешь существующие методы и св-ва.
Очень часто программисты задаются вопросом – «Как же вывести данные из программы в MS Word?» как только они доходят до вывода отчетов. 99% людей используют стандартные компоненты, которые ужасны в использовании и на написание вывода информации уходит очень много времени. Я научу вас как легко и непринужденно это сделать, добавив пару функций, написанных мной, и создать сам файл в MS Word. Ведь намного удобнее и проще использовать готовый шаблон, сделанный самим, нежели всё делать из программы, не так ли? Особенно для вывода прайс-листов, договоров и тому подобные документы. Для вывода отчетов лучше использовать MS Excel. Если интересует, то статья на эту тему тоже есть. Также необходимо будет добавить пару функций.
Не забываем, что для каждой формы, где будет вывод данных, необходимо проделывать все эти действия. Если, конечно, вы порядочный программист, то можете сделать библиотеку или класс. Всё на ваше усмотрение. На всякий случай опишу подробнее, куда и что прописывать.
Заметим, что TF_MAin – это мой идентификатор формы. У вас этот параметр будет отличаться. Его можно посмотреть в «interface»->«type» первой строкой TF_MAin = class(TForm).
Не забываем, что в файле необходимо расставить эти слова в формате . Только на английском и именно в таких скобках. Чтобы он случайно не заменил другой текст. На самом деле вы можете заменять любые слова, только порой это будет чревато. А так уж точно не замените другой текст.
Не забудьте, что необходимо предварительно создать файл Word. Я создал файл «NameDoc.doc» в папке «report» и внутри файла написал <%DATE%>, дабы заменить его на сегодняшнюю дату.%DATE%>
В общем - то , и всё . Очень подходит для вывода договоров предприятия. Согласитесь, что проще взять готовый договор и где необходимо подставить изменяемые значения, к примеру - Итого: <%SUMMA%>руб. Дата: , нежели мучиться и подгонять данные из программы.%SUMMA%>
Замечу, что все стили сохраняются, то есть при замене будет жирным подчеркнутым курсивом.
Репутация: нет
Всего: 3
Скажите, пожалуйста, как происходит работа с шаблонами MS Word с помощью Delphi. Т.е. есть подготовленный шаблон в MS Word'e, а в нужные поля этого шаблона должна пуступать информация из программы. если можно поделитесь информацией или примерами по данному вопросу.
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это.
Репутация: 5
Всего: 130
Репутация: нет
Всего: 3
Цитата(Данкинг @ 5.1.2010, 18:41 ) |
Конкретно с шаблоном не работал, но вот пример заполнения нужных полей в файле .doc: |
А как при этом должен выглядеть документ ворда, нужно ли там , обрамлять в тег var.
Просто хотелось бы увидеть пример, чтобы он показывал:
1. как создать в *.dot переменные (сейчас вычитал, что это так называемые bookmark'еры), чтобы в них попадала информация из нашей программы. как должен выглядеть наш код, который передавал бы конкретные значения в наши переменные заданные в *.dot
2. в шаблоне помимо текста будет таблица динамическая, ее размер - число строк и колонок должно формироваться из программы, возникает вопрос во-первых как программно сформировать такую таблицу и вывести ее в нужном месте.
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это.
Репутация: 1
Всего: 1
1. Вашу задачу в двух словах не решить. Ознакомьтесь с азами работы в MS Office из Delphi, например в книгах:
Корняков В.Н. Программирование документов и приложений MS Office в Delphi. - СПб.: БХВ-Петербург,2005.
Архангельский А.Я. Приемы программирования в Delphi на основе VCL. - М.: БИНОМ, 2006
2. Непонятно, зачем использовать шаблоны, если текст документа формируется динамически из программы. Шаблоны целесообразно использовать в документах типа квитанций или платежек, где объем вставляемого программно текста намного меньше статического.
Вот простейший пример, от которого можно начинать плясать
Код |
uses ComObj; var W,Range,Table: Variant; . |
Вот, собственно, и почти все приемы, которые вам понадобятся. Подробнее о настройках есть в книгах
Репутация: 1
Всего: 1
Цитата(Delphist @ 6.1.2010, 09:47) |
А как при этом должен выглядеть документ ворда, нужно ли там , обрамлять в тег var. |
PS. Прошу прощения, не нашел, как объединить 2 поста в один. Уважаемый модератор, не судите строго за 2 поста подряд.
Репутация: 5
Всего: 130
Цитата(Delphist @ 6.1.2010, 09:47 ) |
А как при этом должен выглядеть документ ворда, нужно ли там , обрамлять в тег var. |
Нет, просто я обрамляю тегами для удобства. А по факту - в моём примере реализуется просто поиск-замена слова.
Репутация: нет
Всего: 4
0. Создаем функцию, которая должна вернуть значение тега по его имени "_TagText".
Код |
function GetKeyValueByName(_TagText:string):string; begin result := '$' + _TagText + '$'; end; |
1. Настраиваем поиск. все переменные "_ИмяПеременной" типа OleVariant;
2. Ищем и заменяем ключи
Код |
while fWApp.Selection.Find.Execute( _FindText, _MatchCase, _MatchWholeWord, _MatchWildcards, _MatchSoundsLike, _MatchAllWordForms, _Forward, _Wrap, _Format, _ReplaceWith, _Replace, _MatchKashida, _MatchDiacritics, _MatchAlefHamza, _MatchControl ) do begin vTagText := fWApp.Selection.Text; //Найденый текст выделен vTagPosBeg := fWApp.Selection.Range.Start;//Его начальная позиция(от начала документа) vTagPosEnd := fWApp.Selection.Range.End_;//Его конечная позиция(от начала документа) // Можно добавить информацию о найденом фрагменте в массив. //TagPosAdd(vTagText, vTagPosBeg, vTagPosEnd); //. но мы сразу подменяем текст fWApp.Selection.Text := GetKeyValueByName(vTagText); end; |
PS:
Лучше сохранять в массив объект fWApp.Selection.Range т.к. при изменении текста перед найденым фрагментом не нужно заботиться о смещении позиции.
1. Публиковать ссылки на вскрытые компоненты
2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
[ Время генерации скрипта: 0.1370 ] [ Использовано запросов: 21 ] [ GZIP включён ]
Продолжаем разбираться с IDE Delphi 2010 и сегодня рассмотрим ещё один момент работы — шаблоны кода (templates). Впервые возможность использования собственных шаблонов кода при работе в Delphi была реализована (если я не ошибаюсь) ещё в Borland Delphi 2006. Но, тем не менее, далеко не все и не всегда пользуются этой замечательной возможностью.
Для чего нужны Templates? Основная их задача — автоматизировать процесс написания часто используемых частей кода. Думаю, что большинство тех, кто перешел на новую версию Delphi, скажем, с Delphi 6-7 были приятно удивлены, когда при после написания begin в редакторе и нажатии Enter в редактор автоматически добавился end. Аналогично могут завершаться try..except..end, if..then..else и т.д. Главное настроить шаблоны так как Вам это необходимо.
Все шаблоны кода Delphi 2010 представляют собой xml-файлы, которые хранятся в директории (при установке по умолчанию):
c:\Program Files\Embarcadero\RAD Studio\7.0\ObjRepos\en\Code_Templates\Delphi\
Всего в начале Вам доступно 33 шаблона. Чтобы просмотреть все доступные шаблоны кода можно выбрать в меню Delphi «View — Templates»
В редакторе шаблонов можно изменить шаблон, добавить новый, удалить и т.д. Конечно 33 различных шаблона вполне достаточно для работы, но может оказаться так, что и их окажется недостаточно. Например, Вы пишете программу, которая использует какие-либо данные из Интернет. Часто в таких программах присутствуют функции открытия ссылки в браузере по умолчанию. Код выглядит следующим образом:
name — имя точки, используемое парсером при вставке шаблона
hint — подсказка.
все теги point вставляются после description до раздела code. Если в шаблоне необходимо определить 2 точки, то, соответственно в коде шаблона должны быть определены 2 тега point и т.д.
5. Записываем код шаблона. В начале определяем необходимые значения атрибутов узла code.
language — язык в котом используется шаблон. В нашем случае — это Delphi.
delimiter — разделитель. Разделители используются для того, чтобы парсер мог определить в каком месте вставлять jump point. Обычно, в качестве разделителя ипользуется символ «|».
Код Delphi, который будет вставляться в редактор записывается в секции CDATA узла code. После того как определены атрибуты у узла code и записан код шаблона у Вас должно получиться примерно следующее:
Как видите, название jump point обрамлено двумя delimiter’ами.
6. Сохраняем шаблон с названием url.
Теперь можете открыть редактор кода какого-нибудь своего приложения, набрать url и нажать пробел. Вместо url должен вставиться наш только что созданный шаблон.
В приведенном выше примере мы использовали простой шаблон, автоматизирующий вставку метода ShellExecute. Также можно создавать более сложные шаблоны, которые могут использоваться, например, для обрамления (surround) частей кода.
Книжная полка
Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
Описание: Книга рассчитана на подготовленного пользователя ПК, желающего самостоятельно научиться программировать и разрабатывать приложения и базы данных в среде Delphi. Опытные программисты смогут использовать издание как справочник. В тексте подробно описаны более 80 компонентов VCL, функции Object Pascal и Win32 API.
Описание: Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.
Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).
Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:
Всё достаточно просто. Далее мы можем работать с объектом следующим образом:
- Создавать документ Word с нуля
- Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.
Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.
1. Создание документа Microsoft Word в Delphi с нуля.
Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:
и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:
Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:
Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:
где index — номер документа в коллекции.
Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.
Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:
При выполнении этих трех операции Range содержал весь документ.
Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:
Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:
Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.
Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.
В данном случае я вывел на экран последнее слово в документе.
Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.
2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.
Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:
Метод Open можно вызывать с несколькими аргументами:
- FileName: string — путь и имя файла;
- ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
- ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
- AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
- PasswordDocument: string — пароль для открытия документа
- PasswordTemplate: string — пароль для открытия шаблона
- Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
- WritePasswordDocument: string — пароль для сохранения измененного документа в файле
- WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
- Format:integer — формат открываемого документа.
Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:
В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.
Что касается последнего аргумента — Format, то он может принимать целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.
Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.
Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? :) Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet :)
Читайте также: