Содержание
- Часть 1. Работа с OLE-сервером Excel.
- 1.1 Получение доступа к интерфейсу Application для Excel.
- 1.2 Интерфейсы и константы
- 1.3 Создание рабочих книг
- 1.4 Вывод информации в ячейки
- Вставка объектов OLE в Word, Excel, PowerPoint с помощью C#
- Вставьте PDF как объект OLE в документ MS Word на С##
- Вставьте документ Word как объект OLE в электронную таблицу Excel на С##
- Добавить PDF как объект OLE в презентацию PowerPoint на С##
- Вывод#
- Вставка объекта в таблицу Excel
Часть 1. Работа с OLE-сервером Excel.
Поставим целью из приложения (контроллера автоматизации) создать документ, изображенный на Рис 1.1. Он типичен с точки зрения созданя прикладных программ, использующих для вывода информации Excel и содержит три наиболее часто используемых составных элемента: текстовое поле, электронную таблицу и диаграмму. Путь создания данного документа — это шаги, которые позволят освоить работу с OLE сервером Excel.
Рис 1.1 Итоговый документ, сформированный контроллером.
Для того, чтобы запустить приложение Word или Excel из программы на «Borland C++ Builder» достаточно выполнить, например, следующий код:
В директории, откуда запущена программы или по указанному пути (например, вместо *.xls указан файл, а вместо параметра NULL путь C:AB) должен находиться файл с расширением соответственно .doc или .xls, пусть даже пустой.
Приложения будут запущены (есть и другие способы запуска), но управлять ими нельзя — с момента запуска они автономны от запустивших их приложений.
Для запуска Word и Excel как серверов автоматизации необходимо выполнить примерно одни и теже действия. Word посвящен следующий раздел, а здесь далее речь пойдет исключительно о сервере Excel.
1.1 Получение доступа к интерфейсу Application для Excel.
1. Включить в проект модули:
2. Определить — лучше глобально (для наглядности и удобства) — переменные, отражающие иерархию объектов Excel
Приложение->Набор книг->Книга->Набор страниц->Страница->ячейки(ячейка):
3. создать объект автоматизации:
Можно видеть у отдельных авторов в некоторых примерах конструкцию вида Excel.Application.9 и т.п. , что не является обязательным, а скорее всего и вредным — ориентация будет на конкретную библиотеку *.olb. Без указания версии Offise приложение берет ее из реестра (HREY_CLASSES_ROOT раздел Word.Application ключ CurVer, там можно прочитать Excel.Application.8 или Excel.Application.9 или . ).
С этого момента можно пользоваться свойствами и методами созданного ole сервера, а именно:
Чтение значения свойства.
1.2 Интерфейсы и константы
Список интерфейсов и констант в Builder можно получить при просмотре библиотеки типов Microsoft Word/Exvel Object Library.
Создав пустое приложение (File/New/Application) и выбрав пункт меню в Buildere File/Open, указав в списке возможных файлов Type Library и выбрав соответствующую библиотеку типов и загрузить ее (для Excel в зависимости от версии это, например, Excel9.olb, для Word — MSWord9.olb). Библиотеки, как правило находится в директории
Загрузка идет несколько минут (библиотеки велики) и по окончании будет создана панель навигатор (Рис 1.2). с описанием всех использованных констант, а также свойств и методов содержащихся в сервере объектов.
Рис 1.2 Библиотека Excel9.olb.
При создании этих файлов появятся сообщения об ошибках, связанные с тем, что в коде Excel и Word могут использоваться зарезервированные слова С++.
После этого возможен просмотр методов и доступ к свойствам и константам указанного интерфейса. Например, для свойства WorkBooks — Application, Creator, Parrent, Add, Close, Count, Item. Open . — это методы, которые в свою очередь имеют свои свойства, которые можно посмотреть на закладке Parametrs.
При использовании констант будем использовать их числовые значения!! — иначе в файл .cpp придется включать модуль с указанием конкретной версии Offise — например:
#include
Как показано на рисунке, например константа xlBuiltIn имеет значение 21.
Поиск и просмотр возможных констант — наиболее частая потребность при написании программы, здесь довольно затруднителен — нет даже меню поиск, поэтому лучше преобразовать информацию из библиотеки в текстовый файл, нажав крайнюю правую кнопочку навигатора (Export to idl), и преобразованный файл появится как файл с расширением .idl в проекте рядом с файлом Unit1.cpp — теперь достаточно сохранить его в удобном месте и для поиска использовать любой текстовый редактор, к примеру встроенный в FAR.
Для продолжения работы после сохранения файла *.idl и закрытия *.olb необходимо вернуться в рабочую директорию проекта.
Свойств и методов для серверов Word и Excel в указанных библиотеках пожалуй не менее чем в компонентах Builder, поэтому для ориентации при написании программ в среде Borland C++ Builder лучше использовать так называемый » хитрый метод «.
Суть его в переводе макроса из кода Visual Basic в С++ код. Этот способ также позволяет просмотреть имена констант линий, стилей, цветов . Уже по именам легко найти их значения в библиотеках и в сохраненном файле .idl.
1. Запустить Ехель.
2. Сервис/Maкрос/Начать запись
3. Выполннить последовательность нужных действий.
4. Остановить запись
5. Вызвать Visual Basic (Alt+F11)
7. Перевести код из кода Visual Basic в С++.
1.3 Создание рабочих книг
Рассмотрим создание двух рабочих книг из 3х и 5ти листов.
Создаем новое приложение (File/New/Application) и сохраним его файлы в директории по умолчанию (Projects) c именами по умолчанию Unit1.cpp, Unit1.h, Unit1.dfm, Project1.cpp, Project1.bpr. Имена на данном этапе не цель, хотя не возбраняется создать новую директорию и дать приложению и файлам подходящие имена.
Переменные соответствующие используемым в программе объектам, а именно:
определим сразу все и глобально — или в файле Unit1.h (в разделе private:), или перед функциями в Unit1.cpp, хотя для данного этапа требуются пока не все переменные и можно определить нужные и локально.
Переменная fStart служит индикатором того, что сервер запущен.
Разместим на форме три кнопки (из вкладки Standart компонент TButton). Подписывать кнопки также не будем (сейчас это тоже не цель), но запомним, что по первой кнопке будем работать с таблицей, по второй с диаграммой, а по третьей закрывать сервер и приложение. Выполним два левых клика по Button1 и Button3, создаем таким образом обработчики события нажатия кнопки.
Третья кнопка таким образом служит для выхода из программы и закрытия сервера.
В обработчике нажатия первой кнопки начнем формировать код программы.
Создаем Объект Excel.Application.
В принципе конструкцию try catch желательно использовать со всеми Ole вызовами, но громоздкость программы сделает ее ненаглядной. В дальнейшем можно оформить все используемые вызовы в виде класса, но на данном этапе задача стоит в освоении богатства возможностей вызовов, а не ловля возможных букашек. Да и все, приведенные сдесь вызовы 100% работоспособны.
Сделаем приложение видимым (лучше наверное всетаки в конце, но так нагляднее — будет видно как идет заполнение таблиц и т.п.).
Переменной vVarBooks присваивается значение Workbooks — свойство объекта Excel.Application, содержащее набор рабочих книг Excel.
SheetsInNewWorkbook задает количество листов в создаваемой книге, пусть в первой книге их будет 3(Кстати по умолчани тоже создается книга, содержащая три листа).
Добавляем книгу из 3 листов в объект vVarBooks.
Количество листов во второй создаваемой книге, пусть будет 5.
Добавляем книгу из 5 листов в объект
Переменная vVarBook содержит ссылку на текущую книгу. (Пусть текущая книга 1).
Переменной vVarSheets присваиваем значение Worksheets — свойство объекта Excel.Application, содержащее набор страниц книги Excel.
Присвоение имен листам книги. Т.е, необходимо взять лист выбранной книги и дать ему имя. Заодно и покрасим листы, для чего в любом графическом редакторе создадим два файла с именами a.gif и b.gif размером в несколько пиаселей и соответственно с желтой и красной заливкой. Размер сумарный файлов менее 1к, но приятнее работать не с белым листом. Файлы должны быть помещены в текущую директорию.
Теперь первый раз запустим приложение и порадуемся что все работает как задумано и на экране две книги Excel и в первой два из трех листов раскрашены.
1.4 Вывод информации в ячейки
Для заполнения таблицы используем датчик случайных чисел. Таблицу будем рисовать в первой книге на желтом листе. Так как перед этим мы работали с первой книгой, то она на данный момент активна.
Основные шаги при заполнении таблицы повторяются:
2. Выбрать ячейку или группу ячеек на выбранном листе. Для отдельной ячейки (x и y координаты ячейки):
Для группы ячеек:
3. Установить режим выравнивания текста в ячейке (ячейках).
Выравнивание текста — вертикальное — Константы
Источник
Вставка объектов OLE в Word, Excel, PowerPoint с помощью C#
OLE означает связывание и внедрение объектов. Он предоставляется Microsoft и позволяет создавать и редактировать документы, содержащие элементы или объекты, созданные различными приложениями.
Например, вы можете встраивать электронные таблицы, изображения и звуковые клипы как объекты OLE в документ Word. Вы можете использовать эти OLE-объекты в документе Word и не беспокоиться о повторном переключении на несколько приложений. Вы можете внедрять или вставлять такие объекты программно, используя OLE в C#.
Эта статья расскажет вам, как вы можете:
Шаги в этой статье и примеры кода используют GroupDocs.Merger для .NET. Поэтому обязательно установите API одним из следующих способов:
- Установите с помощью диспетчера пакетов NuGet.
- Скачать DLL и указать ссылку на нее в проекте.
Вставьте PDF как объект OLE в документ MS Word на С##
Вот шаги и пример кода C#, чтобы показать, как встроить файл PDF в документ Word как объект OLE:
- Создайте экземпляр OleWordProcessingOptions с параметрами внедрения и документом для внедрения в документ Word.
- Теперь создайте экземпляр объекта Merge с путем или потоком исходного документа Word.
- Вызовите метод ImportDocument и передайте объект Параметры обработки текста OLE, заданные на шаге 1.
- Вот и все. Вызовите метод Save, чтобы получить результирующий документ Word, содержащий документ PDF в качестве объекта OLE.
Вставьте документ Word как объект OLE в электронную таблицу Excel на С##
Мы можем встраивать объекты OLE в электронные таблицы Excel. Пример кода CSharp и приведенные ниже шаги, объясняющие, как добавить документ Word в электронную таблицу Excel в качестве объекта OLE:
- Создайте экземпляр OleSpreadsheetOptions с параметрами встраивания и документом для встраивания в электронную таблицу Excel.
- Теперь создайте экземпляр объекта Merger с путем или потоком исходной электронной таблицы.
- Теперь вызовите метод ImportDocument и передайте объект Параметры электронной таблицы OLE, заданные на шаге 1.
- Наконец, вызовите метод Save, чтобы получить результирующую электронную таблицу Excel, содержащую документ Word в качестве объекта OLE.
Добавить PDF как объект OLE в презентацию PowerPoint на С##
Точно так же здесь мы вставляем объекты в презентацию PowerPoint.
- Создайте экземпляр OlePresentationOptions с параметрами внедрения и документом для внедрения в презентацию PowerPoint.
- Теперь создайте экземпляр объекта Объединение с путем или потоком исходной презентации.
- Вызовите метод ImportDocument и передайте объект Опций представления OLE, заданных на шаге 1.
- Наконец, вызовите метод Save, чтобы получить результирующую презентацию PowerPoint с документом PDF в качестве объекта OLE.
Вывод#
Мы обсудили, как легко и быстро мы можем вставлять объекты OLE в документы Word, Excel или PowerPoint программно на C#. Существует лишь небольшая разница в коде для каждой цели, т.е. разные классы параметров OLE и его параметры для каждого формата файла:
- OleWordProcessingOptions для встраивания объектов OLE в документ Word.
- OleSpreadsheetOptions для встраивания объектов OLE в таблицы Excel.
- OlePresentationOptions для встраивания объектов OLE в презентацию PowerPoint.
Вы можете узнать больше об API из документации или Давайте поговорим подробнее @ Бесплатный форум поддержки.
Источник
Вставка объекта в таблицу Excel
С помощью OLE можно включать контент из других программ, таких как Word или Excel.
OLE поддерживается многими различными программами, а OLE используется для того, чтобы содержимое, созданное в одной программе, было доступно в другой программе. Например, можно вставить документ Office Word в книгу Office Excel. Чтобы узнать, какие типы содержимого можно вставить, на вкладке Вставка в группе Текст нажмите кнопку Объект. В поле Тип объекта отображаются только программы, которые установлены на компьютере и поддерживают объекты OLE.
При копировании данных между Excel или любой программой, которая поддерживает OLE, например Word, вы можете скопировать их как связанный объект или внедренный объект. Основные различия между связанными и внедренными объектами заключается в том, где хранятся данные и как обновляется объект после его конечный файл. Внедренные объекты хранятся в книге, в которую они вставляются, и не обновляются. Связанные объекты остаются отдельными файлами, и их можно обновлять.
Связанные и внедренные объекты в документе
1. Внедренный объект не имеет подключения к исходным файлам.
2. Связанный объект связан с исходным файлом.
3. Исходный файл обновляет связанный объект.
Когда использовать связанные объекты
Если вы хотите, чтобы данные в конечный файл обновлялись при исходный файл изменения, используйте связанные объекты.
При связываемом объекте исходные данные сохраняются в исходном файле. В конечном файле отображается представление связанных данных, но хранится только расположение исходных данных (и размер, если объект является объектом диаграммы Excel). Исходный файл должен оставаться доступным на компьютере или в сети, чтобы сохранить связь с исходными данными.
Связанные данные могут обновляться автоматически при изменении исходных данных в исходном файле. Например, если вы вы выбрали абзац в документе Word, а затем вклеили его как связанный объект в книгу Excel, то при изменении сведений в документе Word сведения могут обновляться в Excel.
Когда использовать внедренные объекты
Если вы не хотите обновлять скопированные данные при их внесении в исходный файл, используйте внедренный объект. Версия источника полностью внедрена в книгу. При копировании данных как внедренных объектов в файле назначения требуется больше места на диске, чем при связываи.
Когда пользователь открывает файл на другом компьютере, он может просмотреть внедренный объект, не имея доступа к исходным данным. Поскольку внедренный объект не имеет ссылок на исходный файл, он не обновляется при изменении исходных данных. Чтобы изменить внедренный объект, дважды щелкните его, чтобы открыть и изменить в программе-источнике. На компьютере должна быть установлена программа-источник (или другая программа, которая может редактировать объект).
Изменение способа отображения объекта OLE
Вы можете отобразить связанный объект или внедренный объект в книге точно так же, как в программа-источник или в качестве значка. Если книга будет просмотрена в Интернете и вы не собираетесь ее печатать, вы можете отобразить объект в виде значка. Таким образом уменьшается объем отображаемого пространства, занимаемого объектом. Пользователи, которые хотят отобразить сведения, могут дважды щелкнуть значок.
Источник
Вставка таблицы из Excel в AutoCAD – довольно актуальная задача, если принять во внимание, что часто на листе с разработанным чертежом приходится размещать и сопроводительную спецификацию.
Собственно, AutoCAD имеет и свои инструменты создания таблиц: как черчения – для линий, так и текстовые для наполнения.
Но если:
- необходимо обеспечить в будущем оперативное изменение таблиц более специализированными инструментами, которые в самой популярной программе инженерного проектирования просто отсутствуют;
- таблицы содержат расчёты, которые в будущем могут корректироваться;
- хочется предоставить возможность влиять на процесс сопровождения разработки лицам, не владеющим или не имеющим на компьютере AutoCAD –
тогда решение задачи, как вставить таблицу из Excel в AutoCAD, может очень помочь в работе.
Разработчику необходимо только себе чётко представлять назначение двух режимов работы Автокада – «Модели» и «Листа». Первый, по замыслу разработчиков системы, служит именно для проектирования – черчения. Второй – для подготовки чертежа к печати. Очевидно, что сопроводительные таблицы относятся к справочной информации, которая нужна только при печати, поэтому и место таким объектам только в режиме «Листа». Не стоит вставлять таблицы в Автокад в «Модели» – это искажает всю идею работы приложения (некоторые даже умудряются в «Модели» и рамки делать, и писать комментарий).
Операция вставки – алгоритм по шагам
Обращаем внимание, что рассматриваемое взаимодействие обеспечивает технология объектного связывания – OLE (некоторые приложения называют её ActiveX – активного взаимодействия). Данная технология давно применяется при связи результатов работы всех приложений, входящих в пакет Microsoft Office. Но дело в том, что не все приложения вне «Офиса» поддерживают эту технологию. Возможно, в вашем распоряжении такая версия Автокада, что она эту технологию и не поддерживает. Тогда вывод может быть только один – ставить другую, более новую версию (ну, или пользоваться тем, что предоставляет ваша версия, для черчения вполне подходящая).
Кроме того, работа по OLE-технологии при решении вопроса, как вставить таблицу Эксель в AutoCAD, немного отличается от выполнения той же задачи, например, в связке Excel – Word (или, например, PowerPoint).
Там, мы сначала создаём таблицу в Excel, а затем уже проводим её «специальную» вставку в Word. Работа в связке Autocad-Excel немного другая.
Здесь:
- Находясь в режиме «Листа» Автокада, идём в меню Insert/OLE Object («Вставка»/«OLE-объект»).
Вставка OLE-объекта в Автокаде
- В открывшемся окне выбираем переключатель «Создать новый» и в соседнем списке справа – «Лист Microsoft Office Excel» (возможно, в этом списке будет ещё вариант – «Лист Microsoft Office Excel 97-2003», это если вы умудрились поставить на свой комп несколько версий «Офисов»).
Вставка объекта в Автокаде
- Если этот табличный процессор есть на ПК, система его запускает и перебрасывает нас в работу с листом таблицы – заметьте, макет таблицы уже появился в Автокаде.
- Теперь можно создать необходимое в Экселе.
- При закрытии листа – выходе из программы, результат работы будет вставлен в Автокад. Собственно, вставка производится уже при входе в Excel, но таблица, само собой, пока пустая. При переносе таблицы сохраняется всё назначенное форматирование.
Замечаем некоторые нюансы.
Во-первых, сразу после выхода из таблицы на экране появляется окно настройки созданного объекта – его размер, масштаб, качество при печати (это снова к разговору о назначении режимов Автокада). Обычно данные настройки оставляют такими, какие они предлагаются по умолчанию, тем более что в будущем их можно оперативно изменить. Если нет необходимости, чтобы данное окно свойств появлялось постоянно, то можно сбросить переключатель вывода данного окна (он в его нижней части).
Во-вторых, если перед вставкой не был определён видовой экран, который должен содержать таблицу, то вставка произойдёт в верхний левый угол окна режима, в противном случае – в верхний левый угол видового экрана. Но в любом случае таблицу в будущем можно переместить в нужное место листа.
В-третьих. Не забудем, что это разные вещи – белый цвет заливки и цвет заливки по умолчанию. Изначально в Excel таблицы не имеют заливки своих ячеек – просто отсутствие заливки здесь визуально совпадает с белым цветом. Такое отсутствие заливки в Автокаде превращается в заливку по умолчанию, которая имеет чёрный цвет. Поэтому, если не предпринять никаких действий в табличном процессоре, вставленная таблица будет чёрной, что, вероятно, очень далеко от необходимости. Отсюда вывод – ещё в Excel таблицу нужно будет «залить» цветом, близким к белому (заливка белым ни к чему не приводит) и обеспечить, само собой, вывод линий ячеек.
Но мало того, что таблица будет «чёрной», вы не увидите в ней и никакой информации, так как чёрный цвет содержимого в Экселе помещается на чёрный фон ячеек в Автокаде: чёрный по чёрному, вот и получается «пустота» – давний приём компьютерных дизайнеров. То, что во вставленной таблице что-то есть, вы почувствуете, перейдя в Excel – там таблица отразится так, как надо.
В будущем при двойном щелчке мышкой на такой таблице в Автокаде произойдёт вызов Экселя и переброс в него для редактирования самой таблицы – производимые изменения при выходе отразятся на листе чертежа.
Советуем быть очень аккуратными при изменении размеров таблицы. Не забудем, что её визуальное представление даже в процессоре – это совсем не то, что мы получим при печати. Даже в Excel печать необходимо настраивать, что уж говорить об Автокаде – есть большая вероятность, что ваша таблица просто не поместится не только в выбранный для неё видовой экран, но и на лист в целом, придётся заняться масштабированием.
Замечаем ещё один нюанс – хоть вставка и производится в режиме «Листа», она отражается и в «Модели», что совершенно неприемлемо с точки зрения разработчика – таблица перекрывает сам чертёж. Поэтому вывод один – сначала в «Модели» организуйте специальный слой для размещения таблицы. Этот слой можно будет визуально отключать, чтобы он не загораживал сам чертёж (подобное поведение, кстати, согласуется с самой идеей применения слоёв).
Мы привели алгоритм вставки таблицы, когда она только создаётся. Часто возникает ситуация, что, конечно, разумнее, когда таблица создана заранее и хранится на диске в виде файла.
В этой ситуации при вставке после выбора «Insert»/«OLE-object» нужно выбрать переключатель «Вставка из файла». При нажатии на «ОК» появится стандартный запрос имени файла – окно выбора из содержимого жёсткого диска. Такая вставка уже не вызывает переход к самому Экселю – это удобно, когда его на самом деле пока на компьютере и нет.
При вставке через файл очень полезно установить ещё один «тонкий» переключатель – «Связать с файлом», он обеспечит более «продвинутую» работу. Теперь, изменяя этот файл таблицы в Экселе, вам не нужно заботиться о запуске Автокада – все изменения последний воспримет сразу после запуска и обновления внешних связей.
Имеем в виду и ещё одну небольшую особенность: для Автокада обычное дело – быстрое удаление объектов простым нажатием на клавишу DEL. Но данная возможность не работает с OLE-объектами, их удаляем – вырезаем уже через буфер обмена.
Таблица как гиперссылка
Есть и ещё один способ обеспечить в Автокаде вставку таблицы из Экселя – в качестве гиперссылки любого чертёжного объекта, обычно текстового. Здесь поступаем следующим образом:
- Выбираем объект.
- Идём в меню «Insert»/«Hyperlink» («Вставка»/«Гиперссылка»).
Вставка таблицы как гиперссылки в Автокаде
- В открывшемся окне с помощью кнопки «Файл» и следующего окна выбираем нужный файл.
- Выходим, присваивая объекту гиперссылку при нажатии на «ОК».
Теперь, когда мышка будет заходить на этот объект, она будет сопровождаться ещё и характерным значком гиперссылки с её адресом. Доступ к такому внешнему файлу будет возможен через контекстное меню объекта при выборе команды «Hyperlinks» – все гиперссылки (а их может быть у одного объекта несколько) будут приведены в выводимом рядом окне.
Другие варианты вставки
Некоторые версии Автокада предлагают другой способ решения поставленной задачи. Возможен и такой порядок работы:
- Переходим на вкладку «Вставка» на панели «Связывание и извлечение».
- Выбираем команду «Связь с данными».
- Выбираем таблицу Excel в открывшемся окне.
Можно воспользоваться и вкладкой «Аннотации»:
- Здесь напрямую выбираем команду «Таблица».
- Следом в окне «Вставка таблицы» указываем параметры вставки объекта «На основе связи с данными».
Параметры вставки таблицы в Автокаде
- При выборе любого способа экспорта из Экселя в Автокад будет открыто диалоговое окно «Диспетчер связей данных», в котором и нужно будет указать «Создать новую связь с данными Excel».
- На следующем этапе вводим имя связи (желательно осмысленное, точно отражающее суть).
Ввод имени связи с данными в Автокаде
- Затем выбираем внешний файл (можно указать даже диапазон необходимых рабочих ячеек таблицы).
- При выходе из данного окна по «ОК» в окне «Диспетчера связей данных» отражается список всех связей чертежа. Если выбрать необходимую связь, соответствующая таблица будет отражена в виде миниатюры в поле ниже.
Выбор связи данных в Автокаде
- Выходим из «Диспетчера связей» по кнопке «ОК».
- В Автокаде появляется необходимая таблица.
Обращаем внимание на то, что Автокад может предлагать ещё две полезные команды для работы с таблицами:
- «Загрузить из источника» – позволяет обновить информацию в таблице Автокада из ранее связанной с ней и изменённой таблицы Экселя.
- «Выгрузить в исходный файл» – обновление данных уже в файле Excel после изменения информации в таблице из AutoCAD.
Если в вашем распоряжении версия Автокада, поддерживающая OLE-технологию, то вы без труда сможете повысить уровень своей проектировочной работы, обеспечивая проведение всех расчётов во внешней Excel таблице. Дальше работа уже будет зависеть от уровня поддержки Автокадом OLE и от наличия на ПК самого Экселя, само собой.
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
В одной из статей, посвященных работе с Excel в Delphi читатель с ником Kanti задал весьма не тривиальную задачку — как добраться до диаграммы Excel, внедренной в документ Word и работать с ней. За что Kanti большое человеческое спасибо — приятно, когда читатели интересуются жизнью блога и предлагают новые темы и идеи.
На первый взгляд задача довольно не простая. Однако решение для неё есть. Я пошел немного дальше в решении проблемы и сегодня расскажу вам:
- как работать с объектом Excel, внедренном в документ Word
- как работать с документом Word, внедренным в Excel.
План статьи:
- Азы работы с MS Word в Delphi
- Как работать с объектом Excel, внедренном в документ Word
- Как работать с документом Word, внедренным в Excel
Прежде, чем начать изложение основного материала, следует упомянуть некоторые моменты работы с Word, т.к. в блоге я их не касался, но эти основы пригодятся для освоения основного материала статьи.
1. Азы работы с MS Word в Delphi
Запуск MS Word в принципе ни чем не отличается от запуска MS Excel за одним небольшим исключением — меняется параметр функции CreateOLEObject:
MyWord:=CreateOleObject('Word.Application');
Но, чтобы не повторяться дважды я расскажу ещё один дополнительный момент, который Вам пригодиться для дальнейшей работы: как подключиться к уже выполняющемуся приложению MS Office, чтобы не создавать лишних копий процессов.
Для того, чтобы подключиться к уже запущенному приложению достаточно использовать функцию GetActiveOleObject, единственным параметром которой является имя класса. Например, чтобы подключиться к запущенному приложению MS Word необходмо выполнить:
MyExcel:=GetActiveOleObject('Word.Application')
Соответственно, чтобы не гадать запущена или не запущена та или иная программа пакета MS Office достаточно воспользоваться связкой двух функций:
try MyWord:=GetActiveOleObject('WordApplication'); except MyWord:=CreateOleObject('Word.Application'); end;
Для того, чтобы открыть уже имеющийся документ Word необходимо воспользоваться методом Open объекта Documents, например так:
MyWord.Documents.Open('myword.doc');
После того как документ открыт, Вы можете его редактировать, изменять текст, параметры страницы и т.д., но сегодня нам это не важно. Главное сегодня — научиться работать с объектами. И с этого момента начинается решение первой задачи.
2. Как работать с объектом Excel, внедренном в документ Word
Каждый документ Word имеет коллекцию Shapes, которая позволяет добавлять в документ объекты, созданные и отображаемые с помощью программ-серверов OLE (OLE-серверов). OLE-объекты в документах Word могут отображаться также, как они отображаются в приложениях, предназначенных для их создания и редактирования. Все наверно пользовались редактором формул Math Type? Вот вам простой OLE-сервер. Добавляете OLE-объект формулы в документ — открывается окно Math Type где вы вводите то, что хотите увидеть и потом формула отображается в документе Word.
Другое дело, когда Вы пробуете вставить в документ Word, например файл mp3. В этом случае объект будет отображен в документе в виде ярлыка, но, тем не менее будет внесен в коллекцию Shapes и до него можно будет добраться из Delphi.
Теперь попробуем посмотреть как выглядит добавление OLE-объектов. В простейшем случае Вы открываете Word, создаете документ и выбираете «Правка — Вставить — Объект» и перед Вами открывается окно с перечнем всех OLE-объектов, которые Вы можете использовать в документе. Выбираете объект, вставляете в документ — работаете. Обратите внимание на рисунок — в окне на рисунке как раз отображены всевозможные объекты нашего с Вами исследования.
Для того, чтобы вставить OLE-объект в документ Word из Delphi необходимо воспользоваться методом AddOleObject коллекции Shapes, который имеет следующий вид:
Shapes.AddOleObject(ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Range)
ClassType — имя, используемое для включения указанного объекта OLE. Например, чтобы вставить в документ Word диаграмму Excel следует использовать
для добавления листа Excel, соответственно:
и так далее. В принципе ничего сложного нет — вставить можно, что угодно, хоть exe-файл 
FileName — имя файла, из которого должен быть создан объект. Если этот аргумент опущен, то используется текущая папка. Вы должны указать либо ClassType либо FileName, но никак не одновременно оба параметра.
LinkToFile — True для того, чтобы связать OLE-объект с файлом, из которого он был создан. False, чтобы сделать объект OLE-объект независимым от копии файла, т.е. включить объект в документ Word. Если Вы определили значение для ClassType, аргумент LinkToFile должны быть ложными. Значение по умолчанию False.
DisplayAsIcon — True для отображения объекта OLE в виде значка. Значение по умолчанию False.
IconFileName — Файл, который содержит значок для отображения объекта OLE.
IconIndex -индекс иконки отображения из IconFileName. Значение по умолчанию — ноль.
IconLabel — подпись к иконке объекта.
Range — диапазон, где объект OLE будет размещен в тексте. Объект OLE заменяет выбранный диапазон. Если этот аргумент опущен, объект вставляется автоматически (в текущую позицию курсора в документе).
Давайте теперь продемонстрируем использование этого метода на практике и, заодно, приготовим плацдарм для дальнейшей работы. Рассмотрим как можно вставить чистый лист Excel в документ Word. Причем вставим лист в нужные нам координаты и зададим ему (листу) длину и ширину:
var MyWord: OLEVariant; begin MyWord:=CreateOleObject('Word.Application'); MyWord.Visible:=true; MyWord.Documents.Open(doc); MyWord.ActiveDocument.Shapes.AddOLEObject(ClassType:='Excel.Sheet',Left:=10, Top:=10, Width:=400, Height:=300); end;
Как видите, вместо того, чтобы указать объект Range мы просто расписали его параметры Left, Top, Width и Height. После выполнения этих операций в документе doc аккурат в верху страницы вставиться лист Excel.
Теперь, когда лист вставлен, можно приступать к дальнейшему изучению «глубин» OLE-серверов Microsoft.
Создадим новую переменную, в которой будем хранить ссылку на OLE-объект.
и сразу получим ссылку на наш лист Excel в Word’е:
MyOLE:=MyWord.ActiveDocument.Shapes.Item(1);
Так будет проще разбираться и избавит нас от лишней писанины.
Представим себе, что мы ничего абсолютно не знаем про то, что лежит в MyOLE. Знаем только то, что это элемент из коллекции Shapes и все. Как определить, что мы получили ссылку именно на объект Excel, а не на автофигуру или, ещё хуже, не на файл mp3?
Для того, чтобы получить всю необходимую информацию об OLE-объекте достаточно обратиться к объекту MS Word под названием OLEFormat.
OLEFormat имеет следующие свойства:
| Свойство | Описание |
|---|---|
| Application | Возвращает имя приложения к которому относится объект. В нашем случае вернет «Microsoft Word» |
| ClassType | Возвращает или устанавливает тип класса для указанного объекта OLE, фотографии или поля. |
| Creator | Возвращает 32-битное целое число, которое указывает на приложение в котором был создан объект. |
| DisplayAsIcon | True, если указанный объект отображается в виде значка. Свойство для чтения/записи |
| IconIndex | Возвращает или устанавливает индекс иконки, используемой если DisplayAsIcon True. |
| IconLabel | Возвращает или устанавливает подпись к иконке OLE-объекта. |
| IconName | Возвращает или устанавливает файл программы, в которой хранится икона для объекта OLE. |
| IconPath | Возвращает путь к файлу, в котором хранится иконка для объекта OLE |
| Label | Возвращает строку, которая используется, чтобы определить часть исходного файла для связывания объектов |
| Object | Возвращает объект, который представляет собой объект верхнего уровня интерфейса указанного объекта OLE |
| Parent | Возвращает объект, который представляет собой родительский объект указанного объекта OLEFormat |
| ProgID | Возвращает программный идентификатор (ProgID) для указанного объекта OLE. |
Теперь, используя эти свойства, попробуем получить всю необходимую нам информацию об OLE-объекте.
Вызовем последовательно свойства ClassType и ProgID:
ShowMessage(MyOle.OLEFormat.ClassType); ShowMessage(MyOle.OLEFormat.ProgID);
В моем случае, результатом выполнения операций были две одинаковых строки «Excel.Sheet.12» Так как у меня установлен Office 2007 то версия 12, что и отразилось в сообщениях. У Вас это могут быть 10, 11 или как у меня 12 версии. С помощью номера версии можно будет определять — возможно ли в принципе изменять такие объекты на машине пользователя или нет.
Идем дальше. Итак, мы определили, что объект представляет собой лист Excel. Как получить доступ к Excel? И причем сделать это так, чтобы можно было наш OLE-объект изменить?
Обратимся к свойству Object. Согласно описанию, свойство должно вернуть нам ссылку на объект верхнего уровня. Следовательно, применительно к нашей ситуации — это будет ссылка на объект Excel. Чтобы убедиться в сказанном, сделаем так:
ShowMessage(MyOle.OLEFormat.Object.Application.Name);
то есть получим имя приложения в котором был создан объект. В результате получим сообщение в виде строки «Microsoft Excel«.
Ну, а теперь развязка вопроса — используя ссылку на Excel попробуем написать что-нибудь на листе, например, избитую фразу «Hello World!»:
MyOle.OLEFormat.Object.Application.ActiveSheet.Range['A1'].Value:='Hello World!';
Можете проверить — в ячейку А1 запишется строка. Здесь следует обратить внимание на то, что при записи в Excel мы не использовали свойства ActiveWorkBook, которое обычно предшествует свойству ActiveSheet. Все дело в том, что среди объектов OLE Office нет такого OLE-объекта — вставляется только лист либо диаграмма. По сути диаграмма — это два листа Sheet где на одном находится сам график, а на втором — данные к нему.
Вот таким простым и достаточно понятным способом можно добавлять, изменять и удалять OLE-объекты. Кстати, на досуге можете потренироваться вставлять, активировать, редактировать сразу несколько различных OLE-объектов — принцип работы тот же. Получаете Object и используете его функции.
3. Как работать с документом Word, внедренным в Excel.
Надо сказать, что разработчики в Microsoft весьма неплохо потрудились, чтобы запутать бедных разработчиков :). В начале все просто — как в Word. Есть Shapes у которого в свою очередь есть метод AddOLEObject, с практически теме же параметрами.
Далее, по логике вещей, у Shapes должно быть свойство-объект OLEFormat. Проверяем — действительно есть, но…свойства другие, точнее одно из свойств другое, а большинства вообще нет. Но, мы люди не гордые — будем управляться с тем, что есть:
| Свойство | Описание |
|---|---|
| Application | При использовании без классификатора объектов, это свойство возвращает объект приложения, представляющий приложение Microsoft Excel. При использовании с объектом Qualifier, это свойство возвращает объект приложения, которое использовалось для создания объекта |
| Object | Возвращает OLE Automation объект ассоциированный с OLE объектом |
| Parent | Возвращает объект, который представляет собой родительский объект указанного объекта OLEFormat |
| progID | Возвращает программный идентификатор (ProgID) для указанного объекта OLE. |
Как видите свойств не много. Главное, что осталось свойство Object — вот его мы и попробуем использовать в своих корыстных целях.
За что следует, наверное, сказать спасибо разработчикам Excel, так это за то, что они предусмотрели сразу объект OLEObjects предоставляющий нам в распоряжение все OLE-объекты листа. Используя этот объект мы минуем использование Shapes. Например так:
MyExcel.ActiveWorkBook.ActiveWorkSheet.OLEObjects.Count
Мы получаем число OLE-объектов документа.
MyExcel.ActiveWorkBook.ActiveWorkSheet.OLEObjects(1)
соответственно даст доступ к первому из OLE-объектов документа, а уж с ним-то нам и предстоит работать. Итак, рассмотрим следующую задачку: необходимо вставить в документ Excel пустой документ Word и написать в нем любую строку.
Чтобы не повторяться в применениях метода — вставим в Excel уже готовый документ Word из файла:
... MyExcel.ActiveWorkBook.ActiveSheet.OLEObjects.Add(FileName:=doc, Left:=10, Top:=10, Width:=300, Height:=300); MyOLE:=MyExcel.ActiveWorkBook.ActiveSheet.OLEObjects.item(1); MyOLE.Activate; ShowMessage(MyOle.ProgID); //убедимся, что объект относится к Word ShowMessage(MyOle.Object.Application.Name); //запросим имя приложения MyOle.Object.Application.ActiveDocument.Range.InsertAfter('Привет'); ....
Обратите внимание, в данном случае мы использовали для работы с OLE-объектом не Shapes, а OLEObjects. Попробуйте воспроизвести те же самые действия как в случае работы с Excel из Word, т.е. воспользоваться свойством Object у объекта ObjectFormat. Думаю Вы будите «приятно» удивлены, т.к. в результате запроса имени приложения Вам вернется не Word как ожидалось, а Excel — следовательно работать с OLE-объектом становится невозможно.
Также следует отметить, что прежде, чем приступать к редактированию OLE-объекта, следует его предварительно активировать.
Вот так можно работать с Excel из Word и с Word из Excel и при этом не выходить из Delphi :). Ну, а для чего это использовать — решать Вам. Я только показал Вам возможности работы в Delphi с программами Word и Excel.
Книжная полка
![]() |
Название:Разработка приложений Microsoft Office 2007 в Delphi Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi. |
![]() |
0
0
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сообщения без ответов | Активные темы
Правила форума
При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !
Для форматирования ваших сообщений используйте BBCodes, описание используемых на форуме BBCodes.
| Автор | Сообщение | ||
|---|---|---|---|
|
Заголовок сообщения: Использование вставки в Visio диапазона Excel как OLE-объект
|
|||
|
Привожу вашему вниманию мои исследования по использованию вставки в Visio диапазона из Excel как OLE-объекта со связью . Последний раз редактировалось Nik035 18 янв 2023, 13:14, всего редактировалось 2 раз(а).
|
||
| Вернуться к началу |
|
||
|
BPM |
Заголовок сообщения: Re: Использование вставки диапазона из Excel со связью в Visio
|
||
|
Ссылки на видео экранов — это хорошо, но почему бы сами файлы vsd xls не приложить? Простенький их пример (можно обезличенный). Я например, так и не понял что было продемонстрировано. https://visio.getbb.ru/viewtopic.php?f=29&t=1872
|
||
| Вернуться к началу |
|
||
|
Surrogate |
Заголовок сообщения: Re: Использование вставки диапазона из Excel со связью в Visio
|
|
|
BPM писал(а): Понятие «встроенная связь» между Excel и Visio — полагаю что про это: В первой строке цитаты пропущено ключевое слово, которое я подсветил во второй строке. Оффтоп: Прошу прощения за мой французский Именно об этой возможности эта ветка:
|
| Вернуться к началу |
|
|
Nik035 |
Заголовок сообщения: Re: Использование вставки диапазона из Excel со связью в Visio
|
||
|
Да речь идет о вставке в Visio диапазона из Excel как OLE-объект со связью (не путать с встроенным в Visio объектом Excel, который сам по себе)
|
||
| Вернуться к началу |
|
||
|
Nik035 |
Заголовок сообщения: Re: Использование вставки диапазона из Excel со связью в Visio
|
||
|
BPM писал(а): Ссылки на видео экранов — это хорошо, но почему бы сами файлы vsd xls не приложить? Простенький их пример (можно обезличенный). Я например, так и не понял что было продемонстрировано. Я на форуме — дилетант Файлы приложу — был бы очень признателен если бы кто то по экспериментировал над ними на своих машинах и выявил реальную причину глюков при повторных открытиях таких файлов Цитата: Понятие «встроенная связь» между Excel и Visio — полагаю что про это: https://visio.getbb.ru/viewtopic.php?f=29&t=1872 Это ветку я просматривал — совсем не моя тема, пока не было необходимости в двухсторонних связях. Последний раз редактировалось Nik035 18 янв 2023, 16:44, всего редактировалось 2 раз(а).
|
||
| Вернуться к началу |
|
||
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Прикладываю файл Визио с OLE-объектом Эксель со связью. (размещаться должны в одной папке).
|
||
| Вернуться к началу |
|
||
|
Nik035 |
Заголовок сообщения: Re: Использование вставки диапазона из Excel со связью в Visio
|
||
|
Ссылка на видео по созданию связи Визио с OLE-объектом Эксель (на примере файлов из предыдущего сообщения) https://drive.google.com/file/d/1j2sqk2 … share_link На видео так же показано, что после закрытия открытия связанных файлов — связь работает, но в реальности у другого пользователя (в т.ч. у меня на другой системе) начинаются глюки — связь перестает обновляться (частично или полностью). Глюки типа (только для повторных открытий связанных файлов): Я сейчас уже не скажу относится это только к форматам vsd+xls…или к любым другим сочетаниям. В своей связке отдаю предпочтение vsd(х/м) — т.к меньше весит и сохраняется быстрей.
|
||
| Вернуться к началу |
|
||
|
Surrogate |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
|
|
|
| Вернуться к началу |
|
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Surrogate писал(а): Оффтоп: Nik035 писал(а): Ссылка на видео ох уж эти гифки снятые на 4K мониторе А что с ними не так? монитор не 4К, но широкоформатный…и кроме него не на чем проверить.
|
||
| Вернуться к началу |
|
||
|
Surrogate |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
|
|
|
| Вернуться к началу |
|
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Surrogate писал(а): Оффтоп: Размер файла — долго грузится Мне как проектировщику без широкоформатного ни как — чем больше информации открыто тем лучше.
|
||
| Вернуться к началу |
|
||
|
Surrogate |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
|
|
Оффтоп: Nik035 писал(а): Мне как проектировщику Я сам то гуманитарий! За январь у меня второй внешний монитор сгорел Nik035 писал(а): без широкоформатного ни как По работе конечно, я про то что не надо пытаться выложить гифку с Visio и Excel в которых открыты документы на формате A3! Тут важнее показать принцип, что есть возможность на странице Visio отображать изменения внесенные в Excel (а не показать все столбцы спецификации). Nik035 писал(а): чем больше информации Возможно есть ограничения, когда в Visio на одну страницу А3 внедряешь диапазон Excel, это одно. А когда таких страниц будет 100, это будет требовать уже других системных ресурсов компьютера!
|
| Вернуться к началу |
|
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Цитата: Возможно есть ограничения, когда в Visio на одну страницу А3 внедряешь диапазон Excel, это одно. А когда таких страниц будет 100, это будет требовать уже других системных ресурсов компьютера![/offtop] Согласен — мой вариант это частный случай и что будет когда стр=100 (не знаю)
|
||
| Вернуться к началу |
|
||
|
Виктор-АПТ |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
|
|
Может лучше из Визио в Эксель вставить рамку, или просто графикой Экселя нарисовать? Информация о материалах откуда берется? П.С. Мы же топим за то чтоб из Визио формировать Спецификацию в Эксель, как правило, а тут наоборот.
|
| Вернуться к началу |
|
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Виктор-АПТ писал(а): Сама технология конечно нужная, я хотел рисовать графики в Визио по таблице в Эксель, но это можно макросом делать. П.С. Мы же топим за то чтоб из Визио формировать Спецификацию в Эксель, как правило, а тут наоборот. Все верно — наоборот. Но для частного (мало понимающего в шейпах и прочих нюансах Визио) проектировщика — это более предпочтительный вариант. Нужно изменить оборудование, наименование, добавить что то новое — не проблема — эксель легко дополнить. При работе Ole — объекты из эксель в визио обновляется одновременно с внесенными в связанный файл эксель изменениями. Вариант из Визио формировать Спецификацию в Эксель это больше для более продвинутых пользователей и я так понимаю, что в сформированной спецификации уже не нужно будет считать то что отображено на схеме и имеет свою позицию/обозначение и внесено в какой либо реестр/базу данных. Не претендую на правоту но при таком варианте скорее всего возникнут трудности с новым оборудованием с внесением его в базу и наверно с чем то еще. Для широкой массы пользователей и меня в частности — это проблема.
|
||
| Вернуться к началу |
|
||
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Виктор-АПТ писал(а): Может лучше из Визио в Эксель вставить рамку, или просто графикой Экселя нарисовать? Информация о материалах откуда берется? Просто я всегда старался уйти от двух разных файлов проект и спецификация. Перекидывать рамку в эксель? не вижу смысла мучать эксель он не для этого. Информацию о материалах можно взять откуда угодно хоть из баз или просто ручками…сделать раскрывающие списки, выбор по условию и т.п (все в пределах возможностей экселя и в этом плане он лучше Визио)….итоговый макрос эксель выполняет перенос всего того что с условием (графа — кол-во) >0 в СВОД экселя, диапазоны которого и отображаются в Визио
|
||
| Вернуться к началу |
|
||
|
Виктор-АПТ |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
|
|
Согласен, по всякому можно делать, кому как удобно. Мне например удобно штампы делать как подложку вместе с планами этажей и спецификацию тоже. Правда спецификацию как правило в Экселе делаю. В любом случае от Эксела не получается отказаться.
|
| Вернуться к началу |
|
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Виктор-АПТ писал(а): Согласен, по всякому можно делать, кому как удобно. Мне например удобно штампы делать как подложку вместе с планами этажей и спецификацию тоже. Без подложки ни куда. Зачем Штампы и спецификация в подложке??? Виктор-АПТ писал(а): Правда спецификацию как правило в Экселе делаю. В любом случае от Эксела не получается отказаться. Вот и мой пример про тоже — спецификация делается в эксель, а в визио только отображается и нет необходимости что то копировать в визио или наоборот в эксель — один раз сделал лист с OLE-объектами эксель спецификации и дальше редактура только в эксель, включая все последующие файлы проектов.
|
||
| Вернуться к началу |
|
||
|
Nik035 |
Заголовок сообщения: Re: Использование вставки в Visio диапазона Excel как OLE-объект
|
||
|
Ни кто так и не попробовал вставку OLE-объекта в Визио из эксель???
|
||
| Вернуться к началу |
|
||
Кто сейчас на конференции |
|
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1 |
| Вы можете начинать темы Вы можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения |


















и мое видео получилось урезанным (показано как работает уже созданный Ole-объект из файла Xls в файле Vsdm) + название темы оказалось не совсем точным (хорошо, что Surrogate заметил) — откорректирую.