Работа с OLE-сервером Word.
Аналогично как и в части 1 — поставим целью из приложения (контроллера
автоматизации) создать документ изображенный на Рис 2.1. Он также типичен с
точки зрения созданя прикладных программ, использующих для вывода информации
Word и содержит три наиболее часто используемых составных элемента: текстовую
информацию, таблицу и диаграмму.
Путь создания данного документа — это шаги, которые позволят освоить работу
с OLE сервером Word.
Рис 2.1 Итоговый документ, сформированный контроллером.
В начало
2.1 Получение доступа к интерфейсу Application для Word.
-
1. Включить в проект модули:
#include <ComObj.hpp> #include <utilcls.h>
-
2. Определить — лучше глобально (для наглядности и удобства) —
переменные, отражающие иерархию объектов Word
Приложение->Набор документов->документ->Набор парагрофов->
Параграф->СтрокиVariant vVarApp,vVarDocs,vVarParagraphs,vVarParagraph;
/////// -
3. создать объект автоматизации:
vVarApp=CreateOleObject("Word.Application");
Также, по причине описанной ввыше (Ч 1. П 1.1), не будем ориентироваться
на конкретную библиотеку *.olb Office (конструкцию типа Word.Application.8 или
Excel.Application.9, как и имена констант использовать не будем).
С этого момента можно пользоваться свойствами и методами созданного ole
сервера, а именно:
-
Установка свойства.
vVarApp.OlePropertySet("имя", значение);
-
Чтение значения свойства.
переменная = app.OlePropertyGet("имя");
-
Вызов метода:
vVarApp.OleProcedure("имя",список параметров метода);
В начало
2.2 Интерфейсы и константы
Список интерфейсов и констант получаем при просмотре библиотеки типов
Microsoft Word Object Library, открыв например файл MSWord9.olb (или
другой в зависимости от версии Microsoft Offise). О пользовании библиотекой
см. Ч 1. P 1.2.
Аналогично будем пользоваться сохраненным файлом MSWord9.idl
и использовать так называемый «хитрый метод«.
Напомним его суть — перевод макроса из кода Visual Basic в С++ код.
Использование его аналогично как и при разработке контроллера для
управления сервером Excel:
-
1. Запустить Word.
-
2. Сервис/Maкрос/Начать запись
-
3. Выполннить последовательность нужных действий.
-
4. Остановить запись
-
5. Вызвать Visual Basic (Alt+F11)
-
6. Tools/Macros/Edit
-
7. Перевести код из кода Visual Basic в С++.
В начало
2.3 Создание рабочего документа
Создаем новое приложение (File/New/Application) и сохраним его файлы в
директории по умолчанию (Projects) c именами по умолчанию Unit1.cpp, Unit1.h,
Unit1.dfm, Project1.cpp, Project1.bpr. Имена на данном этапе не цель, хотя не
возбраняется создать новую директорию и дать приложению и файлам подходящие
имена.
Переменные соответствующие используемым в программе объектам, а именно:
Variant vVarApp,vVarDocs,vVarParagraphs,vVarParagraph;
bool fStart;
определим сразу все и глобально или в файле Unit1.h (в разделе private:) или
перед функциями в Unit1.cpp, хотя для данного этапа требуются пока не все переменные
и можно определить нужные и локально.
Переменная fStart служит индикатором того, что сервер запущен.
Разместим на форме как и ранее три кнопки (из вкладки Standart компонент
Button). Подписывать кнопки также не будем (сейчас это тоже не цель), но
запомним, что по первой кнопке будем работать с таблицей, по второй с
диаграммой, а по третьей закрывать сервер и приложение. Выполним два клика
по Button1 и Button3, создаем таким образом обработчики события нажатия кнопки.
void __fastcall TForm1::Button1Click(TObject *Sender) { } void __fastcall TForm1::Button3Click(TObject *Sender) { if(fStart) vVarApp.OleProcedure("Quit"); Close(); }
Вторяя кнопка таким образом служит для выхода из программы и закрытия сервера.
В начало
2.3.1 Вывод текстовой информации.
На первом этапе выводим текст. Пусть на данном этапе необходимо
вывести следующее.
Рис 2.2 Вывод текстовой информации.
В обработчике нажатия первой кнопки начнем формировать код программы.
Создаем Объект Word.Application.
Variant v; if(!fStart) { try { vVarApp=CreateOleObject("Word.Application"); fStart=true; } catch(...) { MessageBox(0, "Ошибка при открытии сервера Word", "Ошибка", MB_OK); return; } }
О использовании try catch мы также уже говорили в Ч 1. п 1.3.
Сделаем приложение видимым.
vVarApp.OlePropertySet("Visible",true);
Переменной vVarDocs присваивается значение Documents — свойство объекта
Word.Application, содержащее набор рабочих документов.
vVarDocs=vVarApp.OlePropertyGet("Documents");
Добавляем созданный документ в приложение — для этого надо выполнить вызов,
прототип которого:
vVarDocs.OleProcedure("Add","Template", NewTemplate, DocumentType);
Пре NewTemplate true создается шаблон при false — документ.
Правильно для конретной версии Word создание документа записать как:
vVarDocs.OleProcedure("Add", "C:\WINDOWS\Application Data\Microsoft\Шаблоны\Normal.dot", false,0);
Посколько расположение шаблонов хранится для всех установленных типов
документов в реестре, то для создания простого документа можно использовать
установки по умолчанию и достаточно записать:
vVarDocs.OleProcedure("Add");
Этот вызов можно повторить столько раз сколько будет создано рабочих
документов. Следует обратить внимание, что обратиться к документу после его
создания можно по свойству Item следующим образом:
vVarDoc=vVarDocs.OleFunction("Item",n);
Здесь n=1 соответствует последнему созданному документу, n-1 предпоследнему,
и. т.д.
Создаем, например 2 документа:
vVarDocs.OleProcedure("Add"); vVarDocs.OleProcedure("Add");
Проверяем, что создано два документа:
if(vVarDocs.OlePropertyGet("Count") != 2) { MessageBox(0, "Ошибка при создании документов", "Ошибка", MB_OK); return; }
Будем работать с первым документом, как ни странно его Item = 2:
vVarDoc=vVarDocs.OleFunction("Item",2);
Смотреть будем тоже на первый документ — т.е. активируем его:
vVarDoc.OleProcedure("Activate");
Получаем свойство Paragraphs объекта документ:
vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
Задаем текст для вывода:
str="ttОзнакомленtt";
Добавляем параграф:
vVarParagraphs.OleProcedure("Add");
Работаем с первым параграфом:
vVarParagraph=vVarParagraphs.OleFunction("Item",1);
Заносим в него текст:
vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str());
Выравниваем по правому краю (wdAlignParagraphRight — по правому краю), по
причинам описанным выше используем константы вместо имен переменных:
vVarParagraph.OlePropertySet("Alignment",2);
Аналогично выводим следующие параграфы, в том числе и пустые:
str="Директорtt=Пупкин="; vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",2); vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraph.OlePropertySet("Alignment",2); vVarParagraphs.OleProcedure("Add"); str=""...."...........................2003г."; vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",4); vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraph.OlePropertySet("Alignment",2); vVarParagraphs.OleProcedure("Add"); str="Итоги работы за неделю."; vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",6); vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraph.OlePropertySet("Alignment",1);
Константы выравнивания текста:
-
wdAlignParagraphLeft = 0;
-
wdAlignParagraphCenter = 1;
-
wdAlignParagraphRight = 2;
-
wdAlignParagraphJustify = 3;
-
wdAlignParagraphDistribute = 4;
-
wdAlignParagraphJustifyMed = 5;
-
wdAlignParagraphJustifyHi = 7;
-
wdAlignParagraphJustifyLow = 8.
Результат с достоинствами и недостатками видим на рисунке. Видно, что
фон белый, шрифт не такой как хотельсь бы, включена линейка, проверка
орфографии и т.п.
В начало
2.3.2 Изменение параметров документа.
Раскрасим текст как показано на рисунке.
Рис 2.3 Изменение параметров текста.
-
1. Изменяем фон:
vVarDoc.OlePropertyGet("Background"). OlePropertyGet("Fill"). OlePropertyGet("ForeColor"). OlePropertySet("RGB",RGB(255, 255, 153)); vVarDoc.OlePropertyGet("Background"). OlePropertyGet("Fill"). OlePropertySet("Visible",-1); vVarDoc.OlePropertyGet("Background"). OlePropertyGet("Fill"). OleFunction("Solid");
Константы отображения OlePropertySet(«Visible», msoTrue);:
-
msoTrue = -1,
-
msoFalse = 0,
-
msoCTrue = 1,
-
msoTriStateToggle = -3,
-
msoTriStateMixed = -2
-
-
2. Убираем линейку:
vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("ActivePane"). OlePropertySet("DisplayRulers",false);
-
3. Изменяем размер окна:
vVarApp.OlePropertySet("WindowState",1);
-
wdWindowStateNormal = 0;
-
wdWindowStateMaximize = 1;
-
wdWindowStateMinimize = 2.
-
-
4. Убираем лишние панели инструментов:
vVarApp.OlePropertyGet("CommandBars","Standard"). OlePropertySet("Visible",false);
Список панелей:
-
Standard
-
Formatting
-
Visual Basic
-
Web
-
Web Tools
-
WordArt
-
AutoText
-
Database
-
Clipboard
-
Picture
-
Frames
-
Reviewing
-
Drawing
-
Forms
-
Control Toolbox
-
Печать книгой
-
Stop Recording
-
Forms
-
Frames
-
Picture
-
Clipboard
-
Tables and Borders
-
Control Toolbox
-
Печать книгой
-
-
4. Установка разметки страниц:
vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("ActivePane"). OlePropertyGet("View"). OlePropertySet("Type",1);
Константы разметок и вида документа:
-
wdNormalView = 1;
-
wdOutlineView = 2;
-
wdPrintView = 3;
-
wdPrintPreview = 4;
-
wdMasterView = 5;
-
wdWebView = 6.
-
-
5. Изменяем масштаб отображения документа:
vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("ActivePane"). OlePropertyGet("View"). OlePropertyGet("Zoom"). OlePropertySet("Percentage",100);
-
6.Проверка грамматики. Лучше для скорости ее отключить.
vVarApp.OlePropertyGet("Options"). OlePropertySet("CheckGrammarAsYouType",false); vVarApp.OlePropertyGet("Options"). OlePropertySet("CheckGrammarWithSpelling",false);
-
7. Устанавливаем параметры шрифта:
Шрифт устанавливаем для строки параграфа. Так как изменение шрифта
одинаково для любого параграфа, то описание проводим только для
заглавия таблицы. Все используемые констнты приведены в конце пункта 8.vVarParagraph=vVarParagraphs.OleFunction("Item",6);
Выделяем строку и получаем характеристики шрифта.
v=vVarParagraph.OlePropertyGet("Range"). OlePropertyGet("Font");
Цвет шрифта.
v.OlePropertySet("Color",255);
Размер шрифта.
v.OlePropertySet("Size",14);
Имя шрифта.
v.OlePropertySet("Name","Times New Roman");
Стиль шрифта.
v.OlePropertySet("Bold",true); v.OlePropertySet("Italic",true);
Подчеркивание.
v.OlePropertySet("Underline",1);
Цвет подчеркивания.
v.OlePropertySet("UnderlineColor",16711680);
Зачеркивание.
v.OlePropertySet("StrikeThrough",false); v.OlePropertySet("DoubleStrikeThrough",false);
Двойные линии обводки шрифта.
v.OlePropertySet("Outline",false);
Приподнятый.
v.OlePropertySet("Emboss",false);
Шрифт с тенями.
v.OlePropertySet("Shadow",true);
Скрытый
v.OlePropertySet("Hidden",false);
Все буквы в нижнем регистре.
v.OlePropertySet("SmallCaps",false);
Все буквы в верхнем регистре.
v.OlePropertySet("AllCaps",false);
Гравированный шрифт (утопленный).
v.OlePropertySet("Engrave",false);
В верхнем индексе.
v.OlePropertySet("Superscript",false);
В нижнем индексе.
v.OlePropertySet("Subscript",false);
Расстояние между буквами — разрядка в пикселях при + и уплотнение при -.
v.OlePropertySet("Spacing",0);
Масштаб.
v.OlePropertySet("Scaling",100);
Смещенный вверх или вниз в пикселях.
v.OlePropertySet("Position",0);
Кернинг — слияние в пунктах.
v.OlePropertySet("Kerning",1);
Анимация Обычный набор: красные муравии, мерцание, мигающий
фон, неоновая реклама, фейерверк, черные муравьи.v.OlePropertySet("Animation",0);
-
8. Изменяем шрифт в произвольном месте строки:
Запоминаем где курсор — свойство Selection
v=vVarApp.OlePropertyGet("Selection");
Сдвинем курсор на 5 параграфов вниз. Четверка — сдвиг на параграфы.
v.OleProcedure("MoveDown",4,5);
Встаем на начало строки. Пятерка — в начало строки.
v.OleProcedure("HomeKey",5);
Сдвигаемся на 6 символов вправо. Единица — символы.
v.OleProcedure("MoveRight",1,6);
Выделяем 6 букв. Тотже сдвиг, но последняя единица означает выделить.
v.OleProcedure("MoveRight",1,6,1);
Заменим цвет выделенного текста.
v.OlePropertyGet("Font").OlePropertySet("Color",8388608);
Константы стилей линий подчеркивания.
-
wdUnderlineNone = 0;
-
wdUnderlineSingle = 1;
-
wdUnderlineWords = 2;
-
wdUnderlineDouble = 3;
-
wdUnderlineDotted = 4;
-
wdUnderlineThick = 6;
-
wdUnderlineDash = 7;
-
wdUnderlineDotDash = 9;
-
wdUnderlineDotDotDash = 10;
-
wdUnderlineWavy = 11;
-
wdUnderlineWavyHeavy = 27;
-
wdUnderlineDottedHeavy = 20;
-
wdUnderlineDashHeavy = 23;
-
wdUnderlineDotDashHeavy = 25;
-
wdUnderlineDotDotDashHeavy = 26;
-
wdUnderlineDashLong = 39;
-
wdUnderlineDashLongHeavy = 55;
-
wdUnderlineWavyDouble = 43.
Константы цвета — практически это десятичная запись RGB и поэтому
можно пользоваться любым способом записи, в том числе и принятым в Buildere.-
wdColorAutomatic = 4278190080;
-
wdColorBlack = 0;
-
wdColorBlue = 16711680;
-
wdColorTurquoise = 16776960;
-
wdColorBrightGreen = 65280;
-
wdColorPink = 16711935;
-
wdColorRed = 255;
-
wdColorYellow = 65535;
-
wdColorWhite = 16777215;
-
wdColorDarkBlue = 8388608;
-
wdColorTeal = 8421376;
-
wdColorGreen = 32768;
-
wdColorViolet = 8388736;
-
wdColorDarkRed = 128;
-
wdColorDarkYellow = 32896;
-
wdColorBrown = 13209;
-
wdColorOliveGreen = 13107;
-
wdColorDarkGreen = 13056;
-
wdColorDarkTeal = 6697728;
-
wdColorIndigo = 10040115;
-
wdColorOrange = 26367;
-
wdColorBlueGray = 10053222;
-
wdColorLightOrange = 39423;
-
wdColorLime = 52377;
-
wdColorSeaGreen = 6723891;
-
wdColorAqua = 13421619;
-
wdColorLightBlue = 16737843;
-
wdColorGold = 52479;
-
wdColorSkyBlue = 16763904;
-
wdColorPlum = 6697881;
-
wdColorRose = 13408767;
-
wdColorTan = 10079487;
-
wdColorLightYellow = 10092543;
-
wdColorLightGreen = 13434828;
-
wdColorLightTurquoise = 16777164;
-
wdColorPaleBlue = 16764057;
-
wdColorLavender = 16751052;
-
wdColorGray05 = 15987699;
-
wdColorGray10 = 15132390;
-
wdColorGray125 = 14737632;
-
wdColorGray15 = 14277081;
-
wdColorGray20 = 13421772;
-
wdColorGray25 = 12632256;
-
wdColorGray30 = 11776947;
-
wdColorGray35 = 10921638;
-
wdColorGray375 = 10526880;
-
wdColorGray40 = 10066329;
-
wdColorGray45 = 9211020;
-
wdColorGray50 = 8421504;
-
wdColorGray55 = 7566195;
-
wdColorGray60 = 6710886;
-
wdColorGray625 = 6316128;
-
wdColorGray65 = 5855577;
-
wdColorGray70 = 5000268;
-
wdColorGray75 = 4210752;
-
wdColorGray80 = 3355443;
-
wdColorGray85 = 2500134;
-
wdColorGray875 = 2105376;
-
wdColorGray90 = 1644825;
-
wdColorGray95 = 789516.
Константы выравнивания.
-
wdAnimationNone = 0;
-
wdAnimationLasVegasLights = 1;
-
wdAnimationBlinkingBackground = 2;
-
wdAnimationSparkleText = 3;
-
wdAnimationMarchingBlackAnts = 4;
-
wdAnimationMarchingRedAnts = 5;
-
wdAnimationShimmer = 6.
Константы выделения.
-
wdMove = 0;
-
wdExtend = 1.
-
-
9. На данном этапе можно сохранить документ:
AnsiString vAsCurDir=GetCurrentDir(); AnsiString vAsCurDir1=vAsCurDir+"\test.doc"; vVarDoc=vVarDocs.OleFunction("Item",2); vVarDoc.OleProcedure("SaveAs",vAsCurDir1.c_str()); //Закрыть открытое приложение //vVarApp.OleProcedure("Quit");
В начало
2.4 Работа с таблицами.
Добавим к создаваемому документу табличку, как показано на рисунке.
Рис 2.4 Пример работы с таблицей.
Для добавления таблицы определим для нее параграф — добавляем два параграфа
и в последнем добавленном параграфе разместим таблицу.
vVarParagraphs.OleProcedure("Add"); vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",8);
Выбираем ряд в параграфе.
vVarRange = vVarParagraph.OlePropertyGet("Range");
Центрируем содержимое параграфа.
vVarParagraph.OlePropertySet("Alignment",1);
Добавляем таблицу OleProcedure(«Add», Range, Rows, Columns,
DefaultTableBehavior(0,1),AutoFitBehavior(0,1,2)); Две
последние константы определяют стиль таблицы применительно к
версии Word. Таблицу добавляем к активному документу в выбранный
ряд.
vVarDoc.OlePropertyGet("Tables"). OleProcedure("Add", vVarRange, 3, 9,1,1);
Работать будем с первой таблицей — создана тоже одна.
vVarTable=vVarDoc.OlePropertyGet("Tables"). OleFunction("Item",1);
Выравниваем таблицу по центру.
vVarTable.OlePropertyGet("Rows"). OlePropertySet("Alignment",1);
Константы выравнивания:
-
wdAlignRowLeft = 0;
-
wdAlignRowCenter = 1;
-
wdAlignRowRight = 2.
Установка ширины таблицы Ширина таблицы может быть
фиксированная, иметь разме по содержимому ячеек или ширине окна.
vVarTable.OleFunction("AutoFitBehavior",2);
-
wdAutoFitFixed = 0;
-
wdAutoFitContent = 1;
-
wdAutoFitWindow = 2.
Сетка в таблице как ни странно не свойство самой таблицы.
vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("View"). OlePropertySet("TableGridlines",true);
Устанавливаем стиль таблицы.
vVarTable.OleFunction("AutoFormat",25,true,true, true,true, true,false, true,false,true); //////Или//////// vVarTable.OleFunction("AutoFormat",25);
Здесь:
OleFunction("AutoFormat",Format,Borders,Shading, Font,Color,HeadingRows,LastRow, FirstColumn,LastColumn,AutoFit);
Стилей таблиц в стандартном наборе Word 43 — константы Format от 0 до 42.
Остальные параметры определяют соответственно использование границ, заливки
шрифта, цвета ячеек, оформления верхней, нижней строки, оформления первого
и последнего столбце и автоподборв. При использовании шаблонов достаточно
указать/только Format.
Занесение информации в ячейки. Для этого выполняется следущая
последовательность действий:
-
Выбирается ячейка:
vVarCell=vVarTable.OleFunction("Cell",x,y);
-здесь x и y координаты ячейки.
vVarCell.OleFunction("Select"); -
Выбираем свойство Selection приложения.
v = vVarApp.OlePropertyGet("Selection"). OlePropertyGet("Font");
-
Изменяем параметры шрифта, те которые изменились с последней
установки его для свойства Selection, например:v.OlePropertySet("Size",16); v.OlePropertySet("Underline",0); v.OlePropertySet("Color",clYellow);
-
Добавляем текст в ячейку:
vVarCell.OlePropertyGet("Range"). OlePropertySet("Text","Наш текст");
После занесения информации в таблицу поставленная задача выполнена.
В начало
2.5 Текст кода программы.
Файл Unit1.h:
#ifndef Unit1H #define Unit1H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //----------------------------------------------- class TForm1 : public TForm { __published: TButton *Button1; TButton *Button3; TButton *Button2; void __fastcall Button1Click(TObject *Sender); void __fastcall Button3Click(TObject *Sender); private: Variant vVarApp,vVarDocs,vVarDoc,vVarParagraphs, vVarParagraph,vVarRange,vVarTables,vVarTable, vVarCell; bool fStart; AnsiString str; public: __fastcall TForm1(TComponent* Owner); }; //----------------------------------------------- extern PACKAGE TForm1 *Form1; //----------------------------------------------- #endif
Файл Unit1.cpp
#include #pragma hdrstop #include #include #include "Unit1.h" #pragma package(smart_init) //#include #pragma resource "*.dfm" #pragma hdrstop TForm1 *Form1; //--------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Variant v,v1; if(!fStart) { try { //Создаем объект Word.Application vVarApp=CreateOleObject("Word.Application"); fStart=true; } catch(...) { MessageBox(0, "Ошибка при открытии сервера Word", "Ошибка", MB_OK); return; } } //Делаем сервер видимым vVarApp.OlePropertySet("Visible",true); //Получаем свойство Documents объекта vVarDocs=vVarApp.OlePropertyGet("Documents"); //Создаем два документа vVarDocs.OleProcedure("Add"); vVarDocs.OleProcedure("Add"); //Проверяем, что создано два документа if(vVarDocs.OlePropertyGet("Count") != 2) { MessageBox(0, "Ошибка при создании документов", "Ошибка", MB_OK); return; } //Будем работать с первым документом - Item == 2; vVarDoc=vVarDocs.OleFunction("Item",2); //Смотреть будем тоже на первый документ vVarDoc.OleProcedure("Activate"); //vVarDoc.OleProcedure("Select"); vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs"); //Задаем текст для вывода str="ttОзнакомленtt"; //Добавляем параграф vVarParagraphs.OleProcedure("Add"); //Работаем с первым параграфом vVarParagraph=vVarParagraphs.OleFunction("Item",1); //Заносим в него текст vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); //Выравниваем по правому краю vVarParagraph.OlePropertySet("Alignment",2); //Второй параграф str="Директорtt=Пупкин="; vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",2); vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraph.OlePropertySet("Alignment",2); //Третий параграф - пустой vVarParagraphs.OleProcedure("Add"); //Четвертый параграф str=""...."...........................2003г."; vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",4); vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraph.OlePropertySet("Alignment",2); //Пятый параграф - пустой vVarParagraphs.OleProcedure("Add"); //Шестой параграф str="Итоги работы за неделю."; vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",6); vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); //wdAlignParagraphCenter vVarParagraph.OlePropertySet("Alignment",1); //Фон Документа vVarDoc.OlePropertyGet("Background"). OlePropertyGet("Fill"). OlePropertyGet("ForeColor"). OlePropertySet("RGB",RGB(255, 255, 153)); vVarDoc.OlePropertyGet("Background"). OlePropertyGet("Fill"). OlePropertySet("Visible",-1); vVarDoc.OlePropertyGet("Background"). OlePropertyGet("Fill"). OleFunction("Solid"); //Убираем линейку vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("ActivePane"). OlePropertySet("DisplayRulers",false); //Размер окна vVarApp.OlePropertySet("WindowState",1); //Панели Инструментов vVarApp.OlePropertyGet("CommandBars","Standard"). OlePropertySet("Visible",false); //Разметка страницы vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("ActivePane"). OlePropertyGet("View"). OlePropertySet("Type",6); //Масштаб отлбражения документа vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("ActivePane"). OlePropertyGet("View"). OlePropertyGet("Zoom"). OlePropertySet("Percentage",100); //Проверка грамматики vVarApp.OlePropertyGet("Options"). OlePropertySet("CheckGrammarAsYouType",false); vVarApp.OlePropertyGet("Options"). OlePropertySet("CheckGrammarWithSpelling",false); //Шрифт устанавливаем для строки параграфа vVarParagraph=vVarParagraphs.OleFunction("Item",6); v=vVarParagraph.OlePropertyGet("Range"). OlePropertyGet("Font"); //Цвет шрифта v.OlePropertySet("Color",255); //Размер шрифта v.OlePropertySet("Size",18); //Имя шрифта v.OlePropertySet("Name","Times New Roman"); //Стиль шрифта v.OlePropertySet("Bold",true); v.OlePropertySet("Italic",true); //Подчеркивание v.OlePropertySet("Underline",1); //Цвет подчеркивания v.OlePropertySet("UnderlineColor",16711680); //Зачеркивание v.OlePropertySet("StrikeThrough",false); v.OlePropertySet("DoubleStrikeThrough",false); //Двойные линии обводки шрифта v.OlePropertySet("Outline",false); //Приподнятый v.OlePropertySet("Emboss",false); //Шрифт с тенями v.OlePropertySet("Shadow",true); //Скрытый v.OlePropertySet("Hidden",false); //Все буквы в нижнем регистре v.OlePropertySet("SmallCaps",false); //Все буквы в верхнем регистре v.OlePropertySet("AllCaps",false); //Гравированный шрифт утопленный v.OlePropertySet("Engrave",false); //В верхнем индексе v.OlePropertySet("Superscript",false); //В нижнем индексе v.OlePropertySet("Subscript",false); //Расстояние между буквами v.OlePropertySet("Spacing",0); //Масштаб v.OlePropertySet("Scaling",100); //Смещенный вверх или вниз в пикселях v.OlePropertySet("Position",0); //Кернинг - слияние в пунктах v.OlePropertySet("Kerning",1); //Анимация v.OlePropertySet("Animation",0); //Запоминаем где курсор - свойство Selection v=vVarApp.OlePropertyGet("Selection"); //Сдвинем курсор на 5 параграфов вниз v.OleProcedure("MoveDown",4,5); //Встанем на начало строки v.OleProcedure("HomeKey",5); //Сдвигаемся на 13 символов вправо v.OleProcedure("MoveRight",1,13); //Выделяем "за неделю" v.OleProcedure("MoveRight",1,10,1); //зменим цвет выделенного текста v.OlePropertyGet("Font"). OlePropertySet("Color",8388608); ///////////////////////Cоздание таблицы////////// //Добавляем два параграфа vVarParagraphs.OleProcedure("Add"); vVarParagraphs.OleProcedure("Add"); //Выбираем ряд в параграфе vVarParagraph=vVarParagraphs.OleFunction("Item",8); vVarParagraph.OlePropertySet("Alignment",1); vVarRange = vVarParagraph.OlePropertyGet("Range"); //Добавляем таблицу vVarDoc.OlePropertyGet("Tables"). OleProcedure("Add", vVarRange, 3, 9,1,1); //Работать будем с первой таблицей vVarTable=vVarDoc.OlePropertyGet("Tables"). OleFunction("Item",1); //Выравниваем таблицу по центру vVarTable.OlePropertyGet("Rows"). OlePropertySet("Alignment",1); //Установка ширины таблицы vVarTable.OleFunction("AutoFitBehavior",2); //Сетка в таблице vVarApp.OlePropertyGet("ActiveWindow"). OlePropertyGet("View"). OlePropertySet("TableGridlines",true); //Стиль таблицы vVarTable.OleFunction("AutoFormat",25); //Занесение информации в ячейки for(int i=2;i <= 8;i++) { vVarCell=vVarTable.OleFunction("Cell",1,i); vVarCell.OleFunction("Select"); v = vVarApp.OlePropertyGet("Selection"). OlePropertyGet("Font"); v.OlePropertySet("Size",16); v.OlePropertySet("Underline",0); v.OlePropertySet("Color",clYellow); vVarCell.OlePropertyGet("Range"). OlePropertySet("Text",i-1); } random(50); int j,k=0; for(int i=2;i <= 9;i++) { vVarCell=vVarTable.OleFunction("Cell",2,i); vVarCell.OleFunction("Select"); v = vVarApp.OlePropertyGet("Selection").OlePropertyGet("Font"); v.OlePropertySet("Size",14); v.OlePropertySet("Underline",0); j=random(50); if(i != 9) { vVarCell.OlePropertyGet("Range"). OlePropertySet("Text",j); k=k+j; } else vVarCell.OlePropertyGet("Range"). OlePropertySet("Text",k); } k=0; for(int i=2;i <= 9;i++) { vVarCell=vVarTable.OleFunction("Cell",3,i); vVarCell.OleFunction("Select"); v = vVarApp.OlePropertyGet("Selection"). OlePropertyGet("Font"); v.OlePropertySet("Size",14); v.OlePropertySet("Underline",0); j=random(30); if(i != 9) { vVarCell.OlePropertyGet("Range"). OlePropertySet("Text",j); k=k+j; } else vVarCell.OlePropertyGet("Range"). OlePropertySet("Text",k); } vVarCell=vVarTable.OleFunction("Cell",1,9); vVarCell.OleFunction("Select"); v = vVarApp.OlePropertyGet("Selection"). OlePropertyGet("Font"); v.OlePropertySet("Size",16); v.OlePropertySet("Underline",0); v.OlePropertySet("Color",clRed); vVarCell.OlePropertyGet("Range"). OlePropertySet("Text","Итог"); for(int i=1;i <= 3;i++) { vVarCell=vVarTable.OleFunction("Cell",i,1); vVarCell.OleFunction("Select"); v = vVarApp.OlePropertyGet("Selection"). OlePropertyGet("Font"); v.OlePropertySet("Size",16); v.OlePropertySet("Underline",0); v.OlePropertySet("Color",clBlue); v1=vVarApp.OlePropertyGet("Selection"). OlePropertyGet("ParagraphFormat"); v1.OlePropertySet("Alignment", 0); switch(i) { case 1: vVarCell.OlePropertyGet("Range"). OlePropertySet("Text","Товар\Дни недели"); break; case 2: vVarCell.OlePropertyGet("Range"). OlePropertySet("Text","Компьютеры:"); break; default: vVarCell.OlePropertyGet("Range"). OlePropertySet("Text","Принтеры:"); } } AnsiString vAsCurDir=GetCurrentDir(); AnsiString vAsCurDir1=vAsCurDir+"\test.doc"; vVarDoc=vVarDocs.OleFunction("Item",2); vVarDoc.OleProcedure("SaveAs",vAsCurDir1.c_str()); } //--------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { if(fStart) vVarApp.OleProcedure("Quit"); Close(); } //---------------------------------------
В начало
2.6 Работа с диаграммами.
2.6.1 Копирование диаграммы из рабочей книги Excel.
Диаграмму возьмем из созданной в Ч 1. рабочей книге Excel (документ с диаграммой
сохранен под именем amount.xls в текущей директории). Порядок работы с
документом и диаграммой схож с описанным в Ч 1. — создаем объект «Excel.Application»,
и рабочую книгу. Но книгу не добавляем в объект, а открываем существующую.
AnsiString vAsCurDir1=vAsCurDir+"\amount.xls";
Далее активируем текущую страницу книги (а их в книге одна) выбираем
текущий объект диаграммы (диаграмма тоже одна) и выполняем
копирование объекта в буфер обмена.
vVarSheet.OlePropertyGet("ChartObjects"). OlePropertyGet("Item",1).OleProcedure("Copy");
Для объекта Word аналогично описанному выше создаем два
дополнительных параграфа, выбираем ряд в параграфе и устанавливаем
выравнивание, чтоба диаграмма оказалась в центре документа (параграфа).
При заполнении таблицы последней была заполнена левая ячейка в нижнем
ряду и курсор находится там — свойство «Selection». Получим
положение курсора и сдвинем его на две строчки вниз (wdLine = 5).
Variant v = vVarApp.OlePropertyGet("Selection"); v.OleFunction("MoveDown",5,2);
Здесь константы определяющие тип сдвига:
-
wdCharacter = 1;
-
wdWord = 2;
-
wdSentence = 3;
-
wdParagraph = 4;
-
wdLine = 5;
-
wdStory = 6;
-
wdScreen = 7;
-
wdSection = 8;
-
wdColumn = 9;
-
wdRow = 10;
-
wdWindow = 11;
-
wdCell = 12;
-
wdCharacterFormatting = 13;
-
wdParagraphFormatting = 14;
-
wdTable = 15;
-
wdItem = 16.
Осталось вставить диаграмму в документ
v.OleProcedure("Paste");
Результат работы представлен на рисунке 2.1. Полный текст кода,
реализующего вставку диаграммы, представлен ниже.
void __fastcall TForm1::Button2Click(TObject *Sender) { Variant vVarAppEx,vVarBooks,vVarBook,vVarSheet,vVarRange; if(!fStart) return; //Создаем объект Excel.Application vVarAppEx=CreateOleObject("Excel.Application"); vVarAppEx.OlePropertySet("Visible",true); vVarBooks=vVarAppEx.OlePropertyGet("Workbooks"); vVarAppEx.OlePropertySet("SheetsInNewWorkbook",1); AnsiString vAsCurDir1=vAsCurDir+"\amount.xls"; vVarBooks.OleProcedure("Open",vAsCurDir1.c_str()); vVarBook=vVarBooks.OlePropertyGet("Item",1); vVarSheet=vVarBook.OlePropertyGet("Worksheets",1); vVarSheet.OleProcedure("Activate"); //Копируем диаграмму в буфер обмена vVarSheet.OlePropertyGet("ChartObjects"). OlePropertyGet("Item",1).OleProcedure("Copy"); //Перенесем диаграмму в документ Word vVarParagraphs.OleProcedure("Add"); vVarParagraphs.OleProcedure("Add"); //Выбираем ряд в параграфе vVarParagraph=vVarParagraphs.OleFunction("Item",11); vVarParagraph.OlePropertySet("Alignment",1); Variant v = vVarApp.OlePropertyGet("Selection"); v.OleFunction("MoveDown",5,2); //Вставляем диаграмму v.OleProcedure("Paste"); //Запоминаем результат vAsCurDir1=vAsCurDir+"\test.doc"; vVarDoc=vVarDocs.OleFunction("Item",1); vVarDoc.OleProcedure("SaveAs",vAsCurDir1.c_str()); }
В начало
2.7 Некоторые другие возможности.
//Выведет Microsoft Word Label1->Caption=vVarApp.OlePropertyGet("Caption"); //Добавит к имени документа слово Wlad - не к имени файла vVarApp.OlePropertySet("Caption","Wlad"); //Откуда запущен Application(Word), можно и установить Label1->Caption=vVarApp.OlePropertyGet("Path"); //Версия приложения, например 9.0 Label1->Caption=vVarApp.OlePropertyGet("Version"); //Установить активный принтер vVarApp.OlePropertySet("ActivePrinter","Epson LQ-100 ESC/P 2 on LPT1:"); //Имя активного принтера - будет выведено, если установлен в системе Label1->Caption=vVarApp.OlePropertyGet("ActivePrinter"); //Имя активного рпинтера Label1->Caption=vVarApp.OlePropertyGet("ActivePrinter"); //В режиме не свернутого окна и не развернутого //во весь экран можно получить или установить //Размер окна vVarApp.OlePropertySet("WindowState",0); Label1->Caption=vVarApp.OlePropertyGet("Height"); vVarApp.OlePropertySet("Left",100); vVarApp.OlePropertySet("Width",400); vVarApp.OlePropertySet("Top",100); vVarApp.OlePropertySet("Height",400); Label2->Caption=vVarApp.OlePropertyGet("Height"); //Имя пользователя запустившего процесс можно получит и учтановить Label1->Caption=vVarApp.OlePropertyGet("UserName"); vVarApp.OlePropertySet("UserName","Petr"); Label2->Caption=vVarApp.OlePropertyGet("UserName"); //Аналогично UserAddress Label1->Caption=vVarApp.OlePropertyGet("UserAddress"); vVarApp.OlePropertyGet("System"); vVarApp.OlePropertyGet("FontNames"); //Изменить ширину столбца таблицы vVarTable=vVarDoc.OlePropertyGet("Tables").OleFunction("Item",1); Variant v=vVarTable.OlePropertyGet("Columns"); //Устанавливаем ширину первого столбца v.OleFunction("Item",1).OlePropertySet("Width",50); //А так сразу всех Variant v=vVarTable.OlePropertyGet("Columns"); v.OlePropertySet("Width",25); //Добавляем строки и столбцы vVarTable=vVarDoc.OlePropertyGet("Tables"). OleFunction("Item",1); //Добавить столбец справа Variant v=vVarTable.OlePropertyGet("Columns"). OleFunction("Item",1).OleFunction("Select"); vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertColumnsRight"); //Добавить столбец слева v=vVarTable.OlePropertyGet("Columns"). OleFunction("Item",4).OleFunction("Select"); vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertColumns"); //Строку Выше v=vVarTable.OlePropertyGet("Rows"). OleFunction("Item",2).OleFunction("Select"); vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertRowsAbove",1); //Строку Ниже v=vVarTable.OlePropertyGet("Rows"). OleFunction("Item",4).OleFunction("Select"); vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertRowsBelow",1); //Выделить все v=vVarTable.OlePropertyGet("Columns").OleFunction("Select"); //Обнулить vVarAppWord.OlePropertyGet("Selection").OleProcedure("Delete"); //Вращаем лист vVarDoc=vVarDocs.OleFunction("Item",1); //И сделаем его Альбомным vVarDoc.OlePropertyGet("PageSetup"). OlePropertySet("Orientation",1); //Как Выйти из таблицы //Зайдем в таблицу vVarCell=vVarTable.OleFunction("Cell",1,1); vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs"); vVarParagraphs.OleProcedure("Add"); vVarParagraphs.OleProcedure("Add"); vVarParagraphs.OleProcedure("Add"); //Выходим из таблицы //Сдвинем курсор на 50 параграфов вниз //Ячека таблицы считается как параграф. //Четверка - сдвиг на параграфы. vVarAppWord.OlePropertyGet("Selection"). OleProcedure("MoveDown",4,50); //Или по линиям 5 vVarAppWord.OlePropertyGet("Selection"). OleProcedure("MoveDown",5,7); //Как повернуть один лист в документе AnsiString str; vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs"); vVarParagraph=vVarParagraphs.OleFunction("Item",1); vVarParagraphs.OleProcedure("Add"); str="Параграф 1"; vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",2); str="Параграф 2"; vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraphs.OleProcedure("Add"); //Берем нужный параграф vVarParagraph=vVarParagraphs.OleFunction("Item",3); vVarRange = vVarParagraph.OlePropertyGet("Range"); vVarRange.OleFunction("Select"); //Selection.InsertBreak Type:=wdSectionBreakNextPage vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertBreak",2); vVarParagraphs.OleProcedure("Add"); //Берем нужный параграф vVarParagraph=vVarParagraphs.OleFunction("Item",4); vVarRange = vVarParagraph.OlePropertyGet("Range"); vVarRange.OleFunction("Select"); str="Параграф 4"; vVarParagraph.OlePropertyGet("Range"). OlePropertySet("Text",str.c_str()); vVarParagraphs.OleProcedure("Add"); vVarParagraphs.OleProcedure("Add"); vVarParagraph=vVarParagraphs.OleFunction("Item",6); vVarRange = vVarParagraph.OlePropertyGet("Range"); vVarRange.OleFunction("Select"); vVarParagraph.OlePropertySet("Alignment",1); vVarDoc.OlePropertyGet("Tables"). OleProcedure("Add", vVarRange, 2, 9,1,1); vVarParagraphs.OleProcedure("Add"); vVarRange = vVarParagraph.OlePropertyGet("Range"); vVarRange.OleFunction("Select"); //Вращаем лист //И сделаем его Альбомным vVarRange.OlePropertyGet("PageSetup").OlePropertySet("Orientation",1); //Изменяем межстрочный интервал абзаца по отношению к следующему за ним vVarParagraph=vVarParagraphs.OleFunction("Item",2); vVarParagraph.OlePropertyGet("Range").OleFunction("Select"); vVarApp.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat"). OlePropertySet("LineSpacing", 25); //Изменить формат листа, например сделать его A3 vVarDoc.OlePropertyGet("PageSetup").OlePropertySet("PageWidth",29.7*28.35); vVarDoc.OlePropertyGet("PageSetup").OlePropertySet("PageHeight",42*28.35); //Работа с закладками //Этот материал прислал специально для сайта Москальченко В.А. (moskalchenko@kubkredit.com.ru). //Он же сообщил, что решение взято на форуме ProgZ.ru и принадлежит участнику форума Rius. AnsiString BoolMarkName = "www"; Variant Selection = vVarApp..OlePropertyGet("Selection"); Selection.OleFunction("GoTo", 4294967295, 0, 0, BookmarkName.c_str()); //4294967295 значение wdGoToBookmark из MSWORD.IDL //Станем в начало документа AnsiString BookmarkName ="\StartOfDoc"; Variant Selection = vVarAppWord.OlePropertyGet("Selection"); Selection.OleFunction("GoTo", 4294967295, 0, 0, BookmarkName.c_str()); //В продолжение "Станем в начало документа" замена текста в документе "Дмитрий" на "Иван" Variant Find = Selection.OlePropertyGet("Find"); Find.OleProcedure ("Execute","Дмитрий"/*Текст, который будем менять*/,false/*учитывать регистрe*/, false/*Только полное слово*/,false/*Учитывать универсальные символы*/,false/*Флажок Произносится как*/, false/*Флажок Все словоформы*/,true/*искать вперед*/,1/*Активация кнопки Найти далее*/, false/* Задание формата */,"Иван"/*На что заменить*/,2/*Заменить все*/);
В заключении статьи повторим уже сказанное:
Богатства возможностей по управлению серверами автоматизации просто
потрясает, так как нет ни одного действия, которое можно было бы
выполнить в автономно запущенном приложении и которое бы не было доступно
для контроллера автоматизации. К сожалению каждое действие, которое
требуется выполнить, при программировании контроллеоа в среде «Borland C++
Builder», даже при применении описанного выше «хитрого» метода, порой
выполняется с большой затратой времени, но, как поется в песне: «..если долго
мучиться, что-нибудь получится!..». Отправные шаги сделаны. Дерзаем далее.
В начало
Введение
Работа с OLE-сервером Excel
Пример программы управления OLE сервером Word
Домой
Сайт управляется системой uCoz
Работа с OpenOffice Writer и MS
Word из Borlan C++ Builder через OLE.
Разробатывал сам пользуясь
поиском по интернету и советами с форумов, требовалось по работе, может кому
пригодится. Есть почти все, что требуется для вывода отчетов из Билдера в Офис
(работа с текстом и таблицами). Программа может сама определить, какой Офис
установлен и выбрать, в какой требуется выодить информацию.
Реализованы фунуции:
·
CheckOffice();
·
OfficeVisible(AnsiString
Office, Variant app, Variant Document, bool Visible); //показать документ
·
OfficeFindReplace(AnsiString
Office, Variant app, Variant Document, AnsiString sFind, AnsiString sReplace);
// найти sFind и заменить на
sReplace
·
OfficePrintPreview(AnsiString
Office, Variant Document); //предпросмотр
·
OfficePrint(AnsiString
Office, Variant app, Variant Document); // печать
·
OfficePrintParam(AnsiString
Office, Variant app, Variant Document, int vCopies, AnsiString vRangeText,
AnsiString vPrinter); // печать с параметрами
·
OfficeFillCell(AnsiString
Office, Variant Document,int table,int string,int row, AnsiString str); // Записать строку STR в ячейку номер
(String, Row) таблицы номер
Table
·
OfficeTableAddRow(AnsiString
Office, Variant Document, int table);
// добавить 1 строку в конец
·
OfficeOpenDoc(AnsiString
Office, Variant *app, AnsiString FileName); // открыть документ
·
OfficeSaveDoc(AnsiString
Office, Variant Document); // сохранить документ
·
OfficeSaveAsDoc(AnsiString
Office, Variant Document, AnsiString FileName); // сохранить документ как
·
OfficeQuit(AnsiString Office,
Variant app, Variant Document); // закрыть документ
·
OfficeStrDel(AnsiString
Office, Variant app, Variant Document, int Str, int Cnt); // удалить строки
Архив (OLEwork.cpp и OLEwork.h):
OLEWork.zip
Советы, предложения и указания на возможные ошибки приветствуются.
(C) lYY (Леонид)
I want to have my C++ Builder application fill the following Word document form :
http://oesv.at/media/media_vereinsservice/media_formulare/Zuschlagsberechnung-Alpin_06-07.doc
I manage to do this with Ole procedures calling OpenOffice Writer but for users of my application who don’t have OpenOffice installed but Microsoft Office instead I want to call Ole procedures with Word.
I tried without success to find and see the structure of this document file: like a tree map with : the document object, the Fields or FormFields objects, their properties «Field», which have properties Result, which is a range object having property Text and the document property Selection which has the procedure «TypeText». But no structure view available, so just guessing in the dark how the document file is structured.
Here below two solutions I tried without success:
first: the commented part consist on selecting the text input field and have this current selection in the document call its procedure «TypeText». This throws an error saying the object I try to modify is in a protected area of the document : «EOleException : Cette méthode ou propriété n’est pas disponible car l’objet fait référence à une zone protégée d’un document.».
second: the code below throws an error «EOleException : Le type ne correspond pas» that can be translated «Type mismatch» on the line «Result.OlePropertySet(«Text», vInputText);». I have tried to pass a WideString or directly the default string format for my project without success.
try
{
//---ouverture de Word
vMSWord.OlePropertySet("Visible", false);
//---ouverture du fichier
vFileName = Variant(wFile.c_bstr());
vWDocuments = vMSWord.OlePropertyGet("Documents");
vWDocument = vWDocuments.OleFunction("Open", vFileName);
Variant fields, field;
fields = vWDocument.OlePropertyGet("FormFields");
for (int i=1; i<=fields.OlePropertyGet("Count"); i++)
{
Variant field = fields.OleFunction("Item",(Variant)i);
//field.OleFunction("Select");
//Variant selection = vMSWord.OlePropertyGet("Selection");
//selection.OleProcedure("TypeText",WideString("My input text"));
Variant Result = field.OlePropertyGet("Result"); // result = objet range
Variant vInputText = Variant(WideString("My input text").c_bstr());
Result.OlePropertySet("Text", vInputText);
}
//---sauvegarde en fichier texte
vFileName = Variant(wNewFile.c_bstr());
ShowMessage("Saveas :");
vWDocument.OleProcedure("Saveas", vFileName);
}
catch(Exception &e)
{
ShowMessage(AnsiString(e.ClassName())+ e.Message);
}
Содержание
Работа с OLE-сервером
В роли сервера выступает установленное приложение MS Excel или Word.
Для работы необходимо подключить заголовки: <ComObj.hpp> и <utilcls.h>.
Взаимодействие происходит с помощью методов сервера:
-
OlePropertyGet — принимает строку в качестве параметра и возвращает данные, содержащиеся в указанном свойстве объекта
-
OlePropertySet — принимает несколько параметров, первый из которых — строка, указывающая на изменяемое свойство, а последующие параметры — данные, которые будут записаны в это свойство
-
OleProcedure и OleFunction — выполняют указанный метод объекта
Объекты сервера имеют вложенную, иерархическую структуру, например excel содержит: само приложение (Excel.Application), далее набор книг (Workbooks), далее набор страниц (WorkSheets), далее набор ячеек (Cells).
Работа с Excel
Создаем документ, задаем начальные параметры
(..) // Переменные объявлены глобально Variant VApp, VSetBooks, VBook, VSetSheets, VSheet, VSetCells, VCell; (..) // Создаем объект приложения Excel VApp= CreateOleObject("Excel.Application"); VApp.OlePropertySet("Visible", true); // Создаем объект- набор рабочих книг VSetBooks= VApp.OlePropertyGet("Workbooks"); // Задаем кол-во листов в создаваемой книге VApp.OlePropertySet("SheetsInNewWorkbook", 1); VSetBooks.OleProcedure("Add"); // Создаем книгу // Ссылка на текущую книгу (у нас одна) VBook= VSetBooks.OlePropertyGet("Item", 1); // Создаем объект- набор страниц, выбранной книги VSetSheets= VBook.OlePropertyGet("Worksheets"); // Выбираем первую страницу VSheet= VSetSheets.OlePropertyGet("Item", 1); // Задаем свойства странице VSheet.OlePropertySet("Name", WideString("Первый лист"));
Далее заполняем данными
// Выбираем группу ячеек, для массовой установки общих свойств VCell= VSheet.OlePropertyGet("Range", WideString("A1:C5")); // Настройка шрифта VCell.OlePropertyGet("Font").OlePropertySet("Name", WideString("Arial")); VCell.OlePropertyGet("Font").OlePropertySet("Size", 16); VCell.OlePropertyGet("Font").OlePropertySet("Color", clBlue); //VCell.OlePropertySet("RowHeight", 15); VCell.OlePropertySet("ColumnWidth", 25); // Вносим значения VSetCells= VSheet.OlePropertyGet("Cells"); VSetCells.OlePropertyGet("Item", 1, 2).OlePropertySet("Value", WideString("1я строка, 2ой столбец"));
Еще примеры
Выравнивание по центру (-4108 константа, означает центр)
VCell.OlePropertySet("HorizontalAlignment", -4108); VCell.OlePropertySet("VerticalAlignment", -4108);
Выбор одной ячейки
VCell= VSheet.OlePropertyGet("Cells").OlePropertyGet("Item", 1, 1);
При выборе группы ячеек, их можно объединить
VCell= VSheet.OlePropertyGet("Range", WideString("A1:C5")); VCell.OleProcedure("Merge");
Стили шрифта в ячейке
//Жирный VCell.OlePropertyGet("Font").OlePropertySet("Bold",true); //Курсив VCell.OlePropertyGet("Font").OlePropertySet("Italic",true); //Зачеркнутый VCell.OlePropertyGet("Font").OlePropertySet("Strikethrough",true); //Верхний индекс VCell.OlePropertyGet("Font").OlePropertySet("Superscript",true); //Нижний индекс VCell.OlePropertyGet("Font").OlePropertySet("Subscript",true); //Без линий VCell.OlePropertyGet("Font").OlePropertySet("OutlineFont",true); //C тенью VCell.OlePropertyGet("Font").OlePropertySet("Shadow",true); //Подчеркнутое одинарной линией по значению VCell.OlePropertyGet("Font").OlePropertySet("Underline",2); //Подчеркнутое двойной линией по значению VCell.OlePropertyGet("Font").OlePropertySet("Underline",-4119); //Подчеркнутое одинарной линией по ячейке VCell.OlePropertyGet("Font").OlePropertySet("Underline",4); //Подчеркнутое двойной линией по значению VCell.OlePropertyGet("Font").OlePropertySet("Underline",5);
Заливка ячейки
VCell.OlePropertyGet("Interior").OlePropertySet("ColorIndex",35);
Установить рамку вокруг выбранных ячеек проведением линий с выбранной стороны (Borders) с указанием стиля линии (LineStyle) толщины (Weight) и цвета линии(ColorIndex).
VCell.OlePropertyGet("Borders",10).OlePropertySet("LineStyle",1); VCell.OlePropertyGet("Borders",10).OlePropertySet("Weight",4); VCell.OlePropertyGet("Borders",10).OlePropertySet("ColorIndex",46);
Работа со страницами
// Добавить страницу (добавляется в начало) VSetSheets.OleProcedure("Add"); // Активация второй страницы OleVariant vSecondSheet= VSetSheets.OlePropertyGet("Item",2); vSecondSheet.OleProcedure("Activate"); OleVariant vBefore= EmptyParam, vAfter= vVarSheets.OlePropertyGet("Item",2); // Меняем местами VSheet.OleProcedure("Move", vBefore, vAfter); // Или копируем VSheet.OleProcedure("Copy", vBefore, vAfter); // Или лист копируем или переносим в новую книгу VSheet.OleProcedure("Copy"); VSheet.OleProcedure("Move");
.
0 / 0 / 0 Регистрация: 16.02.2010 Сообщений: 15 |
|
1 |
|
09.04.2010, 17:08. Показов 9702. Ответов 12
Начал работать с Ole-сервером, но возникли 2 проблемки:
0 |
1177 / 987 / 83 Регистрация: 29.10.2009 Сообщений: 1,385 |
|
10.04.2010, 01:00 |
2 |
Str@nn!k, сочувствую.
0 |
1177 / 987 / 83 Регистрация: 29.10.2009 Сообщений: 1,385 |
|
10.04.2010, 01:16 |
3 |
Вот, собрал что мог на эту тему, не глядя.
1 |
0 / 0 / 0 Регистрация: 16.02.2010 Сообщений: 15 |
|
11.04.2010, 02:45 [ТС] |
4 |
Нашел очень много интересного… Но все-таки не совсем то С таблицами я в принципе немного разобрался, вот только не знаю, как новые строки добавлять, но не это самое главное. Основное, чем я сейчас занят — это при создании нового документа задать альбомную ориентацию страницы, но видно мне это не по силам Ну ничего — время и труд все перетрут!О_о
0 |
31 / 31 / 3 Регистрация: 18.03.2009 Сообщений: 381 Записей в блоге: 2 |
|
11.04.2010, 13:02 |
5 |
набери в поиске, тема уже обсуждалась, в какой то теме есть полезная ссылка на сайт где расписано создание таблиц и тд в ворде
0 |
0 / 0 / 0 Регистрация: 16.02.2010 Сообщений: 15 |
|
11.04.2010, 14:04 [ТС] |
6 |
Да в том то и дело, что я сначала весь форум перерыл и ничего не нашел Пришлось самому создавать, но никто ничего конкретного сказать видно пока не может. Да и не таблицы первостепенная важность, а изменение параметров страницы при создании нового документа!
0 |
Sasha 4955 / 2419 / 531 Регистрация: 05.06.2008 Сообщений: 7,518 Записей в блоге: 3 |
||||
11.04.2010, 21:34 |
7 |
|||
Я устанавливаю так Альбомный лист
0 |
0 / 0 / 0 Регистрация: 16.02.2010 Сообщений: 15 |
|
12.04.2010, 18:42 [ТС] |
8 |
ВО! А я ток сегодня утром узнал)))))) Спс))
0 |
0 / 0 / 0 Регистрация: 16.02.2010 Сообщений: 15 |
|
13.04.2010, 13:50 [ТС] |
9 |
Ну вот, наполовину помогли, теперь остался только вопрос: Как добавлять новые строки в таблице?
0 |
Sasha 4955 / 2419 / 531 Регистрация: 05.06.2008 Сообщений: 7,518 Записей в блоге: 3 |
||||
13.04.2010, 13:57 |
10 |
|||
1 |
0 / 0 / 0 Регистрация: 16.02.2010 Сообщений: 15 |
|
13.04.2010, 14:12 [ТС] |
11 |
Вот то, что и было нужно, фактически мой проект готов. Всем спасибо, особенно Sashe!
0 |
0 / 0 / 0 Регистрация: 16.02.2010 Сообщений: 15 |
|
14.04.2010, 13:58 [ТС] |
13 |
А вот за ссылочку огромное спс. У меня когда-то был этот учебник, но я его где-то посеял… Еще раз спс! И обязательно приду еще!
0 |
Есть какой-то документ Word. Открываем его на С++.
Unit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <ComObj.hpp> // Хидер для OLE объектов //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Variant Ap, W, Ws; // Переменный Ap - Application, Ws - Word страница Ap = CreateOleObject("Word.Application.15"); // 15 - Верся OLE объекта для Word 2013 Ap.Exec(PropertySet("Visible") << true); // Видимость Word Ws = Ap.Exec(PropertyGet("Documents")); Ws.OleProcedure("Open", WideString (L"C:\word\word.docx")); //Открываем файл Word Form1 -> Close(); //Закрываем форму } //---------------------------------------------------------------------------
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <System.Classes.hpp> #include <Vcl.Controls.hpp> #include <Vcl.StdCtrls.hpp> #include <Vcl.Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif
- Подробности
- Родительская категория: Уроки и примеры программирования C++ Embarcadero RAD Studio 10 | C++ Builder 10
- Категория: Microsoft Word
-
Просмотров: 7082
2.1 Создание OLE-объектов
Компонент TOleContainer позволяет поместить OLE-объект на
поверхности формы. Основные свойства этого компонента: AutoActivate —
определяет, каким образом активизируется OLE-объект, OleClassName — имя
класса OLE-объекта, содержащегося в контейнере. Основные методы:
InsertObjectDialog — выводит стандартную диалоговую панель Object для
выбора типа объекта или загрузки его из файла, CreateObject — создает
OLE-объект, DestroyObject — уничтожает объект.
Создадим простейший пример использования OleContainer. С
этой целью поместим на форму компонент TPanel со свойством Align, равным
alClient, на него — компонент TOleContainer, кнопку и главное меню (можно
создать в нем один пункт). Панель и меню нужны для отображения
инструментальных панелей и меню OLE-серверов, обслуживающих отображаемые в
TOleContainer объекты.
Рис.7. Форма с TOleContainer
Создадим обработчик события, связанный с нажатием на кнопку:
void __fastcall TForm1::Button1Click(TObject *Sender) { OleContainer1->InsertObjectDialog(); }
Запустив приложение и нажав на кнопку, получим диалог для
вставки объекта:
Рис.8. Диалог вставки объекта
В списке перечислены все OLE-серверы, зарегистрированные
на данном компьютере.
Можно выбрать один из них (например, документ Word).
Теперь после двойного щелчка на объекте TOleContainer получим на
компоненте TPanel инструментальную панель MS Word, главное меню и сам
документ.
Рис.9. Активный объект в OleContainer
Если тип объекта, включаемого в TOleContainer, известен
заранее, можно использовать метод CreateObject:
void __fastcall TForm1::Button1Click(TObject *Sender) { OleContainer1->CreateObject("Word.Document",True); }
Второй параметр этого метода указывает, отображать ли
объект внутри OleContainer в виде пиктограммы.
Модифицируем приложение, добавив еще две кнопки с
надписями «Свойства» и «Вставка», и создадим соответствующие обработчики
событий:
void __fastcall TForm1::Button2Click(TObject *Sender) { OleContainer1->ObjectPropertiesDialog(); } //-------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { OleContainer1->PasteSpecialDialog(); }
Скомпилируем приложение. Добавим какой-нибудь объект в
OLEContainer.
Нажав на кнопку «Свойства», получим стандартный диалог с
описанием свойств объекта.
Рис.10. Диалог с описанием свойств объекта
Нажав кнопку «Вставить», получим диалог вставки объекта:
Рис.11. Диалог специальной вставки
Выбрав тип вставки объекта, можем вставить его в OLEContainer:
Перейти к содержимому
Рассмотрим работу с Microsoft Word в C++. Для того чтобы C++ мог работать с Word-ом нужна библиотека-парсер, где будут описаны способы взаимодействия с этой программой. Для примера рассмотрим работу в компиляторах Borland C++ Builder и MS Visual C++.
В BCB для взаимодействия с Word достаточно подключения библиотеки ComObj.hpp, она дает возможность работать с Ole, что позволяет принимать и посылать данные Word.
Пример такой программы:
{ Variant wrd; wrd = CreateOleObject(«Word.Application»); wrd.OlePropertyGet(«Documents»).OleProcedure(«Open», «D:\word.doc»); wrd.OlePropertyGet(«ActiveDocument»).OlePropertyGet(«Content»).OleProcedure(«InsertAfter»,«Привет»); wrd.OlePropertyGet(«ActiveDocument»).OleProcedure(«Save»); wrd.OlePropertyGet(«ActiveDocument»).OleProcedure(«Close»); } |
Поясним работу программы: посредством Ole создаётся объект (CreateOleObject()), это приложение Word. После этого объект wrd открывает файл (OleProcedure(«Open», «D:\word.doc»). Затем в открывшийся файл word-а записывается слово «Привет».
Итак, функции OleProcedure, OlePropertyGet и OlePropertySet позволяют получить доступ ко всем объектам Word.
Похожая программа в MS Visual C++ содержит заголовочный файл Word.h и файл cpp. Рассмотрим их далее.
Файл Word.h для версии Word 2007. Для других версий — аналогично.
// Word.h #define Uses_MSO2007 #import «C:\Program Files\Microsoft Office\Office12\MSWORD.OLB» auto_rename |
cpp-файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include «stdafx.h» #include <conio.h> #include <iostream> #include «Word.h» using namespace System; using namespace std; int main(array<System::String ^> ^args) { ::CoInitialize(NULL); using namespace Word; _ApplicationPtr wrd(L«Word.Application»); wrd->Documents->Open(&_variant_t(«D:\word.doc»)); wrd->ActiveDocument->Content->InsertAfter(«Пока»); wrd->ActiveDocument->Save(); wrd->ActiveDocument->Close(); ::CoUninitialize(); } |