Таблицы в word на borland



Работа с 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



wolitar

0 / 0 / 0

Регистрация: 09.12.2011

Сообщений: 30

1

09.03.2012, 08:37. Показов 7819. Ответов 1

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем привет! У меня два вопроса
1) написал код:

Delphi
1
2
3
4
App := CreateOleObject('Word.Application');
  App.Documents.open('C:111.doc');
  App.ActiveDocument.Tables.Add(App.ActiveDocument.Range(0, 0), 5, 2);
  App.Visible := True;

почему-то таблица получилась бесцветная. как сделать так, чтобы были видны ячейки?
2) когда пишу код:

Delphi
1
app.Tables.Item(1).Cell(1,1).Range.Text := 'текст';

то выдаёт ошибку как по другому можно заполнить ячейку таблицы?



0



Mawrat

13094 / 5875 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

09.03.2012, 17:17

2

Пример, как открыть документ MS Word, добавить в его конце новую таблицу, разлиновать её и перенести в неё данные из таблицы типа TStringGrid на форме.

Delphi
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  wdLineStyleSingle = 1;
var
  wdApp, wdDoc, wdTable : Variant;
  Row, Col : Integer;
  Od : TOpenDialog;
  Sg : TStringGrid;
begin
  Od := OpenDialog1;
  Sg := StringGrid1;
 
  if Od.InitialDir = '' then
    Od.InitialDir := ExtractFilePath( Application.ExeName )
  ;
  if not Od.Execute then Exit;
  if not FileExists(Od.FileName) then begin
    ShowMessage(
      'Файл с именем:'#10
      + Od.FileName + #10
      + 'Не найден. Действие отменено.'
    );
    Exit;
  end;
  try
    wdApp := CreateOleObject('Word.Application');
  except
    ShowMessage('Не удалось запустить MS Word. Действие отменено.');
    Exit;
  end;
 
  //Делаем видимым окно MS Word.
  wdApp.Visible := True;
  //Попытка открыть выбранный файл.
  wdDoc := wdApp.Documents.Open(FileName:=Od.FileName);
  //Добавляем отступ в конце документа.
  wdDoc.Range.InsertAfter(#13#10);
  //Добавляем таблицу внизу документа.
  wdTable := wdDoc.Tables.Add(
    Range:=wdDoc.Range.Characters.Last
    ,NumRows:=Sg.RowCount
    ,NumColumns:=Sg.ColCount
  );
  //Параметры линий таблицы.
  wdTable.Borders.InsideLineStyle := wdLineStyleSingle;
  wdTable.Borders.OutsideLineStyle := wdLineStyleSingle;
  //Копируем данные из таблицы на форме в таблицу в документе Word.
  for Row := 0 to Sg.RowCount - 1 do
  for Col := 0 to Sg.ColCount - 1 do
    wdTable.Cell(Row + 1, Col + 1).Range.Text := Sg.Cells[Col, Row]
  ;
  //Отключение режима показа предупреждений.
  //wdApp.DisplayAlerts := False;
  //Сохрание документа.
  //wdDoc.Save;
  //Закрываем документ.
  //wdDoc.Close;
  //Включение режима показа предупреждений.
  //wdApp.DisplayAlerts := True;
  //Закрываем MS Word.
  //wdApp.Quit;
end;

Что касается чтения данных из таблицы MS Word. Надо иметь в виду, что текст, прочитанный из ячейки таблицы MS Word, в конце содержит пару управляющих символов: #13#7. Эти символы следует удалить.



3



01.01.2007

Темой этой части статьи будет создание таблиц в редакторе Word из приложений, написанных на Delphi. В прошлый раз мы рассмотрели создание простых документов, которые не содержат таблиц переменной длины, но большинство отчетов так или иначе содержит табличное представление информации. Уверен, что хоть один отчет в вашей программе содержит хоть одну таблицу. Поэтому информации двух предыдущих частей статьи было бы недостаточно для создания отчета, содержащего табличное представление информации.

Как создать таблицу в Word’е? Так же просто, как это делается в обычном объектно-ориентированном языке. В объекте Document мы имеем коллекцию Tables, с помощью методов и объектов которой можем создать таблицу и получить доступ к ее свойствам, ячейкам и тексту в ячейках. Если в нашем отчете несколько таблиц, то к любой из них мы имеем доступ с помощью коллекции Tables и индекса таблицы.

Чтобы более ясно представить процесс создания таблицы, используя объектные модели MS Office, создадим документ, аналог которого после простой доработки можно будет использовать в своих программах для вывода информации. Одним из самых распространенных отчетов, содержащих таблицу, является документ типа «Прайс-лист». Его мы и будем создавать. Попробуем создать его без шаблона, т.е. с чистого листа. Определимся, каким набором функций нужно владеть для создания этого документа. Во-первых, нам нужна будет функция создания таблицы, затем потребуется задать(изменить) размеры этой таблицы, вписать данные в ячейки, объединить ячейки. Возможно, потребуется еще несколько вспомогательных функций. Творчески используя материал статьи, вы сможете сами определить и создать для себя еще несколько функций для работы с таблицами.

Определим функцию создания таблицы CreateTable. Так как количество таблиц в документе может быть больше одной, то для идентификации каждой таблицы используем ее номер. Для создания применим метод ADD коллекции Tables. Метод ADD имеет аргументы: область, где создается таблица, количество строк и количество столбцов. Наша функция будет создавать таблицу там, где расположен курсор, и иметь еще один аргумент: числовую переменную, через которую будет возвращаться порядковое значение(индекс) таблицы в документе. Функция выглядит следующим образом:

Function CreateTable(NumRows, NumColumns:integer;
  var index:integer):boolean;
 var sel_:variant;
begin
 CreateTable:=true;
 try
  sel_:=W.selection;
  W.ActiveDocument.Tables.Add (Range:=sel_.Range,NumRows: =NumRows,
   NumColumns:=NumColumns);
  index:=W.ActiveDocument. Tables.Count;
 except
  CreateTable:=false;
 end;
End;

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

Наша функция создаст таблицу произвольного размера, но для корректного представления данных необходимо задать определенные размеры строк и столбцов. Чтобы задать размер таблицы или строки(столбца), нужно получить доступ к таким свойствам таблицы, как коллекции Columns и Rows (список столбцов и строк), через которые сможем получить доступ к конкретной строке или(и) столбцу, к ячейкам и к параметрам ячейки(строки, столбца). Для этого используем объект ActiveDocument.Tables.Item(table), где table — номер таблицы в документе. Создадим функцию, которая будет задавать ширину и высоту всех ячеек таблицы.

Function SetSizeTable(Table:integer; RowsHeight,
  ColumnsWidth:real):boolean;
begin
 SetSizeTable:=true;
 try
  W.ActiveDocument.Tables.Item (Table).Columns.Width:=ColumnsWidth;
  W.ActiveDocument.Tables.Item(Table). Rows.Height:=RowsHeight;
 except
  SetSizeTable:=false;
 end;
End;

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

Function SetHeightRowTable(Table,Row:integer;
  RowHeight:real):boolean;
begin
 SetHeightRowTable:=true;
 try
  W.ActiveDocument.Tables.Item(Table).Rows.item(Row).Height:=RowHeight;
 except
  SetHeightRowTable:=false;
 end;
End;
Function SetWidthColumnTable(Table,Column: integer;
  ColumnWidth:real):boolean;
begin
 SetWidthColumnTable:=true;
 try
  W.ActiveDocument.Tables.Item(Table).Columns.
   Item(Column).Width:=ColumnWidth;
 except
  SetWidthColumnTable:=false;
 end;
End;

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

Function GetSizeTable(Table:integer;var RowsHeight,
  ColumnsWidth: real):boolean;
begin
 GetSizeTable:=true;
 try
  ColumnsWidth:=W.ActiveDocument. Tables.Item(Table).Columns.Width;
  RowsHeight:=W.ActiveDocument. Tables.Item(Table).Rows.Height;
 except
  GetSizeTable:=false;
 end;
End;

Также можно считать и размеры строки или столбца на выбор, для этого достаточно использовать коллекции Rows, Columns объекта Table (Tables.Item(Table)).

Следующим этапом формирования табличного документа определим запись текстовой информации в выбранную ячейку таблицы. Одним из способов такой записи является доступ к полю Text ячейки, но и в этом случае текст записывается не напрямую, а в объект Range ячейки таблицы. Функция SetTextToTable выполняет такую запись.

Function SetTextToTable(Table:integer;Row, Column:integer;
  text:string):boolean;
begin
 SetTextToTable:=true;
 try
  W.ActiveDocument.Tables.Item(Table).Columns.Item(Column).
   Cells.Item(Row).Range.Text:=text;
 except
  SetTextToTable:=false;
 end;
End;

И последнее действие, которое необходимо произвести над таблицей для создания простого табличного документа, это объединение ячеек. Для этого воспользуемся методом Merge объекта Cell (ячейка). Первый оператор функции объединения ячеек возвращает указатель на объект — конечную ячейку (Cel). Второй оператор объединяет начальную ячейку Row1,Column1 с конечной ячейкой, табличные координаты которой уже заданы и равны Row2,Column2.

Function SetMergeCellsTable(Table:integer;Row1,
  Column1,Row2,Column2:integer):boolean;
 var Cel:variant;
begin
 SetMergeCellsTable:=true;
 try
  Cel:=W.ActiveDocument.Tables.I tem(Table).Cell(Row2,Column2);
  W.ActiveDocument.Tables.Item(Table). Cell(Row1,Column1).Merge(Cel);
 except
  SetMergeCellsTable:=false;
 end;
End;

Переходим к заключительной стадии — созданию документа.

Для этого все определенные в этой части статьи функции объединим с ранее созданными и перенесем во вновь созданную библиотеку процедур и функций. Например, это будет файл MyWord.pas, в разделе interface которого будут описаны заголовки всех наших функций, а в разделе implementation — сами функции (в дальнейшем будем пользоваться этой библиотекой). Не забудьте после implementation вставить строки uses ComObj; var W:variant;.

Создадим новый проект, в программном модуле которого сделаем ссылку на нашу библиотеку uses MyWord;. На форме разместим кнопку и в процедуру обработки нажатия ее впишем следующий программный код.

procedure TForm1.Button1Click(Sender: TObject);
 var tablica_:integer;
begin
 if CreateWord then begin
  VisibleWord(true);
  If AddDoc then begin
// cсоздаем таблицу
   If CreateTable(5,3,tablica_) then begin
    Messagebox(0,pchar('Таблица создана='+inttostr(tablica_)),'',0);
// изменяем размеры таблицы
    SetSizeTable(tablica_,25,37);
    SetWidthColumnTable(tablica_,1,300);
    SetWidthColumnTable(tablica_,2,80);
    SetWidthColumnTable(tablica_,3,80);
    Messagebox(0,'Размер таблицы изменен','',0);
// записывает информацию в ячейки таблицы
    SetTextToTable(tablica_,1,1,
     'ПРОЦЕССОРЫ (данные от 27.05.2003) ');
    SetTextToTable(tablica_,2,1,'Наименование');
    SetTextToTable(tablica_,2,2,'Стоимость');
    SetTextToTable(tablica_,2,3,'Гарантия');
    SetTextToTable(tablica_,3,1,
     'ПРОЦЕССОР AMD K7- 1333 ATHLON 266MHz (Socket-A)');
    SetTextToTable(tablica_,3,2,'47.52 $');
    SetTextToTable(tablica_,3,3,'12 мес.');
    SetTextToTable(tablica_,4,1,
     'ПРОЦЕССОР AMD K7- 800 DURON (Socket-A)');
    SetTextToTable(tablica_,4,2,'23.54 $');
    SetTextToTable(tablica_,4,3,'12 мес.');
// объединяем необходимые ячейки таблицы
    SetMergeCellsTable(tablica_,1,1,1,3);
   end;
   SaveDocAs('c:Прайс лист');
   Messagebox(0,'Текст сохранен','',0);
   CloseDoc;
  end;
  Messagebox(0,' Текст закрыт','',0);
  CloseWord;
 end;
end;

 

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

clip0069

Полный исходный текст смотрите по адресу www.kornjakov.ru/st1_3.zip.

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

По всем вопросам, касающимся материала этой статьи, вы можете обратиться к автору по адресу www.kornjakov.ru или _kvn@mail.ru.

Василий КОРНЯКОВ

Литература: Н. Елманова, С. Трепалин, А.Тенцер «Delphi 6 и технология COM» «Питер» 2002.

Время теряется на переключение проццесов. Чем больше таблица тем хуже.
Каждая клетка таблицы это переключение.
Сформируйте стороку данных передайте Word (один процесс) затем конвертируйте
текст в таблицу (второй процесс)
Ниже приведе текст рабочей процедуры, написанны на Delphi 6.0 для
компонентов Офиса 97. Успешно работает и с 2000

procedure Spisok_Sotrudnikov2(Name: String); 
var 
{Объявление переменных, для передачи их в качестве формальных параметров в} 
{ сервер автоматизации} 
  Shablon,FileName,Tempo,Separator,NumColumns:OleVariant; 
  i,k : Integer; 
  MyRange : Range;   {Область документа} 
  Tabl : Table;      {Одна таблица} 
  Pars : Paragraphs; {Массив параграфов} 
  Par  : Paragraph;  {Один параграф} 
  S : Array[1..9] of String; 
  Text : WideString; 
  Text1: String; 
begin 
  Screen.Cursor:=crHourGlass; 
{Оформление бегущей линейки} 
  Otchet_Spisok_Sotrudnikov.BitBtn1.Visible:=False; 
  Otchet_Spisok_Sotrudnikov.Gauge1.Visible:=True; 
{Определяем файл шаблона документа и файл для сохранения результата} 
  Shablon:=ExtractFilePath(Application.EXEName)+'Spisok.Doc'; 
  FileName:=ExtractFilePath(Application.EXEName)+'Spisok_Sotrudnikov1.DOC'; 
{Открываем шаблон документа} 
Otchet_Spisok_Sotrudnikov.WordApplication1.Documents.Open(Shablon,EmptyParam 
,EmptyParam,EmptyParam, 
EmptyParam,EmptyParam,EmptyParam,EmptyParam, 
                                  EmptyParam,EmptyParam); 
{Связываем компоненту с существующим интерфейсом} 
Otchet_Spisok_Sotrudnikov.WordDocument1.ConnectKind:=ckAttachToInterface; 
Otchet_Spisok_Sotrudnikov.WordDocument1.ConnectTo(Otchet_Spisok_Sotrudnikov. 
WordApplication1.ActiveDocument); 
{Обязательно отключить проверки орфографии и граматики в Word} 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckSpellingAsYouType:=f
alse; 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckGrammarAsYouType:=fa 
lse; 
{Опредеоляем область документа} 
MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(EmptyParam,EmptyParam 
); 
    Tempo:=MyRange; 
{Оформляем заголовок} 
    Pars:=Otchet_Spisok_Sotrudnikov.WordDocument1.Paragraphs; 
    Par:=Pars.Add(Tempo); 
    Par.Alignment:=wdAlignParagraphCenter;  {Выравнивание параграфа} 
    Par.Range.Font.Bold:=1;          {Шрифт жирный} 
    Par.Range.Font.Size:=14;         {Размер шрифта} 
    Par.Range.Font.ColorIndex:=1;    {Цвет шрифта зеленый} 
    Par.Range.InsertBefore(Name); 
    Tempo:=Par.Range.Get_End_; {Определяем конец области} 
    MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(Tempo); 
{Формирование данных} 
       DataModule1.IBQuery2.Open; 
       DataModule1.IBQuery2.FetchAll; 
       i:=DataModule1.IBQuery2.RecordCount; 
       Otchet_Spisok_Sotrudnikov.Gauge1.MaxValue:=i; 
       Text:='? п/п@Фамилия, Имя, Отчество@Должность@Табельный номер@'; 
       for k:=1 to i do begin 
         Text1:=''; 
         Text1:=Text1+IntToStr(k)+'@'; 
         Text:=Text+Text1; 
            if not DataModule1.IBQuery2.FieldByName('FML').IsNull then 
               S[1]:=DataModule1.IBQuery2.FieldByName('FML').Value;
            if not DataModule1.IBQuery2.FieldByName('IME').IsNull then 
               S[2]:=DataModule1.IBQuery2.FieldByName('IME').Value; 
            if not DataModule1.IBQuery2.FieldByName('OTC').IsNull then 
               S[3]:=DataModule1.IBQuery2.FieldByName('OTC').Value; 
            Text1:=S[1]+' '+S[2]+' '+S[3]+'@'; 
         Text:=Text+Text1; 
            S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' '; 
            S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' '; 
            if not DataModule1.IBQuery2.FieldByName('NPZ').IsNull then 
               S[1]:=DataModule1.IBQuery2.FieldByName('NPZ').Value; 
            if not DataModule1.IBQuery2.FieldByName('NSP').IsNull then 
               S[2]:=DataModule1.IBQuery2.FieldByName('NSP').Value; 
            Text1:=S[1]+' '+S[2]+'@'; 
         Text:=Text+Text1; 
            S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' '; 
            S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' '; 
            if not DataModule1.IBQuery2.FieldByName('NNN').IsNull then 
               S[1]:=DataModule1.IBQuery2.FieldByName('NNN').Value; 
            Text1:=S[1]+'@'; 
         Text:=Text+Text1; 
            S[1]:=' ';S[2]:=' ';S[3]:=' ';S[4]:=' ';S[5]:=' '; 
            S[6]:=' ';S[7]:=' ';S[8]:=' ';S[9]:=' '; 
         Otchet_Spisok_Sotrudnikov.Gauge1.Progress:=k; 
         DataModule1.IBQuery2.Next; 
                        end; 
{Передаем строку текста в Word} 
    Tempo:=MyRange; 
    Par:=Pars.Add(Tempo); 
    Par.Range.InsertBefore(Text); 
{Конвертируем текст в таблицу} 
    Separator:='@';
    NumColumns:=4; 
    MyRange.ConvertToTable(Separator,EmptyParam,NumColumns,EmptyParam, 
                           EmptyParam,EmptyParam,EmptyParam,EmptyParam, 
                           EmptyParam,EmptyParam,EmptyParam,EmptyParam, 
                           EmptyParam,EmptyParam); 
{Связываем переменную и таблицу, а затем меняем размер столбцов и 
выравнивание} 
    Tabl:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range.Tables.Item(1); 
    Tabl.Columns.Item(1).SetWidth(30,wdAdjustNone); 
    Tabl.Columns.Item(2).SetWidth(250,wdAdjustNone); 
    Tabl.Columns.Item(3).SetWidth(250,wdAdjustNone); 
    Tabl.Columns.Item(4).SetWidth(200,wdAdjustNone); 
    Tabl.Range.Paragraphs.Format.Alignment:=wdAlignParagraphCenter; 
    Tabl.Range.Cells.VerticalAlignment:=wdAlignParagraphCenter; 
    Tempo:=Par.Range.Get_End_; {Определяем конец области} 
    MyRange:=Otchet_Spisok_Sotrudnikov.WordDocument1.Range(Tempo); 
{Сохранение документа и отображение его в OLE контейнере (предварительный 
просмотр)} 
  Otchet_Spisok_Sotrudnikov.WordDocument1.SaveAs(FileName); 
  Otchet_Spisok_Sotrudnikov.WordDocument1.Close; 
{Включить проверки в Word} 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckSpellingAsYouType:=T 
rue; 
Otchet_Spisok_Sotrudnikov.WordApplication1.Options.CheckGrammarAsYouType:=Tr 
ue; 
  Screen.Cursor:=crDefault; 
  Otchet_Spisok_Sotrudnikov.Gauge1.Visible:=False; 
  Otchet_Spisok_Sotrudnikov.BitBtn1.Visible:=True; 
  Otchet_Spisok_Sotrudnikov.OleContainer1.CreateLinkToFile(FileName,false); 
  Otchet_Spisok_Sotrudnikov.OleContainer1.Refresh; 
end;


void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Variant Word, Document, Table, Cell;
    int RowCount, ColCount;

    Word = CreateOleObject(«Word.Application.8»);
    Word.OlePropertySet(«Visible», true);
    Word.OlePropertyGet(«Documents»).OleProcedure(«Add»);
    Document = Word.OlePropertyGet(«Documents»).OleFunction(«Item», 1);
    Table = Document.OlePropertyGet(«Tables»).OleFunction(«Add», Document.OleFunction(«Range», 0, 0), 5, 5);
    RowCount = Table.OlePropertyGet(«Rows»).OlePropertyGet(«Count»);
    ColCount = Table.OlePropertyGet(«Columns»).OlePropertyGet(«Count»);
    for (int i=1; i <=RowCount; i++)
       for(int j=1; j <=ColCount; j++) {
        Cell = Table.OleFunction(«Cell», i, j);
        Cell.OlePropertyGet(«Range»).OleProcedure(«InsertAfter», WideString(IntToStr(i)) + WideString(«-«) + WideString(IntToStr(j)));
    }
    Document.OleProcedure(«SaveAs», ChangeFileExt(Application->ExeName, «.doc»));
    Word.OleProcedure(«Quit»);
}

Понравилась статья? Поделить с друзьями:
  • Таблицы для упражнений excel
  • Таблицы в word конспект урока
  • Таблицы для риэлторов в excel
  • Таблицы в word задания лабораторная работа
  • Таблицы для расчетов бизнес плана excel