Ole работа с word



Работа с OLE-сервером Word.

Аналогично как и в части 1 — поставим целью из приложения (контроллера
автоматизации) создать документ изображенный на Рис 2.1. Он также типичен с
точки зрения созданя прикладных программ, использующих для вывода информации
Word и содержит три наиболее часто используемых составных элемента: текстовую
информацию, таблицу и диаграмму.

Путь создания данного документа — это шаги, которые позволят освоить работу
с OLE сервером Word.

ole_2_1.jpg

Рис 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 Вывод текстовой информации.

На первом этапе выводим текст. Пусть на данном этапе необходимо
вывести следующее.

ole_2_2.jpg

Рис 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 Изменение параметров документа.

Раскрасим текст как показано на рисунке.

ole_2_3.jpg

Рис 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 Работа с таблицами.

Добавим к создаваемому документу табличку, как показано на рисунке.

ole_2_4.jpg

Рис 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



23 Просмотры /  0 like /  30.11.2000/ /

Мы не будем здесь влезать в дебри OLE, его сути и различных тонкостей и отличий от аналогичных технологий. OLE есть OLE и применять его иногда бывает очень полезно. Что же он дает ?

Часть 1.Работа с Word

Мы не будем здесь влезать в дебри OLE, его сути и различных тонкостей и отличий от аналогичных технологий. OLE есть OLE и применять его иногда бывает очень полезно. Что же он дает ? Последнне время, большая часть софтверных компаний (по-крайней мере Microsoft) пишут свои приложения как OLE-объекты. Следовательно, мы можем из Foxpro полностью управлять работой таких программ. К таким программам относятся Word, Excel и другие из MS Office, так же Outlook Express и много других. Достаточно хорошо, что можно легко ввести данные в фокспрошную программу, там их обработать, сделать отчет в формате MS Word и отдать начальнику. Так как Word является намного более используемой программой, с него и начнем.
Перед началом работы с ЛЮБЫМ OLE объектом его сначала нужно проиницилизировать. Для Wordа это выглядит следующим образом: [code] oword=create(‘word.application’) oword.documents.add() [/code] Здесь происходит загрузка Word в память и создание нового(пустого) документа. Теперь можно указать заголовок окна Wordа: [code] oword.caption=’Word97 Test’ [/code] В принципе, можно и не указывать заголовок окна, но возможность такая есть. Это была обязательная часть кода (исключая заголовок) для работы с Wordом. Теперь будем работать непосредственно с созданным документом. Для вставки текста в документ используется метод INSERTAFTER(text), где text — необходимый для вставки текст 😉
Пример вствки текста в документ: [code] oword.Selection.insertafter(chr(13)) && вставляем ENTER oword.Selection.insertafter(‘DATE: ‘) oword.Selection.insertafter(date()) && … и текущую дату [/code] Точно также можно вставлять несколько ENTERов (отделяя блоки текста) [code] FOR i = 1 to 3 oword.Selection.insertafter(chr(13)) ENDFOR [/code] И сразу вставлять текст и перевод курсора на следующую строку: [code] oword.selection.insertafter(‘Thank you,’+chr(13)) [/code] Также можно вставлять разделительные полосы: [code] oword.selection.insertafter(repl(‘_’,25))[/code] И осталось только снять выделение с введенного текста: [code] END=oword.activedocument.Bookmarks(«ENDOFDOC»).select[/code] Теперь придадим форму самому окну Wordа и сделаем его видимым: [code] oword.top = 1 oword.left = 1 oword.width = 500 oword.height = 450 oword.visible= .t. [/code]

Урок 2. Работа с IE.

