
- •Часть 2. Работа с ole-сервером Word.
- •2.1 Получение доступа к интерфейсу Application для Word.
- •2.2 Интерфейсы и константы
- •2.3 Создание рабочего документа
- •2.3.1 Вывод текстовой информации.
- •2.3.2 Изменение параметров документа.
- •2.4 Работа с таблицами.
- •2.5 Текст кода программы.
- •2.6 Работа с диаграммами.
- •2.6.1 Копирование диаграммы из рабочей книги Excel.
- •2.7 Некоторые другие возможности.
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/*Заменить все*/);