Собранные версии компонента с примерами использования
Архив на Яндекс.Диск
Файлы в архиве
Файлы для Delphi 7
- ОписаниеРазработки.txt — этот файл.
- WordReport70.zip — исполняемые файлы и ресурсы компонента.
- WR_ExampleD7.zip — пример применения компонента.
- WordReport70src.zip — исходные коды компонента.
Файлы для Delphi XE3
- ОписаниеРазработки.txt — этот файл.
- WordReport170.zip — исполняемые файлы и ресурсы компонента.
- WordReport170src.zip — исходные коды компонента.
- WR_ExampleDXE3.zip — пример применения компонента.
Назначение
Компонент предназначен для автоматизации создания отчетов через MS Word.
Как исходный шаблон, так и готовый отчет представляют собой обычные документы Word, что обеспечивает пользователю самыме богатые возможности редактирования, предпросмотр и печать без каких-либо дополнительных средств.
Программные требования
- Borland Delphi или Embarcadero RAD Studio XE3.
- Microsoft Word 2000 и выше.
Установка
- Извлечь файлы из WordReport(Version).zip в директорию с установленной Delphi (например, WordReport70.zip в «C:Program Files (x86)BorlandDelphi7»).
- Запустить Delphi.
- Выбрать пункт меню Component >> Install Packages…
- Нажать кнопку Add… и выбрать файл WordReport(Version).bpl в DelphiBin (например, WordReport70.bpl в «C:Program Files (x86)BorlandDelphi7BinWordReport70.bpl»)
- Компонент готов к работе. Его можно найти на вкладке WordReport.
Инструкция
Правила создания шаблонов
Шаблон в нашем случае — это документ MS Word (именно документ — т.е. файл *.doc, а не *.dot !), составленный по определенным правилам.
-
Секция — это диапазон шаблона, который должен повторяться в результирующем документе столько раз, сколько требуется для вывода всех записей привязанного к секции набора данных.
-
Каждая секция должна быть отмечена закладкой с именем DataN, где N — целое число от 1 до 8.
Повторяться будет ТОЛЬКО то, что в диапазоне закладки, поэтому закладкой лучше отмечать всю строку документа целиком. Если секция используется
для повторения строки таблицы, то отмечать закладкой следует также всю строку документа, в которой находится эта строка таблицы. -
Существует три категории переменных шаблона:
-
переменные вне секций
Синтаксис объявления: #(ИмяСвободнойПеременной)
Способ определения значения: напрямую, методом SetValue -
переменные секций
Синтаксис объявления: #(ИмяСекции(ИмяСчетчика).ИмяПеременной)
Способ определения значения: из текущей записи привязанного поля набора данных. -
счетчики записей секций
Синтаксис объявления: #(ИмяСчетчика)
Объявление действительно только внутри секции.
Заменяется на текущий номер записи привязанного набора данных при отсутствии групп секций
или на номер записи в неразвывной последовательности при группировке секций.
-
ИмяСвободнойПеременной — ненулевая последовательность латинских букв, цифр и точек (только букв, цифр и точек, никаких других знаков!). Регистр букв не важен.
-
ИмяПеременной — ненулевая последовательность латинских букв и цифр. Регистр букв не важен.
-
ИмяСчетчика — ненулевая последовательность латинских букв и цифр. Регистр букв не важен.
-
ИмяСекции — ненулевая последовательность латинских букв и цифр. Регистр букв не важен.
-
Максимальное количество переменных в секции — 16.
-
Максимальное количество секций в документе — 8.
-
Максимальное количество переменных вне секций — 2^31 — 1, то есть верхняя граница 32-битного целого типа.
Описание функционала компонента
Свойства времени разработки
Имя документа, содержащего шаблон
TemplateDocFileName: string
Имя документа, в котором следует сохранить готовый отчет
ResultDocFileName: string
Показать MS Word c готовым отчетом при вызове Quit
ShowResult: boolean
Свойства времени выполнения
Массив секций документа.
Доступ по имени секции.
Если секция не найдена — возвращает nil.
Bands[Name:string]: TDataBand
Количество секций документа.
BandCount: integer
Методы
Существует ли в шаблоне секция с именем BandName.
function BandExists(BandName: string): boolean;
Сохранить документ в файле FileName.
procedure SaveToFile(FileName: string);
Выйти. Завершает процесс MS Word или показывает готовый документ.
procedure Quit;
Сформировать отчет. Выполняет все операции для формирования одного отчета, сохраняет и закрывает полученный документ.
Однако, сам Word остается запущенным для формирования следующих отчетов.
procedure Build;
Установить значение свободной переменной.
procedure SetValue(VariableName:string; Value:Variant);
Связать две соседние секции вместе
так чтобы они чередуясь выводили записи из одного и того же набора данных (НД).
Однако, для этого требуется указать целочисленное поле в НД,
значение которого и будет определять, какую именно секцию использовать для вывода текущей записи.
procedure JoinBands(BandKeyField:string; BandName1:string; KeyValue1:integer; BandName2:string; KeyValue2:integer);
События
Событие наступает после прочтения структуры документа-шаблона,
т.е. тогда, когда имена всех секций (bands) и переменных уже определены, но
этим переменным еще не установлены значения или поля набора данных (НД).
OnReadMaket:TNotifyEvent;
Объект секции документа (TDataBand)
Свойства времени выполнения
Имя секции документа.
Name: string
Имя поля для переменной VarName.
Field[VarName:string]: string
Формат вывода переменной.
Format[VarName:string]: string
Методы
Подключить набор данных к секции.
Параметром служит указатель на TDataset, т.е. вызов производится так:
AssignDataSet(@IBQuery1) или AssignDataSet(@ADOTable1).
procedure AssignDataSet(aDataSet: PDataSet);
Установить переменной VariableName из секции поле FieldName набора данных, подключенного к этой секции.
Если поле содержит действительные числа, то лучше использовать маску формата для их отображения,
например %10.2f (полный список форматов см. в описании функции SysUtils.Format).
Во всех других случаях значение параметра формат можно оставить пустой строкой, т.к. это ни на что не повлияет
procedure SetField(VariableName,FieldName,Format:string);
Обработка события OnReadMaket
Так как каждый шаблон уникален и содержит свой неповторимый набор секций и переменных, то и связывание этих секций и переменных со своими
значениями также процесс уникальный, а потому не может быть до конца автоматизирован внутри самого компонента. Эту задачу предстоит решить пользователю компонента.
Специально для этой цели и было создано данное событие.
В обработчике этого события НЕОБХОДИМО произвести связывание:
- имен переменных с их значениями (TWordReport.SetValue),
- секций с их заполненными наборами данных (TDataBand.AssignDataset),
- переменных в секции с их полями (TDataBand.SetField),
- а также, если это нужно — формирование групп секций (TWordReport.JoinBands)
Подробнее об этом в примере приложения.
Иные версии Delphi
Если нужен компонент для другой версии Delphi — используйте исходные коды, чтобы собрать пакет на своей Delphi, а затем скопируйте его:
- 32-битную release версию bpl — в поддиректорию bin
- 64-битную release bpl — в bin64
- 32-битную release версию dcu вместе с файлами WordReport.dcr и wrtprogress.dfm в libwin32release.
- 64-битную release версию dcu вместе с файлами WordReport.dcr и wrtprogress.dfm в libwin64release.
- Отладочные DCU, если они нужны, копируются в libwin32debug и libwin64debug уже без файлов ресурсов.
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).
Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:
uses ComObj; var Word: variant; [...] procedure CreateWord(const Visible: boolean); begin Word:=CreateOleObject('Word.Application'); Word.Visible:=Visible; end;
Всё достаточно просто. Далее мы можем работать с объектом следующим образом:
- Создавать документ Word с нуля
- Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.
Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.
Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:
[...] Word.Documents.Add [...]
и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:
[...] Word.Documents.Add(TamplatePath:string); [...]
Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:
[...] var List: TStringList; i: integer; begin List:=TStringList.Create; for i:=1 to Word.Documents.Count do List.Add(Word.Documents.Item(i).Name); end; [...]
Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:
Word.Documents.Item(index).Activate
где index — номер документа в коллекции.
Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.
Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:
[...] Word.ActiveDocument.Range.InsertBefore('Hello World'); Word.ActiveDocument.Range.InsertAfter('текст после Hello World'); Word.ActiveDocument.Range.InsertAfter('окончание строки в документа'); [...]
При выполнении этих трех операции Range содержал весь документ.
Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:
var MyRange: variant; begin MyRange:=WordActiveDocument.Range(50,100); MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо end;
Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:
[...] ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе [...]
Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.
Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.
[...] ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text) [...]
В данном случае я вывел на экран последнее слово в документе.
Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.
2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.
Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:
var FilePath: string; [...] Word.Documents.Open(FilePath) [...]
Метод 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, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:
[...] Word.Documents.Open(FileName:=FilePath, ReadOnly:=true) [...]
В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.
Что касается последнего аргумента — Format, то он может принимать целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.
Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:
function FindAndReplace(const FindText,ReplaceText:string):boolean; const wdReplaceAll = 2; begin Word.Selection.Find.MatchSoundsLike := False; Word.Selection.Find.MatchAllWordForms := False; Word.Selection.Find.MatchWholeWord := False; Word.Selection.Find.Format := False; Word.Selection.Find.Forward := True; Word.Selection.Find.ClearFormatting; Word.Selection.Find.Text:=FindText; Word.Selection.Find.Replacement.Text:=ReplaceText; FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll); end;
Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.
Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet
3.1
8
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
5 минут назад, wamaco сказал:
Можно с MS офисом работать через ADO!
Работает даже без установленного офиса!
Делал такое…
Хахахаа, это как без установленного??? Это на ADO)). Технология автоматизации подразумевает установленный офис, так так файл, допустим doc, делается самим движком MS word. Программа дает команда, открыть ворд, сделать пустой файл, свтавить строку и тд. И куда буду передаваться команды без ворда? Прога просто скажет, что у тебя на зарегистрирован класс (не помню какой).
Да поправьте меня, гуру, если я не прав?!
Изменено 10 марта, 2017 пользователем Vitaldj
Название: Программирование документов и приложений MS Office в Delphi.
Автор: Корняков В.
2005.
Книга посвящена созданию приложений в среде Delphi для работы с текстом, таблицами, объектами, диаграммами, макросами, настройками параметров страниц и др. в документах MS Word и Excel. Большое внимание уделено объектным моделям документов MS Office. Рассмотрено программирование элементов управления редакторов MS Word и Excel, а также создание динамических библиотек, которые можно использовать в макросах документов MS Office. Приведены варианты программной реализации типовых задач и ответы на типовые вопросы, с которыми встречаются разработчики.
Содержание.
ЧАСТЬ I. ОСНОВЫ И ОБЩИЕ ПРИНЦИПЫ РАЗРАБОТКИ ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS OFFICE ИЗ ВНЕШНИХ ПРОГРАММ
Глава 1. Объектные модели MS Office
Глава 2. Особенности встроенного языка программирования MS Office
Глава 3. Общие принципы создания контроллеров автоматизации MS Office
Глава 4. Обзор инструментов среды разработки приложений Delphi для работы с MS Office
ЧАСТЬ II. РАЗРАБОТКА ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS WORD В DELPHI
Глава 5. Работа с объектом Word.Application
Глава 6. Создание простого документа
Глава 7. Создание таблиц и работа с ними
Глава 8. Работа с объектами в документе Word
Глава 9. Работа с объектом Word.Basic
Глава 10. Программирование свойств MS Word
ЧАСТЬ III. РАЗРАБОТКА ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS EXCEL В DELPHI
Глава 11. Работа с объектом Excel .Application
Глава 12. Работа с ячейками
Глава 13. Работа с объектами в книге Excel
Глава 14. Диаграммы в рабочей книге Excel
Глава 15. Печать
Глава 16. Программирование свойств MS Excel
ЧАСТЬ IV. РАЗРАБОТКА В DELPHI И ИСПОЛЬЗОВАНИЕ ДИНАМИЧЕСКИХ БИБЛИОТЕК ДЛЯ РАБОТЫ С MS OFFICE
Глава 17. Создание пользовательской библиотеки DLL
Глава 18. Использование DLL в макросах MS Office.
Запись и чтение текста документа.
Для того чтобы работать с документом, он не обязательно должен быть активным, но для удобства в основном будем рассматривать примеры работы с активным документом.
Рассмотрим объект Range, который входит в объект-документ и является его свойством. Объект Range представляет собой содержание части документа или всего документа. Методы этого объекта позволяют записывать и считывать информацию документа. Воспользуемся этим объектом и его методами для работы с содержимым документа.
Запись текста в документ.
Для начала рассмотрим два метода, которые вставляют (записывают) текст. Метод InsertBefore записывает текст в начало содержимого объекта Range. Метод InsertAfter записывает текст в конец содержимого объекта Range. He нужно забывать, что объект Range может содержать как весь документ, так и его часть, а его методы действуют только на содержимое конкретного объекта Range. Допустим, объект Range включает в себя весь текст документа. Тогда метод InsertBefore вставит текст в начале документа, сместив текст, который уже был в документе.
Бесплатно скачать электронную книгу в удобном формате, смотреть и читать:
Скачать книгу Программирование документов и приложений MS Office в Delphi — Корняков В. — fileskachat.com, быстрое и бесплатное скачивание.
Скачать pdf
Ниже можно купить эту книгу по лучшей цене со скидкой с доставкой по всей России.Купить эту книгу
Скачать книгу — Программирование документов и приложений MS Office в Delphi — Корняков В. — depositfiles
Скачать книгу — Программирование документов и приложений MS Office в Delphi — Корняков В. — letitbit
Дата публикации: 13.07.2011 13:23 UTC
Теги:
книга по программированию :: Delphi :: MS Office :: Корняков
Следующие учебники и книги:
- Наиболее эффективное использование C++ — 35 новых рекомендаций по улучшению ваших программ и проектов — Мейерс С.
- C++Builder 6 — Справочное пособие — Книга 2 — Классы и компоненты — Архангельский А.Я.
- C++Builder 6 — Справочное пособие — Книга 1 — Язык С++ — Архангельский А.Я.
- C++ Библиотека программиста — Джефф Элджер.
Предыдущие статьи:
- C++ Builder — Книга рецептов — Ермолаев В., Сорока Т.
- Ajax в действии — Джеймс Д.
- Серверный JavaScript — Руководство по Использованию — Пирамидин А.
- Практическое введение в программирование на JavaScript — Павел Храмцов.
Delphi | ReportBuilder
Категория: Компоненты Delphi » Компоненты Delphi для работы с офисом
ReportBuilder – среда разработки, которая может использоваться для создания отчетов, компонент отчетов и отчетных приложений.
Поскольку создание отчетности охватывает очень широкий диапазон требований, часто трудно определить те параметры, которым должен соответствовать инструмент разработки. Создатели ReportBuilder свели этот набор требований к следующему уравнению: доступ к данным + обработка данных + форма отчета = готовый отчет (выходные данные отчета).
Доступ к данным – это поиск данных в таблице базы данных, текстовом файле, Delphi-объекте или другом источнике данных (структурированном в виде записей и полей).
Обработка данных предполагает вычисление промежуточных результатов на основе найденных данных и коррекцию отчетной формы при генерации отчета.
Форма отчета – это набор компонент, которые описывают внешний вид страницы отчета и определяют поведение компонент в процессе генерации отчета. Выходные данные отчета – это набор компонент, которые описывают точное содержание каждой страницы. Это уравнение более менее полно закрывает область разработки, известную как создание отчетности. С точки зрения важности каждое слагаемое этого уравнения имеет приблизительно одинаковую значимость. Если какой-либо элемент уравнения не поддерживается или поддерживается слабо, то полезность такого решения для создания отчетов сильно уменьшается. ReportBuilder – это попытка создать продукт, удовлетворяющий этим требованиям. ReportBuilder – это попытка создать продукт, удовлетворяющий этим требованиям.
Скачать бесплатно: с офф сайта