Теперь по аналогии работы с Word, мы нмного поуправляем Internet Explorerом. Вообще, чтобы управлять любым OLE объектом достаточно просто узнать все его совйства и методы, но для этого нужно уметь владеть мало-мальским отладчиком (хотя бы отладчиком от фокспро). Для IE есть несколько следующих методов: переход на нужную страницу и заполнение форм.
Попробуем сделать небольшой пример работы с IE.
Сначала нужно определить запущем-ли уже браузер из нашего примера, для этого проверяется определена-ли переменная oie, если нет, то определяем ее как ссылку на объект IE.
[code] IF type (‘oie’)=’U’ PUBLIC oie oie=createobject(‘internetexplorer.application’) ENDIF [/code] Теперь с помощью метода Navigate переходим на страничку поиска людей в Yahoo! [code] oie.navigate(‘http://www.yahoo.com/search/people’) [/code] Делаем небольшую паузу, чтобы бровзер открыл сайт. Если в работе программы будут ошибки из-за медленного Интернет-соединения, то это время нужно увеличть. [code] lntime=seconds() DO while seconds()-lntime< 6 ENDDO [/code] Теперь делаем окно IE видимым и заполняем форму. [code] oie.visible= .t. [/code] Нижеследующие обращения к IE весьма напоминают синтаксис JavaScript, и вы можете почерпнув оттуда свойства сделать с IE что-нибудь ужасное ;-). А что происходит тут: идет обращение(заполнение) полей формы forms(1) значениями имени, фамилии и т.д., где firstname — поле имя и т.п. [code] oie.document.script.window.document.forms(1).firstname.value = «john» oie.document.script.window.document.forms(1).lastname.value = «harvey» oie.document.script.window.document.forms(1).city.value = «memphis» oie.document.script.window.document.forms(1).state.value = «tn» oie.document.script.window.document.forms(1).submit() [/code] Ну а последняя строка кода «нажимает» на кнопку отправить. Вы можете ее временно убрать, чтобы посмотреть как заполняются поля формы.

Автор: Неизвестно

Автор публикации

Комментарии: 2Публикации: 174Регистрация: 25-06-2000

Вложенные файлы
#
Название
Тип файла
Размер
1 49ole .zip 728,00 Б
  • Download demo project- 37.6 KB
  • Download demo executable- 167 KB

Introduction

“MS Office Automation using C++” — this is what I started searching over the internet a few weeks back to plot a graph in an Excel sheet through my program. Fortunately, I got a few — actually very few — inputs from the cyber world, might be because I am a poor searcher in the internet. This article is for those who are still searching the internet with the same keywords.

OLEAutoWord.JPG

OLEAutoExcel.JPG

Object Linking and Embedding

In early days, I wondered how much easier it was to use Visual Basic than any other programming language. Create a media player just by including the Media Player component with our project, create a web browser just by including the Web Browser component to the project etc. When I tried the same with Visual C++, I realized it is not as easy as in VB. I met with lot of linker errors as I was a newbie. The above story is eight years old. Object Linking and Embedding, popularly called as OLE, is a COM based architecture which provides flexibility and reusability while developing software applications. As I said, if you need to develop a media player application, there is not much to do with code. Include the needed components which are already developed by experts. With OLE, we are linking to the component and embedding it to our application. OLE in Windows is everywhere, you can copy paste images, videos, or music files to a Word document, you can open a PDF, Excel, or Word file in Internet Explorer, and so on…

ComponentesInterfacesClients.JPG

You can find lots of registered components of different applications under HKEY_CLASSES_ROOTCLSID{<___CLSID___>}, where {<___CLSID___>} is variant (unique class ID for each registered component).

COM and Interfaces

I won’t be able to say anything new about COM and interfaces here. A COM object, as its name suggests, is a component which can be easily attached to any application using its interfaces. A COM component may have any number of interfaces, and it is not necessary for an application to use all its interfaces. An interface is nothing but a pure virtual class. It has no implementation code, and is used only for communication between applications with a COM object.

Let’s start with what Microsoft has to say about “MS Office Automation using C++”:

“Automation (formerly OLE Automation) is a technology that allows you to take advantage of an existing program’s functionality and incorporate it into your own applications.”

  • With MFC, use the Visual C++ ClassWizard to generate «wrapper classes» from the Microsoft Office type libraries. These classes, as well as other MFC classes, such as COleVariant, COleSafeArray, and COleException, simplify the tasks of Automation. This method is usually recommended over the others, and most of the Microsoft Knowledge Base examples use MFC.
  • #import, a new directive that became available with Visual C++ 5.0, creates VC++ «smart pointers» from a specified type library. It is very powerful, but often not recommended because of reference-counting problems that typically occur when used with the Microsoft Office applications.
  • C/C++ Automation is much more difficult, but sometimes necessary to avoid overhead with MFC, or problems with #import. Basically, you work with such APIs as CoCreateInstance(), and COM interfaces such as IDispatch and IUnknown.

The above statements are purely taken from the Microsoft website Office Automation Using Visual C++. This article is all about the third point mentioned above, i.e., C/C++ Automation using COM interfaces, and the article only takes MS Word to explain in detail. Refer to the demo source code for similar MS Excel stuff.

Initialize an MSWord Application

CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);

IDispatch *pWApp;
if(SUCCEEDED(hr))
{
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, 
                          IID_IDispatch, (void **)&pWApp);
}

Call CoInitialize() to initialize the COM library for the current thread, i.e., the current thread will be loaded with COM library DLLs. Later, we need to call CoUnInitialize() to unload the loaded COM DLLs from memory. As I mentioned earlier, all registered components can be found under “HKCRCLSID” in the Registry. You can also find the PROGID (program ID) for the component. Use the CLSIDFromProgID() API to get the class ID for the component, since we can get the COM object only by using the CLSID. For MS Word, “Word.Application.xx” is the version dependent PROGID, where xx is version of the MS Word installed in the system. For our convenience, to write code independent of the version, MSWord provides another PROGID “Word.Application”, which is under “VersionIndependentProgID”. Call CoCreateInstance() with the MS Word CLSID to get an instance of an MS Word application. pWApp (IDispatch interface) should receive a valid MS Word component interface object.

IDispatch Interface

IDispatch is an interface derived from IUnknown (the base interface), using which applications will expose methods and properties to other applications (our program) to make use of its features. Simply, the IDispatch pointer we got using CoCreateInstance() for MS Word is the interface object which will help us to use MS Word methods and properties through our program. In addition to the IUnknown members, IDispatch has four more member functions to support OLE Automation.

  • GetTypeInfoCount()
  • GetTypeInfo()
  • GetIDsOfNames()
  • Invoke()

The client application (our program) will use the IDispatch::Invoke() method to call MS Word (or any other component) methods and properties. But, IDispatch::Invoke() cannot receive or understand the actual method names or property names of the MS Word component. It can understand only the DISPID. A DISPID is a 32-bit value which represents the actual methods or properties of a component. GetIDsOfName() is the function we can use to get the DISPID for a method or property of the component. For example, refer to the following code which sets the “Visible” property of an MS Word object:

DISPID dispID;
VARIANT pvResult;
LPOLESTR ptName=_T("Visible");
hr = pWApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if(SUCCEEDED(hr))
{
    VARIANT x;
    x.vt = VT_I4;
    x.lVal =1;     DISPID prop=DISPATCH_PROPERTYPUT;

    DISPPARAMS dp = { NULL,NULL,0,0 };
    dp.cArgs =1;
    dp.rgvarg =&x;
    dp.cNamedArgs=1;
    dp.rgdispidNamedArgs= ∝
    hr = pWApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, 
                          &dp, &pvResult, NULL, NULL);
}

Get the DISPID of “Visible”, use the DISPID with Invoke() to set the “Visible” property to true. ptName will be the actual name of a method or a property, used with the GetIDsOfNames() method to get an equivalent DISPID. DISPPARAMS has the parameters for the DISPID (including the method parameter or the property value), used with the Invoke() method which is the actual call for the method or property.

To make the code easier to use, following is the generic function to call an OLE method or to set/get an OLE property:

HRESULT OLEMethod(int nType, VARIANT *pvResult, 
                  IDispatch *pDisp,LPOLESTR ptName, int cArgs...)
{
    if(!pDisp) return E_FAIL;

    va_list marker;
    va_start(marker, cArgs);

    DISPPARAMS dp = { NULL, NULL, 0, 0 };
    DISPID dispidNamed = DISPID_PROPERTYPUT;
    DISPID dispID;
    char szName[200];

        WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

        HRESULT hr= pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, 
                             LOCALE_USER_DEFAULT, &dispID);
    if(FAILED(hr)) {
        return hr;
    }
        VARIANT *pArgs = new VARIANT[cArgs+1];
        for(int i=0; i<cArgs; i++) {
        pArgs[i] = va_arg(marker, VARIANT);
    }

        dp.cArgs = cArgs;
    dp.rgvarg = pArgs;

        if(nType & DISPATCH_PROPERTYPUT) {
        dp.cNamedArgs = 1;
        dp.rgdispidNamedArgs = &dispidNamed;
    }

        hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, 
                       nType, &dp, pvResult, NULL, NULL);
    if(FAILED(hr)) {
        return hr;
    }

        va_end(marker);
    delete [] pArgs;
    return hr;
}

The above function is actually named as AutoWrap() in a Microsoft support article. Nothing new to explain about the function as I have already explained about the GetIDsOfName() and Invoke() calls, except that they are separated to a function. Additionally, the function uses variable arguments to handle different number of parameters for different methods/properties. Now, to set the Visible property of the MS Word object, it is more simpler to use this generic function:

VARIANT x;
x.vt = VT_I4;
x.lVal = 1;        hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pWApp, L"Visible", 1, x);

Note that, OLEMethod receives variable parameters. I.e., you can pass any number of parameters depending on the property/method. Following is a summary of the OLEMethod() parameters,

  • nType – Type of call to make, which can be any of the following values:
    • DISPATCH_PROPERTYPUT — Set property value
    • DISPATCH_PROPERTYGET — Get property value
    • DISPATCH_METHOD — Call a method
  • pvResult – Return value for the call made; it can be another IDispatch object, or an integer value, or a boolean, or so on..
  • pDispIDispatch interface object for which the call is to be made.
  • ptName – Property or method name.
  • cArgs – Number of arguments followed after this parameter.
  • … parameters in reverse order for the call (it can be values of a property, or parameters of a method for the IDispatch object).

Methods and Properties

The MS Word application has a number of properties and methods, and everything cannot be explained here. I will explain a couple of functions here; refer to the source code for more functions, because the code for all the method/property calls will look similar. At the end of this section, I will tell you how to find a method name or property name and its parameters or values whenever needed.

To open a word document:

HRESULT CMSWord::OpenDocument(LPCTSTR szFilename, bool bVisible)
{
    if(m_pWApp==NULL) 
    {
        if(FAILED(m_hr=Initialize(bVisible)))
            return m_hr;
    }
    COleVariant vFname(szFilename);
    VARIANT fname=vFname.Detach();
        {
        VARIANT result;
        VariantInit(&result);
        m_hr=OLEMethod(DISPATCH_PROPERTYGET, &result, m_pWApp, 
                       L"Documents", 0);
        m_pDocuments= result.pdispVal;
    }
        {
        VARIANT result;
      VariantInit(&result);
        m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pDocuments, 
                       L"Open", 1, fname);
        m_pActiveDocument = result.pdispVal;
    }
    return m_hr;
}

To open a new document, replace “Open” with “Add” and change the parameters count to 0. Note that, “result” is the output parameter which holds the IDispatch object for “Documents” and “Open” (active document) in the above code.

To close all the opened Word documents:

HRESULT CMSWord::CloseDocuments()
{
    if(m_pWApp==NULL) return E_FAIL;
    {
        VARIANT result;
            VariantInit(&result);
        m_hr=OLEMethod(DISPATCH_METHOD, &result, m_pDocuments, 
                       L"Close", 0);
        m_pDocuments=NULL;
        m_pActiveDocument=NULL;
    }
    return m_hr;
}

The following code will set the font for the selected text in the active document:

HRESULT CMSWord::SetFont(LPCTSTR szFontName, int nSize, 
                 bool bBold, bool bItalic,COLORREF crColor)
{
    if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
    IDispatch *pDocApp;
    {  
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, 
                  m_pActiveDocument, L"Application", 0);
        pDocApp= result.pdispVal;
    }
    IDispatch *pSelection;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, 
                  pDocApp, L"Selection", 0);
        pSelection=result.pdispVal;
    }
    IDispatch *pFont;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, 
                  pSelection, L"Font", 0);
        pFont=result.pdispVal;
    }
    {
        COleVariant oleName(szFontName);
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, 
                       L"Name", 1, oleName.Detach());
        VARIANT x;
        x.vt = VT_I4;
        x.lVal = nSize;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Size", 1, x);
        x.lVal = crColor;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Color", 1, x);
        x.lVal = bBold?1:0;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Bold", 1, x);
        x.lVal = bItalic?1:0;
        m_hr=OLEMethod(DISPATCH_PROPERTYPUT, NULL, pFont, L"Italic", 1, x);
    }
    pFont->Release();
    pSelection->Release();
    pDocApp->Release();
    return m_hr;
}

To insert a picture into the active document:

HRESULT CMSWord::InserPicture(LPCTSTR szFilename)
{
    if(!m_pWApp || !m_pActiveDocument) return E_FAIL;
    IDispatch *pDocApp;
    {  
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, m_pActiveDocument, 
                  L"Application", 0);
        pDocApp= result.pdispVal;
    }
    IDispatch *pSelection;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pDocApp, L"Selection", 0);
        pSelection=result.pdispVal;
    }
    IDispatch *pInlineShapes;
    {
        VARIANT result;
        VariantInit(&result);
        OLEMethod(DISPATCH_PROPERTYGET, &result, pSelection, L"InlineShapes", 0);
        pInlineShapes=result.pdispVal;
    }
    {
        COleVariant varFile(szFilename);
        COleVariant varLink((BYTE)0);
        COleVariant varSave((BYTE)1);
        OLEMethod(DISPATCH_METHOD,NULL,pInlineShapes,L"AddPicture",3, 
                  varSave.Detach(),varLink.Detach(),varFile.Detach());
    }
    return m_hr;
}

How can we identify a method/property which we need for an MS Word application? The answer is simple, look at the above functions, they can be simply explained as:

Application.Documents.Open(szFilename)
Documents.Close()
ActiveDocument.Application.Selection.Font.Name=szFontName
ActiveDocument.Application.Selection.Font.Size=nSize
ActiveDocument.Application.Selection.Font.Color=crColor
ActiveDocument.Application.Selection.Font.Bold=bBold
ActiveDocument.Application.Selection.Font.Italic=bItalic
ActiveDocument.Application.Selection.InlineShapes.AddPicture(szFilename,false,true)

Does this resemble something familiar to us? Yes, we used to see this often when creating macros in MS Word or MS Excel. These are VBA scripts. So, don’t you think it is much easier to get a method or property name you need for your application?

What to do when you need to know how to insert a picture into a Word document?

  • Open MS Word
  • Open a new document
  • Go to Tools->Macro->Record New Macro
  • Choose a keyboard macro and assign a key for the macro
  • After the macro recording has been started, go to Insert->Picture->From File
  • Choose an image file
  • Stop macro
  • Go to Tools->Macro->Visual Basic Editor (F11)
  • Under “NewMacros”, you can see your recorded macro at the end
  • Look at the code:
  • Selection.InlineShapes.AddPicture FileName:=<your-image>, 
                           LinkToFile:=False, SaveWithDocument=True

Now, compare this with the above InsertPicture() function so that you can understand how it is being coded in C++.

So, whatever the task you want to do with MS Word through automation, first do that with a sample macro in MS Word itself, and you will get to know the methods and their parameters, the property names, and their values. The job will be easy then with the OLEMethod() call.

Points to Note

  • VARIANT is a structure union which means literally “not sure”. Yes, we are not sure about the data type, so it can be anything. Using VARIANT, we can get a BYTE value or an unsigned long value, or an IUnknown object, or whatever is needed in the case. Those who are already familiar with COM should know about this.
  • Make sure about the DISPATCH_METHOD, DISPATCH_PROPERTYPUT, and DISPATCH_PROPERTYGET usage in OLEMethod() or in the Invoke() call. We need to decide which needs to be used where, depending on the method or property we use with OLEMethod().
  • Try to understand GetIDsOfNames() and Invoke() explained in the «IDispatch Interface» section of this article, which are more important than other information provided here.
  • COleVariant is the class version of the VARIANT structure (union), which makes our job easier to initialize a variant with a value.
  • The OLEMethod() function receives variable parameters in reverse order. For example, the AddPicture parameters are actually <filename, > in order, whereas in OLEMethod, call <savewithdocument, />
  • If your Word or Excel application remains in memory (check with Task Manager) after closing your client application, make sure you have released all the used IDispatch objects.

Conclusion

All the concepts explained above are same for Excel as well. Refer to the demo source code for Excel usage. The aim of this article is not to give you the complete set of methods and properties for MS Word and MS Excel Automation, but to give you a hand to help you do the Automation yourself. All the best.

    Naren started coding during 1999 with FORTRAN, then COBOL, PASCAL, C, C++, VC++ ….. C#, Java, ASP so on, till today. He claims himself as techie who loves coding, but he is not even sure which technology or platform he loves, most of the time Windows, some time WinCE, some time Linux, nowadays Android and embedded platforms. He can do some query stuffs with Oracle, SQL Server, MySQL. He strongly believes that C/C++ is a must for all programmers, «if you know C/C++, you can do programming on any language». He is an electronic gadget guy who likes to buy small gadgets all the time, at least he will do window shopping on a gadget shop. His interest always have been with Automation in any form, call it a little automated program sitting in his Laptop or a home automation program runs on his mobile. Apart from coding, he likes to do…???

    Приветствую.

    Попытался тоже подключиться к экселю из Visual Studio. Использую OFFICE 2016 и VS 2019.

    Сейчас имею следующий код, который почему-то не работает:

    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    /* Программа для работы с экселем
    *  напрямую из с++
    */
     
    #import "MSO.DLL" 
        rename("IAccessible", "IAccessibleXL")
    using namespace Office;
     
    #import "Vbe6ext.olb" 
        rename("Events", "EventsVB")
    using namespace VBIDE;
     
    #import "excel.exe" 
        rename("DialogBox", "DialogBoxXL") 
        rename("RGB", "RGBXL") 
        rename("DocumentProperties", "DocumentPropertiesXL")
    using namespace Excel;
     
    int main()
    {
     
        HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED);
        Excel::_ApplicationPtr pXL;
        pXL->Workbooks->Open(L"D:\testOle.xls");
        pXL->Visible = true;
     
        return 0;
    }

    Собственно, почему я вообще считаю что он должен работать:
    1. Все файлы из #import я поместил в папку с проектом и он успешно создал версии .tlh и .tli
    (к сожалению не знаю как тут пользоваться спойлерами и картинками, так что вот ссылка https://prnt.sc/12w9od5)
    2. Эти файлы не пустые и вполне себе читаемые:
    (рандомный кусок кода из mso.tlh

    Код

          virtual HRESULT __stdcall get_Parent (
            /*[out,retval]*/ IDispatch * * Parent ) = 0;
          virtual HRESULT __stdcall get_Extended (
            /*[out,retval]*/ BSTR * Extended ) = 0;
          virtual HRESULT __stdcall put_Extended (
            /*[in]*/ BSTR Extended ) = 0;
          virtual HRESULT __stdcall get_Id (
            /*[out,retval]*/ BSTR * Id ) = 0;
          virtual HRESULT __stdcall put_Id (
            /*[in]*/ BSTR Id ) = 0;
          virtual HRESULT __stdcall get_Language (
            /*[out,retval]*/ enum MsoScriptLanguage * Language ) = 0;
          virtual HRESULT __stdcall put_Language (
            /*[in]*/ enum MsoScriptLanguage Language ) = 0;
          virtual HRESULT __stdcall get_Location (
            /*[out,retval]*/ enum MsoScriptLocation * Location ) = 0;
          virtual HRESULT __stdcall raw_Delete ( ) = 0;
          virtual HRESULT __stdcall get_Shape (
            /*[out,retval]*/ IDispatch * * Object ) = 0;
          virtual HRESULT __stdcall get_ScriptText (
            /*[out,retval]*/ BSTR * Script ) = 0;
          virtual HRESULT __stdcall put_ScriptText (
            /*[in]*/ BSTR Script ) = 0;

    3. Странное поведение IDE, а именно HRESULT в main из этих файлов смог определиться, но при этом висит ошибка, которая звучит как С1083 «Не удаётся открыть файл библиотека типов: MSO.DLL: No such file or directory,»
    При этом красным подчёркивается единственная строчка с pXL->Visible = true; (примерно 25 строка кода)
    4. Помимо этого имеется 500+ ошибок E0102 «нестандартное опережающее объявление перечисляемого типа», но выглядят эти ошибки так, что сами пропадут, как только будет решена основная из пункта 3.

    Помогите, пожалуйста, разобраться в этом. Настройки VS стоят исходные, ничего не менял (разве что поменял кодировку с Юникода на многобайтовую, но что-то мне подсказывает, что не в этом проблема), установил буквально позавчера после сноса системы. В Visual Studio Installer постарался выбрать все пункты, которые могут быть связанны с MS Office, даже не относящиеся к с++

    Добавлено через 10 минут
    Последняя проблема была решена!
    Всё что нужно было сделать — это дать абсолютное имя файла в #import.
    Теперь новая ошибка
    Звучит она так:
    «Возникло необработанное исключение по адресу 0x00007FF9B225A839 в работа с экселем.exe: исключение Microsoft C++: _com_error по адресу памяти 0x000000BB1E0FF700.»
    (25 строка отказывалась компилироваться, так что я её удалил, а эта ошибка возникла в 24 строке)

    Руководитель: 

    Мусина Марина Владимировна

    Учреждение: 

    ГАПОУ «МЦК-Казанский техникум информационных технологий и связи» г. Казань

    Индивидуальный исследовательский проект по информатике «Технология OLE» направлен на изучение возможности использования программных средств технологии OLE и способов применения данной технологии в ОС Windows. Для испытания было рассмотрено применение OLE в программах MS Word и MS Excel.

    Подробнее о проекте:

    Творческая работа учащейся техникума о применении технологии MS Word и MS Excel направлена на получение автором общего представления о версиях и истории появления и развития технологии OLE. За основу учащаяся взяла такие версии технологии, как OLE 1.*, OLE 2.0 и ActiveX, и, изучив их, рассмотрела особенности их использования в программах текстовых документов.

    Готовая творческая работа по информатике на тему «Технология OLE» демонстрирует этапы работы автора над использованием технологий OLE в работе с MS Word, где рассматривается вставка рисунка, вставка картинки, вставка фигуры, вставка снимка, вставка формулы, внедрение таблицы и внедрение объекта с помощью данной технологии. В рамках работы в MS Excel 2010 исследуется применение OLE в виде вставки надписи и внедрения объекта в файл.

    Оглавление

    Введение
    1. Технология OLE.
    2. Версии и история технологии.
    2.1 OLE 1.*
    2.2 OLE 2.0
    2.3 ActiveX.
    2.4. Применение OLEв MSWord 2010.
    2.4.1 Вставка рисунка.
    2.4.2 Вставка картинки.
    2.4.3 Вставка фигуры.
    2.4.4 Вставка диаграммы.
    2.4.5 Вставка снимка.
    2.4.6 Вставка формулы.
    2.4.7 Внедрение таблицы.
    2.4.8 Внедрение объекта.
    2.5. Применение OLE в MSExcel 2010.
    2.5.1 Вставка надписи.
    2.5.2 Внедрение объекта (значок).
    2.5.3 Внедрение объекта
    Заключение
    Литература

    Введение

    Все мы знаем о том, что при использовании современных редакторов можно воспользоваться сразу несколькими функциями, которые для данного редактора не являются основными. Так, например, установленная на персональном компьютере издательская система может послать некий текст на обработку в текстовый редактор, либо некоторое изображение в редактор изображений с помощью OLE-технологии.

    Но не каждый пользователь задумывается, как на самом деле это работает. Здесь задействована особенная технологияOLE, позволяющая работать с данными, не предназначенными для данной программы, а также для работы и связи одной программы-процессора с другой программой-процессором.

    Целью работы является: изучение возможности использования программных средств технологии OLE и способы применения данной технологии в ОС Windows.

    Для достижения поставленной цели были сформулированы следующие задачи:

    • изучить литературу по данной теме;
    • изучить различные электронные источники по данной теме;
    • изучить теоретические и практические сведениятехнологииOLE;
    • определить среды применения данной технологии;
    • научиться распознавать и отличать данную технологию;
    • подвести итоги работы и сделать выводы.

    Предметом исследования является: программная технология OLE.

    Методы исследования: теоретический анализ источников, формализация, обобщение, описание.

    Технология OLE

    Технология OLE (ObjectLinkingandEmbedding) — этотехнология связывания и внедрения объектов в другие документы и объекты. Изначально, технология была разработана корпорацией Microsoft для своего продукта ОС Windows, а также для внедрения в отдельные дополнительные программы для ОС Windows, например, офисный пакет приложений MicrosoftOffice, где данная технология нашла более широкое свое применение.

    OLE позволяет передавать часть работы от одной программы редактирования к другой и возвращать результаты этой работы.Например, несмотря на главную цель текстового процессора MicrosoftWord, — работа с текстовыми документами,при использовании данного текстового процессорав документе можно не только вводить данные, но и создавать таблицы, вставлять картинки, фотографии, часть элемента из другой программы MicrosoftOffice (например, таблицу из MicrosoftExcel) и т. д.

    Основное преимущество использования OLE (кроме уменьшения размера файла) — в том, что она позволяет создать главный файл, картотеку функций, к которой обращается программа. Этот файл может оперировать данными из исходной программы, которые после обработки возвращаются в исходный документ.

    Технология OLE включает в себя следующие возможности:

    1. Возможность совмещать в одном документе объекты с различными форматами данных (текст, рисунки, таблицы, базы данных и т.д.).
    2. Приложение, содержащее встроенный или связанный объект, хранит сведения о формате данных этого объекта и приложениях работающих с ним.
    3. Приложение, содержащее объект, осуществляет функции по отображению, перемещению и копированию объекта внутри документа и между приложениями. При этом поддерживается целостность объекта.
    4. Возможность автоматически вызывать приложения для редактирования объектов или импортировать функции редактирования из этого приложения.

    Технология OLE< может быть использована в двух вариантах:

    • Установление связи с объектом (например, Word – Excel)
    • Внедрение самого объекта (например, вставка рисунков

    )

    Установление связи позволяет связывать данные из различных приложений таким образом, что данные одного приложения отображаются в другом, и при изменении данных в одном приложении они автоматически изменяются в другом.

    Если данные, связанные с приложением невозможно представить в виде текста или рисунка, например, звук или видеофильм, то они отображаются в документе в виде пиктограммы (значка). Активизация данной связи (двойной щелчок на пиктограмме) приведет к проигрыванию звукового сигнала или видеоролика.

    Для данных представимых в наглядном виде (текст, рисунок и пр.) активизация связи приведет к запуску приложения, в котором можно будет произвести редактирование объекта.

    Связывание осуществляется следующим образом:первоначально создается исходный документ. Затем с помощью некоторой программы создается объект, который должен быть помещен в исходный документ. Этот объект сохраняется в файле. Эта процедура обязательная, без нее невозможно установление связи. После этого в программе с исходным документом выполняется команда по связыванию объекта с документом.

    Преимущества связывания:

    • происходит автоматическое изменение объекта в документе, при изменении оригинала объекта;
    • исходный документ имеет небольшой размер.

    При внедрении объект существует только в единственном экземпляре и только там, где он внедрен, т.е. в самом документе (а не в отдельном файле, как при связывании). Для внедрения объекта можно использовать те же команды, что и при обмене данными, или использовать специальную команду для внедрения объекта.

    Преимущества внедрения:

    • легкая переносимость документа на другой компьютер;
    • возможность редактирования объекта непосредственно в документе.

    Версии и история технологии

    OLE 1.*

    OLE 1.0 является самой первой общедоступной версией технологии OLE. Был выпущен в 1990 году на основе технологии DDE (DynamicDataExchange) – предшественнике OLE, который использовался в более ранних версиях ОС Windows. Несмотря на то, что технология OLEбазируется на технологии DDE, это является не просто улучшенной версией данной технологии, но и расширенной по функционалу: технология DDE быласильно ограничена в количестве и методах передачи данных между двумя связанными программами.

    С появлением технологии OLEстало возможным создать взаимосвязь между двумя документами и даже внедрение документа одного типа в документ другого типа, что значительно упростило и изменило представление о работе с документами.

    Когда объект OLE помещен в буфер обмена информацией, он сохраняется в оригинальных форматах Windows (таких, как bitmap или metafile), а также сохраняется в своём собственном формате. Собственный формат позволяет поддерживающей OLE-программе внедрить порцию другого документа, скопированного в буфер, и сохранить её в документе пользователя.

    OLE-серверы и клиенты взаимодействуют с системными библиотеками при помощи таблиц виртуальных функций (англ. virtualfunctiontables, VTBL). Эти таблицы содержат указатели на функции, которые системная библиотека может использовать для взаимодействия с сервером или клиентом. Библиотеки OLESRV.DLL (на сервере) и OLECLI.DLL (на клиенте) первоначально были разработаны для взаимодействия между собой с помощью сообщения WM_DDE_EXECUTE, предоставляемого операционной системой.

    С появлением OLE 1.1, технология развилась в архитектуру COM (ComponentObjectModel) для работы с компонентами программного обеспечения. Позднее архитектура COM была преобразована и стала называться DCOM.

    OLE 2.0

    OLE 2.0 не имела особых технических инноваций: те же цели, те же задачи. Но была одна важная особенность: вместо того, чтобы использовать VTBL, OLE 2.0 стал надстройкой над архитектурой COM.

    Также в этой версии OLEпоявилась автоматизации технологий draganddrop, inplaceactivationи structuredstorage.

    ActiveX

    В 1996 году Microsoft переименовала технологию OLE 2.0 в ActiveX. Были представлены элементы управления ActiveX, ActiveX документы и технология ActiveScripting. Эта версия OLE в основном используется веб-дизайнерами для вставки в страницы мультимедийных данных.

    Применение OLE в MSWord 2013

    Из теоретической части можно сделать вывод, что в текстовом процессоре MicrosoftWordможно не только работать с текстом, но и создавать рисунки, вставлять картинки, встроенные фигуры, фотографии, таблицы, списки, формулы, диаграммы,снимки экрана, использовать программыпакета MicrosoftOffice и даже встраивать целые программы.

    Возможность выполнения всех этих функций возможна благодаря технологии OLE.

    оле 1

    Цель пункта практической части: Изучение применения технологии OLE в MicrosoftWord 2010.

    Перед началом работы необходимо установить и запустить текстовый процессор MicrosoftWord 2010.

    Вставка рисунка

    Для вставки пользовательского изображения в MicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Рисунок»

    оле 2

    2. Выбрать необходимое изображение из тех, что имеются на Вашем устройстве.

    Применение: рисунки используются для разнообразия, а также для визуального оформления текста.

    Вставка картинки

    Для вставки картинки из предустановленной коллекции изображений в MicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Картинка».

    оле 3

    2. Выбрать изображение из предоставленной коллекции

    Применение: картинки предусмотрены для декоративного оформления документа.

    Вставка фигуры

    Для создания фигуры в MicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Фигуры».

    оле 4

    2. Выбрать подходящую фигуру.

    3. С помощью левой клавиши мыши создать фигуру.

    Применение: Фигуры можно применять для создания простейших блок-схем, визуального разделения предоставленных понятий на группы, обозначения геометрических фигур, создания открыток и т. д. Областей применения данной функции безграничное множество.

    оле 5

    Вставка диаграммы

    Для создания фигуры в MicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Диаграммы».

    оле 6

    2. Выбрать подходящую диаграмму Примечание: В этой части задания начинается второго варианта использования технологии OLE – связывание программ. При точном следовании инструкции, начиная с этого шага будет автоматически открыта электронная книга MicrosoftExcel (если таковая установлена) под названием «Диаграмма в MicrosoftWord». Отличие этой книги от пользовательской в том, что она связана с документом, в котором создана диаграмма.

    оле 7

    3. Замените данные в таблице на те, которые подходят для решения Вашей задачи.

    Применение: Диаграммы применяются для визуализации графиков, математических, аналитических и экономических задач.

    оле 8

    Вставка снимка

    Для вставки снимки экрана активного элемента в MicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Снимок».

    оле 9

    2. Выбрать нужное окно из доступных для создания и вставки снимка этого окна.

    Применение: Снимки экрана применяются при составлении отчетов/практических работ.

    Вставка символа Юникод

    Для вставки символа Юникод в MicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Символ».

    оле 10

    2. Выбрать подходящий символ или перейти во вкладку «Другие символы» и вставить символ из открывшегося окна.

    Применение: Символы применяются как единичные способы вставки уникального символа из формул, или вставки символов, поиск которых затруднителен в других средах работы

    оле 11

    Вставка формулы

    Для вставки внешнего объекта в MicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Формула». Сразу же вставится «Место для формулы», а активная вкладка изменится на работу с формулами — «Конструктор». На более новых версиях MicrosoftWordоткроется дополнительное окно с редактированием формулы. Также можно воспользоваться встроенными формулами при раскрытии контекстного меню вставки формулы.

    оле 12

    2. Ввести/вставить подходящую формулу для решения подходящей задачи.

    Применение: Формулы применяются для создания математических, физических и информационных задач. Могут быть использованы с фигурами, т. к. в стандартный набор фигур входят и объемные фигуры, для создания более продвинутых формул.

    оле 13

    Внедрение таблицы

    Здесь возможны два варианта выполнения работы:

    I. Использование встроенной таблицы.

    Для вставки встроенной таблицы вMicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Таблица».

    оле 14

    2. Задать необходимый размер таблицы.

    3. Отредактировать полученную таблицу.

    Использование встроенной таблицы

    Для вставки встроенной таблицы вMicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Таблица».

    2. Выбрать «Таблица Excel». Сразу после выбора этого пункта запустится табличный процессор MicrosoftExcel, внутри текстового процессора MicrosoftWord.

    оле 15

    3. Отредактировать полученную таблицу.

    Применение: Таблицы применяются для экономических и бухгалтерских расчетов, подсчетов и отчетов. Примечательно, что, работая с таблицами MicrosoftExcel, данные можно занести сначала в отдельную книгу, и лишь затем интегрировать эту книгу в документ MicrosoftWord, при этом сохранится связь между книгой и документом: все изменения затронут и обновятся как в книге, так и в документе.

    Внедрение объекта

    Для вставки внешнего объекта (программы) вMicrosoftWord 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Объект».

    2. Выбрать подходящее для решения поставленной задачи меню «Создание» или «Создание из файла».

    3. Выполнить настройку/указания файла для создания объекта.

    Применение: Объекты могут применяться для наглядной демонстрации, а также запуска среды исполнения программ для практического применения заданной темы.

    Применение OLE в MSExcel 2010

    Возможность использования технологии OLE реализована не только в текстовом процессоре MicrosoftWord 2010, но и в табличном процессоре MicrosoftExcel 2010. Однако в MicrosoftExcel 2010 эта технология раскрыта в наиболее специализированном направлении, но это не мешает дать оценку данной технологии в данной среде.

    оле 16

    оле 17

    оле 18

    Цель пункта практической части: Изучение применения технологии OLE в MicrosoftExcel2010.

    Перед началом работы необходимо установить и запустить табличный процессор MicrosoftExcel 2010.

    Вставка надписи

    Длявставки надписи в MicrosoftExcel 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Надпись».Курсор изменится на стрелку.

    оле 19

    2. Задать место создания надписи.

    3. Ввести соответствующие данные

    Применение: Надписи, созданные данным методом, можно переместить не затрагивая ячейки самой таблицы, как отдельный объект.

    оле 20

    Внедрение объекта (значок)

    Для внедрения внешнего объекта в MicrosoftExcel 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Объект».

    2. Отметить флажок«В виде значка».

    оле 21

    3. Указать путь к файлу, установить параметры вставки.

    Применение: Миниатюра-ярлык. Объект открывается в новом окне Windows, как отдельное приложение.

    оле 22

    Внедрение объекта

    Для внедрения внешнего объекта в MicrosoftExcel 2010 необходимо:

    1. Перейти во вкладку «Вставка» — «Объект».

    2. Снять выделение с флажка «В виде значка».

    оле 23

    3. Указать путь к файлу, установить параметры вставки.

    Применение: Вставка внешних связанных или независимых объектов из линейки Microsoft Office в таблицу MicrosoftExcel 2010.

    оле 24

    Заключение

    В процессе выполнения данного исследования:

    1. Изучили основные свойства технологии OLE и её практическое применение в ОС MicrosoftWindows;
    2. Использовали текстовый процессор MicrosoftWord 2010 для наглядного применениятехнологии OLE;
    3. Создали несколько связанных файлов, используя технологию OLE.

    Помимо этого мы сделали следующие выводы:

    1. Использование технологии OLEсущественно разнообразило функционал текстового процессора MicrosoftWord;
    2. С помощью технологии OLEможно запускать, вставлять и связать внешние файлы с текстовым процессором MicrosoftWord.

    В конце своей работы, хочется сказать, что данная тема мне очень интересна, и я собираюсь работать над ней дальше.

    Для написания данной работы были использованы ресурсы Сети Интернет.

    Если страница Вам понравилась, поделитесь в социальных сетях:

    Я работаю на компьютерах последние 10 лет и впервые столкнулся с этой ошибкой — Microsoft Word ожидает завершения действия OLE. Попробовав несколько вариантов, я, наконец, смог избавиться от этой ошибки и поэтому решил написать этот пост и рассказать вам, что сработало для меня.

    Microsoft Word ожидает завершения действия OLE

    Прежде чем мы приступим к исправлению этой ошибки, давайте узнаем, что означает действие OLE и почему возникает эта ошибка.

    Что такое действие OLE?

    OLE — это сокращение от Object Linking & Embedding. Действие OLE — это механизм, специально разработанный Microsoft, чтобы помочь приложениям MS Office, таким как MS Word, Excel и Powerpoint, обмениваться данными и связываться с другими приложениями.

    Почему вы получаете ошибку OLE в Word?

    Ошибка OLE возникает в MS Word, когда приложение пытается получить данные из другого приложения. Я получил эту ошибку, когда пытался вставить объект — мою электронную таблицу Excel в MS Word. Я не смог этого сделать, потому что Word показывал ошибку: Microsoft Word ожидает завершения действия OLE. Я нажимал «Повторить» несколько раз, но это не сработало. Так что технически MS Word не смог получить данные из моего листа Excel, поэтому я получил эту ошибку.

    Эти предложения обязательно помогут вам исправить ошибку Microsoft Word ожидает завершения действия OLE на вашем компьютере с Windows:

    1. Переключиться и повторить попытку
    2. Закройте другие приложения
    3. Отключить надстройки Word
    4. Переключиться на математический тип
    5. Перезагрузите компьютер

    1]Кнопка «Переключиться и повторить попытку»

    Я работал над документом Word и хотел вставить файл excel. Я использовал «Вставить объект» на ленте главного меню и, подождав почти минуту, получил эту ошибку.

    Я попытался нажать кнопку «Переключиться на», но это ничего не дало, как и кнопка «Повторить». Я нажал кнопку «Отмена», и окно с ошибкой исчезло. Попробовал снова вставить объект, но снова получил ту же ошибку.

    Я также принудительно закрывал MS Word 2-3 раза через диспетчер задач и пытался снова, но ничего не работало.

    2]Закройте другие приложения

    Я получил эту ошибку OLE при попытке вставить файл Excel, но вы получаете ее и с другими приложениями. Когда вы получаете эту ошибку, нажмите клавиши Alt + Tab на клавиатуре и проверьте, какие другие приложения Office открыты. Закройте их. Если вы не можете закрыть их вручную или ваш курсор застрял, нажмите Ctrl+Alt+Delete, чтобы открыть диспетчер задач и закрыть другие приложения Office. В моем случае файл excel, который я пытался вставить, был открыт. Я закрыл файл excel, и ошибка исчезла.

    3]Отключить надстройки Word

    Ну, не в моем случае, но слишком много надстроек, установленных в Word, также могут привести к этой ошибке, о чем сообщают многие пользователи в Интернете. Если вышеупомянутые исправления не работают для вас, попробуйте отключить нежелательные надстройки из вашего MS Word. Чтобы отключить надстройки Word–

    • Откройте MS Word, перейдите на вкладку «Файл» и выберите «Параметры».
    • Перейти к надстройкам.
    • Перейдите на вкладку «Управление» в нижней части окна и нажмите кнопку «Перейти».
    • Откроется диалоговое окно, в котором вы можете выбрать надстройки, которые хотите отключить.
    • Просто снимите флажок напротив надстройки, которую вы хотите отключить.
    • Нажмите OK, и все готово.

    4]Переключиться на математический тип

    Если вы получаете сообщение об ошибке, Microsoft Word ожидает завершения действия OLE при работе с Mathtype. Переключитесь на Mathtype и закройте диалоговое окно. Опять же, если Переключить на кнопка не работает для вас, вы можете использовать сочетание клавиш Alt + Tab, чтобы закрыть ее.

    5]Перезагрузите компьютер

    Это то, что может исправить практически любую временную ошибку. Если вы по-прежнему получаете сообщение об ошибке действия OLE в MS Word и больше ничего не работает, перезагрузите компьютер и повторите попытку. Это, скорее всего, должно исправить эту ошибку.

    Чтение: Microsoft Excel ожидает, пока другое приложение выполнит действие OLE

    Что такое действие OLE в MS Word?

    Связывание и внедрение объектов, сокращенно OLE, — это метод, специально разработанный Microsoft, чтобы помочь приложениям Office успешно взаимодействовать с другими приложениями.

    Как исправить ошибку действия OLE в Excel?

    Откройте лист Excel > Файл > Опция > вкладка Дополнительно. Прокрутите вниз до области «Общие» и установите флажок «Игнорировать другие приложения, использующие динамический обмен данными (DDE)». Перезапустите Эксель.

    Microsoft Word ожидает завершения действия OLE

    Понравилась статья? Поделить с друзьями:
  1. Ole открыть файл excel
  2. Ole операция excel что это
  3. Ole объекты что это word
  4. Ole объекты excel word
  5. Ole объект excel в автокаде