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

Часть 1. Работа с OLE-сервером Excel.

1.1 Получение доступа к интерфейсу 1.2 Интерфейсы и константы 1.3 Создание рабочих книг
1.4 Вывод информации в ячейки 1.5 Рисуем рамки 1.6 Текст кода программы создания таблицы Excel
1.7 Создание диаграмм 1.8 Текст кода программы, реализующий вывод диаграмм 1.9 Режимы отображения приложения
1.10 Размеры приложения 1.11 Управление панелями инструментов 1.12 Масштаб документа
1.13 Спрятать шапки строк и столбцов 1.14 Расположение книг 1.15 Несколькр листов одной книги на одной странице
1.16 Поменять листы местами 1.17 Автозаполнение или работа с диапазонами 1.18 Вставка сторок в Excel
1.19 Грузим и двигаем рисунки по листу 1.20 Параметры страницы 1.21 Защита книги и страницы
1.22 Использование информационных рисунков в Excel 1.23 Работа с закладками 1.24 Запустить макрос
1.25 Вместо заключения

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

ole_1_1.jpg

Рис 1.1 Итоговый документ, сформированный контроллером.

Для того, чтобы запустить приложение Word или Excel из программы на "Borland C++ Builder" достаточно выполнить, например, следующий код:

char B[254];
FindExecutable("*.doc",NULL,B);
ShellExecute(Handle,"open",B,NULL,NULL,SW_RESTORE);
FindExecutable("*.xls",NULL,B);
ShellExecute(Handle,"open",B,NULL,NULL,SW_RESTORE);

В директории, откуда запущена программы или по указанному пути (например, вместо *.xls указан файл, а вместо параметра NULL путь C:\AB) должен находиться файл с расширением соответственно .doc или .xls, пусть даже пустой.

Приложения будут запущены (есть и другие способы запуска), но управлять ими нельзя - с момента запуска они автономны от запустивших их приложений.

Для запуска Word и Excel как серверов автоматизации необходимо выполнить примерно одни и теже действия. Word посвящен следующий раздел, а здесь далее речь пойдет исключительно о сервере Excel.


В начало

1.1 Получение доступа к интерфейсу Application для Excel.

С этого момента можно пользоваться свойствами и методами созданного ole сервера, а именно:


В начало

1.2 Интерфейсы и константы

Список интерфейсов и констант в Builder можно получить при просмотре библиотеки типов Microsoft Word/Exvel Object Library.

Создав пустое приложение (File/New/Application) и выбрав пункт меню в Buildere File/Open, указав в списке возможных файлов Type Library и выбрав соответствующую библиотеку типов и загрузить ее (для Excel в зависимости от версии это, например, Excel9.olb, для Word - MSWord9.olb). Библиотеки, как правило находится в директории

 
Programm files/Microsoft Offise/Offise

Загрузка идет несколько минут (библиотеки велики) и по окончании будет создана панель навигатор (Рис 1.2). с описанием всех использованных констант, а также свойств и методов содержащихся в сервере объектов.

ole_1_2.jpg

Рис 1.2 Библиотека Excel9.olb.

При создании этих файлов появятся сообщения об ошибках, связанные с тем, что в коде Excel и Word могут использоваться зарезервированные слова С++.

После этого возможен просмотр методов и доступ к свойствам и константам указанного интерфейса. Например, для свойства WorkBooks - Application, Creator, Parrent, Add, Close, Count, Item. Open .... - это методы, которые в свою очередь имеют свои свойства, которые можно посмотреть на закладке Parametrs.

При использовании констант будем использовать их числовые значения!! - иначе в файл .cpp придется включать модуль с указанием конкретной версии Offise - например:
#include <vcl\excel_97.h>

Как показано на рисунке, например константа xlBuiltIn имеет значение 21.

Поиск и просмотр возможных констант - наиболее частая потребность при написании программы, здесь довольно затруднителен - нет даже меню поиск, поэтому лучше преобразовать информацию из библиотеки в текстовый файл, нажав крайнюю правую кнопочку навигатора (Export to idl), и преобразованный файл появится как файл с расширением .idl в проекте рядом с файлом Unit1.cpp - теперь достаточно сохранить его в удобном месте и для поиска использовать любой текстовый редактор, к примеру встроенный в FAR.

Для продолжения работы после сохранения файла *.idl и закрытия *.olb необходимо вернуться в рабочую директорию проекта.

Свойств и методов для серверов Word и Excel в указанных библиотеках пожалуй не менее чем в компонентах Builder, поэтому для ориентации при написании программ в среде Borland C++ Builder лучше использовать так называемый "хитрый метод".

Суть его в переводе макроса из кода Visual Basic в С++ код. Этот способ также позволяет просмотреть имена констант линий, стилей, цветов ... Уже по именам легко найти их значения в библиотеках и в сохраненном файле .idl.

Для этого:


В начало

1.3 Создание рабочих книг

Рассмотрим создание двух рабочих книг из 3х и 5ти листов.

Создаем новое приложение (File/New/Application) и сохраним его файлы в директории по умолчанию (Projects) c именами по умолчанию Unit1.cpp, Unit1.h, Unit1.dfm, Project1.cpp, Project1.bpr. Имена на данном этапе не цель, хотя не возбраняется создать новую директорию и дать приложению и файлам подходящие имена.

Переменные соответствующие используемым в программе объектам, а именно:

Variant  vVarApp,vVarBooks,vVarBook,
                 vVarSheets,vVarSheet,vVarCell;
bool fStart;

определим сразу все и глобально - или в файле Unit1.h (в разделе private:), или перед функциями в Unit1.cpp, хотя для данного этапа требуются пока не все переменные и можно определить нужные и локально.

Переменная fStart служит индикатором того, что сервер запущен.

Разместим на форме три кнопки (из вкладки Standart компонент TButton). Подписывать кнопки также не будем (сейчас это тоже не цель), но запомним, что по первой кнопке будем работать с таблицей, по второй с диаграммой, а по третьей закрывать сервер и приложение. Выполним два левых клика по Button1 и Button3, создаем таким образом обработчики события нажатия кнопки.

void __fastcall 
TForm1::Button1Click(TObject *Sender)
{

}
void __fastcall 
TForm1::Button3Click(TObject *Sender)
{
 if(fStart) vVarApp.OleProcedure("Quit");
 Close();
}

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

В обработчике нажатия первой кнопки начнем формировать код программы.

Создаем Объект Excel.Application.

 Variant v;
 if(!fStart)
 {
  try
  {
   vVarApp=CreateOleObject("Excel.Application");
   fStart=true;
  }
  catch(...)
  {
   MessageBox(0, "Ошибка при открытии сервера Excel", 
                 "Ошибка", MB_OK);
  return;
  }
 }

В принципе конструкцию try catch желательно использовать со всеми Ole вызовами, но громоздкость программы сделает ее ненаглядной. В дальнейшем можно оформить все используемые вызовы в виде класса, но на данном этапе задача стоит в освоении богатства возможностей вызовов, а не ловля возможных букашек. Да и все, приведенные сдесь вызовы 100% работоспособны.

Сделаем приложение видимым (лучше наверное всетаки в конце, но так нагляднее - будет видно как идет заполнение таблиц и т.п.).

vVarApp.OlePropertySet("Visible",true);

Переменной vVarBooks присваивается значение Workbooks - свойство объекта Excel.Application, содержащее набор рабочих книг Excel.

vVarBooks=vVarApp.OlePropertyGet("Workbooks");

SheetsInNewWorkbook задает количество листов в создаваемой книге, пусть в первой книге их будет 3(Кстати по умолчани тоже создается книга, содержащая три листа).

vVarApp.OlePropertySet("SheetsInNewWorkbook",3);

Добавляем книгу из 3 листов в объект vVarBooks.

vVarBooks.OleProcedure("Add");

Количество листов во второй создаваемой книге, пусть будет 5.

vVarApp.OlePropertySet("SheetsInNewWorkbook",5);

Добавляем книгу из 5 листов в объект

vVarBooks.OleProcedure("Add");

Переменная vVarBook содержит ссылку на текущую книгу. (Пусть текущая книга 1).

vVarBook=vVarBooks.OlePropertyGet("Item",1);

Переменной vVarSheets присваиваем значение Worksheets - свойство объекта Excel.Application, содержащее набор страниц книги Excel.

vVarSheets=vVarBook.OlePropertyGet("Worksheets") ;

Присвоение имен листам книги. Т.е, необходимо взять лист выбранной книги и дать ему имя. Заодно и покрасим листы, для чего в любом графическом редакторе создадим два файла с именами a.gif и b.gif размером в несколько пиаселей и соответственно с желтой и красной заливкой. Размер сумарный файлов менее 1к, но приятнее работать не с белым листом. Файлы должны быть помещены в текущую директорию.

vVarSheet=vVarSheets.OlePropertyGet("Item",1);
vVarSheet.OlePropertySet("Name","Желтый лист");
AnsiString vAsCurDir=GetCurrentDir();
AnsiString vAsCurDir1=vAsCurDir+"\\a.gif";
vVarSheet.OleProcedure("Activate");
vVarBook.OlePropertyGet("ActiveSheet").
  OleFunction("SetBackgroundPicture",vAsCurDir1.c_str());
vVarSheet=vVarSheets.OlePropertyGet("Item",2);
vVarSheet.OlePropertySet("Name","Краснай лист");
vAsCurDir1=vAsCurDir+"\\b.gif";
vVarSheet.OleProcedure("Activate");
vVarBook.OlePropertyGet("ActiveSheet").
  OleFunction("SetBackgroundPicture",vAsCurDir1.c_str());
vVarSheets.OlePropertyGet("Item",3).
                   OlePropertySet("Name","Пустой лист");

Теперь первый раз запустим приложение и порадуемся что все работает как задумано и на экране две книги Excel и в первой два из трех листов раскрашены.


В начало

1.4 Вывод информации в ячейки

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

Основные шаги при заполнении таблицы повторяются:

1.5 Рисуем рамки

Аналогично как и при заполнении таблицы рамка рисуется для выбранной ячейки или объединенной группы ячеек.

Шаги рисования рамки:


В начало

1.6 Текст кода программы создания таблицы Excel.

На данном этапе имеем полностью оформленнуя таблицу. В принципе порой этого бывает вполне достаточно для выполнения поставленной задачи. Осталось сохранить полученные результаты в файле.

//Отключить вывод сообщений с вопросами типа "Заменить файл..."
vVarApp.OlePropertySet("DisplayAlerts",false);
//Сохранить книгу в папке по умолчанию (Мои документы)
//или в файле по указанию
vAsCurDir1=vAsCurDir+"\\amount.xls";
vVarApp.OlePropertyGet("Workbooks").
        OlePropertyGet("Item",1).
        OleProcedure("SaveAs",
               vAsCurDir1.c_str());
//Закрыть открытое приложение Excel
vVarApp.OleProcedure("Quit");

Результат данного этапа показан на рисунке 1.3

ole_1_3.jpg

Рис 1.3 Таблица Excel.

Ниже приведен полный код текста программы создания таблицы. В тексте введены две дополнительные функции, определенные в файле Unit1.h в разделе private: как:

void __fastcall vBorder(Variant& vVarCell, //Ячейка или группа ячеек
                        int Weight,        //Толщина линии
                        int LineStyle,     //Стиль линии
                        int ColorIndex);   //Цвет линии
void __fastcall   vFont(Variant& vVarCell, //Ячейка или группа ячеек
                        int HAlignment,    //Горизонтальное и веоти-
                        int VAlignment,    //кальное выравнивание
                        int Size,          //Размер шрифта
                        int ColorIndex,    //Цвет заливки ячейки
                        int Name,          //Имя шрифта
                        TColor Color,      //Цвет
                        int Style,         //Стиль
                        int Strikline,     //Зачеркивание и индексы
                        int Underline);    //Подчеркивание

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

Все глобальные переменные определены там где и принято в Borland C++ Builder в файле Unit1.h.

На форме три кнопки - по одной из них запускается сервер Excel и в него выводятся данные, по другой закрывается приложение. Третья кнопка пока свободна.

Файл 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         *Button2;
  TButton         *Button3;
  void __fastcall Button1Click(TObject *Sender);
  void __fastcall Button2Click(TObject *Sender);
  void __fastcall Button3Click(TObject *Sender);
 private:
 Variant       vVarApp,vVarBooks,vVarBook,vVarSheets,
               vVarSheet,vVarCells,vVarCell;
 AnsiString    vAsCurDir;
 bool          fStart;
  void __fastcall vBorder(Variant& vVarCell,int Weight,
                 int LineStyle,int ColorIndex);
  void __fastcall vFont(Variant& vVarCell,int HAlignment,
                        int VAlignment,int Size,
                        int ColorIndex,int Name,
                        TColor Color,int Style,
                        int Strikline,int Underline);
 public:
   __fastcall TForm1(TComponent* Owner);
};
//------------------------------------------
extern PACKAGE TForm1 *Form1;
//------------------------------------------
#endif

Файл Unit1.cpp

#include      <vcl.h>
#pragma       hdrstop
#include      <ComObj.hpp>
#include      <utilcls.h>
#include      "Unit1.h"
#pragma       package(smart_init)
#pragma       resource "*.dfm"
TForm1        *Form1;
//-------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-------------------------------------------------------
void __fastcall 
TForm1::Button1Click(TObject *Sender)
{
 Variant v;
 if(!fStart)
 {
  try
  {
   vVarApp=CreateOleObject("Excel.Application");
   fStart=true;
  }
  catch(...)
  {
   MessageBox(0, "Ошибка при открытии сервера Excel", 
                 "Ошибка", MB_OK);
  return;
  }
 }
 else return;
 vVarApp.OlePropertySet("Visible",true);
 vVarBooks=vVarApp.OlePropertyGet("Workbooks");
 vVarApp.OlePropertySet("SheetsInNewWorkbook",3);
 vVarBooks.OleProcedure("Add");
 vVarApp.OlePropertySet("SheetsInNewWorkbook",2);
 vVarBooks.OleProcedure("Add");
 vVarBook=vVarBooks.OlePropertyGet("Item",1);
 vVarSheets=vVarBook.OlePropertyGet("Worksheets") ;
 vVarSheet=vVarSheets.OlePropertyGet("Item",1);
 vVarSheet.OlePropertySet("Name","Желтый лист");
 vVarSheet.OleProcedure("Activate");
 vAsCurDir=GetCurrentDir();
 AnsiString vAsCurDir1=vAsCurDir+"\\a.gif";
 vVarBook.OlePropertyGet("ActiveSheet").
          OleFunction("SetBackgroundPicture",vAsCurDir1.c_str());
 vVarSheet=vVarSheets.OlePropertyGet("Item",2);
 vVarSheet.OlePropertySet("Name","Краснай лист");
 vVarSheet.OleProcedure("Activate");
 vAsCurDir1=vAsCurDir+"\\b.gif";
 vVarBook.OlePropertyGet("ActiveSheet").
          OleFunction("SetBackgroundPicture",vAsCurDir1.c_str());
 vVarSheets.OlePropertyGet("Item",3).
            OlePropertySet("Name","Пустой лист");
 random(50);
 vVarSheet=vVarSheets.OlePropertyGet("Item",1);
 vVarSheet.OleProcedure("Activate");
 for (int i=4; i < 11; i++)
 {
  //Заносим номер дня в первую строку таблицы
  vVarCell=vVarSheet.OlePropertyGet("Cells").
            OlePropertyGet("Item",4,i);
  vBorder(vVarCell,2,1,55);
  vFont(vVarCell,-4108,-4108,12,37,1,clBlue,0,0,0);
  vVarCell.OlePropertySet("Value",i-3);
  //Занести значение во вторую строку ячейку на выбранном листе
  vVarCell= vVarSheet.OlePropertyGet("Cells").
            OlePropertyGet("Item",5,i);
  vBorder(vVarCell,2,1,55);
  vFont(vVarCell,-4108,-4108,12,37,1,clAqua,0,0,0);
  vVarCell.OlePropertySet("Value", random(50));
  //Занести значение в третью строку ячейку на выбранном листе
  vVarCell= vVarSheet.OlePropertyGet("Cells").
            OlePropertyGet("Item",6,i);
  vBorder(vVarCell,2,1,55);
  vFont(vVarCell,-4108,-4108,12,37,1,clGreen,0,0,0);
  vVarCell.OlePropertySet("Value", random(30));
 }
 //Ячейку итог заполним
 vVarCell=vVarSheet.OlePropertyGet("Cells").
           OlePropertyGet("Item",4,11);
 vBorder(vVarCell,2,1,55);
 vFont(vVarCell,-4108,-4108,12,37,1,clRed,0,0,0);
 vVarCell.OlePropertySet("Value","Итог:");
 //добавить формулы подсчета суммы в строки
 vVarCell=vVarSheet.OlePropertyGet("Cells").
                    OlePropertyGet("Item",5,11);
 vBorder(vVarCell,2,1,55);
 vFont(vVarCell,-4108,-4108,12,37,1,clRed,0,0,0);
 vVarCell.OlePropertySet("Value","=СУММ(D5:J5)");
 vVarCell=vVarSheet.OlePropertyGet("Cells").
                    OlePropertyGet("Item",6,11);
 vBorder(vVarCell,2,1,55);
 vFont(vVarCell,-4108,-4108,12,37,1,clRed,0,0,0);
 vVarCell.OlePropertySet("Value","=СУММ(D6:J6)");
 //Изменим размер ячеек
 vVarCell=vVarSheet.OlePropertyGet("Cells").
                    OlePropertyGet("Item",4,2);
 vBorder(vVarCell,2,1,55);
 vVarCell.OlePropertySet("RowHeight", 20);
 vVarCell.OlePropertySet("ColumnWidth",10);
 //Объединяем ячейки
 vVarCell=vVarSheet.OlePropertyGet("Range","B4:C4");
 vVarCell.OleProcedure("Merge");
 vBorder(vVarCell,2,1,55);
 vFont(vVarCell,-4108,-4108,12,37,1,clBlack,0,0,0);
 //Вписываем вид товара
 vVarCell.OlePropertySet("Value", "Товар\\Дни недели:");
 vVarCell=vVarSheet.OlePropertyGet("Range","B5:C5");
 vVarCell.OleProcedure("Merge");
 vBorder(vVarCell,2,1,55);
 vFont(vVarCell,1,1,12,37,1,clBlack,0,0,0);
 vVarCell.OlePropertySet("Value", "Компьютеры:");
 vVarCell=vVarSheet.OlePropertyGet("Range","B6:C6");
 vVarCell.OleProcedure("Merge");
 vBorder(vVarCell,2,1,55);
 vFont(vVarCell,1,1,12,37,1,clBlack,0,0,0);
 vVarCell.OlePropertySet("Value", "Принтеры:");
 //Пишем заголовок
 vVarCell=vVarSheet.OlePropertyGet("Range","B2:K3");
 vVarCell.OleProcedure("Merge");
 vBorder(vVarCell,3,1,46);
 vFont(vVarCell,-4108,-4108,16,34,1,clBlue,0,0,-4119);
 vVarCell.OlePropertySet("Value", "Продажа техники за неделю");
 //Отключить вывод сообщений с вопросами типа "Заменить файл..."
 vVarApp.OlePropertySet("DisplayAlerts",false);
 //Сохранить вторую книгу в папке по умолчанию (Мои документы)
 //или в файле по указанию
 vAsCurDir1=vAsCurDir+"\\amount.xls";
 vVarApp.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).
         OleProcedure("SaveAs",vAsCurDir1.c_str());
 //Закрыть открытое приложение Excel
 //vVarApp.OleProcedure("Quit");
}
//-------------------------------------------------------
void __fastcall 
TForm1::Button3Click(TObject *Sender)
{
 if(fStart) vVarApp.OleProcedure("Quit");
 Close();
}
//--------------------------------------------------------
void __fastcall 
TForm1::Button2Click(TObject *Sender)
{
 //Пока не используется
}
//---------------------------------------------------------
//Функция определяет все параметры рисования квадратной рамки
//вокруг ячейки или группе выделенных ячеек
void __fastcall 
TForm1::vBorder(Variant& vVarCell,int Weight,
                   int LineStyle,int ColorIndex)
{
 for(int i=8; i <= 10; i++)
 {
  switch(LineStyle)
  {
   case 1:
   case -4115:
   case 4:
   case 5:
   case -4118:
   case -4119:
   case 13:
   case -4142:
    vVarCell.OlePropertyGet("Borders",10).
            OlePropertySet("LineStyle",LineStyle);
   break;
   default:
    vVarCell.OlePropertyGet("Borders",i).
            OlePropertySet("LineStyle",1);
  }
  switch(Weight)
  {
   case 1:
   case -4138:
   case 2:
   case 4:
    vVarCell.OlePropertyGet("Borders",i).
             OlePropertySet("Weight",Weight);
   break;
   default:
    vVarCell.OlePropertyGet("Borders",i).
             OlePropertySet("Weight",1);
  }
  vVarCell.OlePropertyGet("Borders",i).
           OlePropertySet("ColorIndex",ColorIndex);
 }
}
//--------------------------------------------------------
//Функция определяет все параметры шрифта, заливку, подчеркивание
//и выравнивание текста в ячейках или группе выделенных ячеек
void __fastcall 
TForm1::vFont(Variant& vVarCell,int HAlignment,
              int VAlignment,int Size,int ColorIndex,
              int Name,TColor Color,int Style,
              int Strikline,int Underline)
{
  //Выравнивание
  switch(HAlignment)
  {
   case -4108:
   case 7:
   case -4117:
   case 5:
   case 1:
   case -4130:
   case -4131:
   case -4152:
    vVarCell.OlePropertySet("HorizontalAlignment",HAlignment);
   break;
  }
  switch(VAlignment)
  {
   case -4108:
   case 7:
   case -4117:
   case 5:
   case 1:
   case -4130:
   case -4131:
   case -4152:
    vVarCell.OlePropertySet("VerticalAlignment",VAlignment);
   break;
  }
  //Размер шрифта
  vVarCell.OlePropertyGet("Font").
           OlePropertySet("Size",Size);
  //Цвет шрифта
  vVarCell.OlePropertyGet("Font").
           OlePropertySet("Color",Color);
  //Имя щрифта(Можно включаь сколько угодно)
  switch(Name)
  {
   case 1:
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Name","Arial");
   break;
   case 2:
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Name","Times New");
   break;
   default:
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Name","System");
  }
  //Заливка ячейки
  vVarCell.OlePropertyGet("Interior").
           OlePropertySet("ColorIndex",ColorIndex);
  //Стиль шрифта
  switch(Style)
  {
   case 1:
    vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",true);
    vVarCell.OlePropertyGet("Font").OlePropertySet("Italic",false);
   break;
   case 2:
    vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",false);
    vVarCell.OlePropertyGet("Font").OlePropertySet("Italic",true);
   break;
   case 3:
    vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",true);
    vVarCell.OlePropertyGet("Font").OlePropertySet("Italic",true);
   break;
   default:
   vVarCell.OlePropertyGet("Font").OlePropertySet("Bold",false);
   vVarCell.OlePropertyGet("Font").OlePropertySet("Italic",false);
  }
  //Зачеркивание и индексы
  switch(Strikline)
  {
   case 1: //Зачеркнутый
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Strikethrough",true);
   break;
   case 2://Верхний индекс
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Superscript",true);

   break;
   case 3://Верхний индекс
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Subscript",true);

   break;
   case 4://Нижний индекс
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Subscript",true);

   break;
   case 5://Без линий
    vVarCell.OlePropertyGet("Font").
            OlePropertySet("OutlineFont",true);

   break;
   case 6://C тенью
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Shadow",true);

   break;
   default://Без линий
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("OutlineFont",true);
  }
  //Подчеркивание
  switch(Underline)
  {
   case 2:
   case 4:
   case 5:
   case -4119:
    vVarCell.OlePropertyGet("Font").
             OlePropertySet("Underline",Underline);
   break;
  }
}
//--------------------------------------------------------


В начало

1.7 Создание диаграмм.

1.7.1 Вставка диаграммы в документ.

Для отображения данных листа на диаграмме необходимо выделить эти данные, переменной vVarBooks присвоить значение Charts - свойство объекта Excel.Application, содержащее набор диаграмм и выролнить процедуру Add.

К тексту кода программы создания таблиц добавим код обработки события нажатия кнопки 2, где будем формировать диаграмму.

void __fastcall 
TForm1::Button2Click(TObject *Sender)
{
 //Вспомогательная переменная
 Variant v; 
 //Выйдем если не запускали создание таблицы
 if(!fStart) return; 
 //Сделать текущей книгу 1
 vVarBook=vVarBooks.OlePropertyGet("Item",1);
 //Сделать текущим лист 1 книги 1
 vVarSheets=vVarBook.OlePropertyGet("Worksheets") ;
 vVarSheet=vVarSheets.OlePropertyGet("Item",1);
 //Смотреть на лист 1 книги 1
 vVarSheet.OlePropertyGet("Select");
 //Объеденить ячейки с данными
 vVarCell=vVarSheet.OlePropertyGet("Range","D4:J6");
 //Выделить ячейки
 vVarCell.OleProcedure("Select");
 //Переменной vVarBooks присвоить значение Charts - свойство 
 //объекта Excel.Application, содержащее набор диаграмм
 vVarBooks=vVarApp.OlePropertyGet("Charts");
 //Добавить диаграмму по умолчанию
 vVarBooks.OleProcedure("Add");
}

В результате перед выделенным листом будет вставлена диаграмма, значение данных которой связано с данными выделенного "Желтого листа", изменение данных в ячейках D4:J6 листа сразу же отобразится на диаграмме.

ole_1_4.jpg

Рис 1.4 Вставка диаграммы по умолчанию.

1.7.2 Перемещение диаграммы между листами книги.

Диаграмма вставлена перед "Желтым листом", т.е. перед тем листом, для которого и создается диаграмма, и это не всегда удобно. Ставим целью переместить диаграмму на лист с таблицей. Добавим следующий код к коду в Button3Click:

vVarBook.OlePropertyGet("ActiveChart").
         OleProcedure("Location",2,"Желтый лист");

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

1.7.3 Перемещение диаграммы на листе книги.

Диаграмма "перепрыгнет" на указанный лист, но если последнее закрытие приложения Excel было не с полноэкранного режима или таблица велика, то диаграмма вполне может наложиться на таблицу (не поможет даже режим размещения xlLocationAutomatic). Выберем лист и начнем двигать диаграмму (Кроме перемещения здесь показан еще один способ выбора листа - по имени "Worksheets","Желтый лист").

vVarSheet=vVarBook.OlePropertyGet("Worksheets","Желтый лист");
vVarSheet.OleProcedure("Activate");

Далее смещаем диаграмму в пределах "желтого" листа (конечно параметры приходится подбирать):

vVarSheet.OlePropertyGet("ChartObjects").
          OlePropertyGet("Item",1).OlePropertySet("Top",120);
vVarSheet.OlePropertyGet("ChartObjects").
          OlePropertyGet("Item",1).OlePropertySet("Left",150);
vVarSheet.OlePropertyGet("ChartObjects").
          OlePropertyGet("Item",1).OlePropertySet("Height",200);
vVarSheet.OlePropertyGet("ChartObjects").
          OlePropertyGet("Item",1).OlePropertySet("Width",350);

1.7.4 Изменение типа(вида) диаграммы.

Изменение типа диаграммы связано с изменением свойства - ChartType. До этого работа осуществлялась с диаграммой по умолчанию (Рис. 1.5).

ole_1_5.jpg

Рис 1.5 Диаграмма по умолчанию.

vVarBook.OlePropertyGet("ActiveChart").
         OlePropertySet("ChartType",52);

В результате тип диаграммы изменится на один из типов, определяемых множеством констант:

И еще порядка 70 типов диаграмм. Полный перечень в указанных выше библиотеках.

1.7.5 Присвоение имени диаграммы.

Продолжаем дописывать код - задаем имя диаграмме.

vVarBook.OlePropertyGet("ActiveChart").
         OlePropertySet("HasTitle",true);
v=vVarBook.OlePropertyGet("ActiveChart").
           OlePropertyGet("ChartTitle");
v.OleProcedure("Select");
//Присваиваем имя
v.OlePropertyGet("Characters").
  OlePropertySet("Text","Итоги продаж за неделю");
//Заполнение
v.OlePropertyGet("Fill").OlePropertySet("Visible",true);
v.OlePropertyGet("Fill").OlePropertyGet("ForeColor").
                         OlePropertySet("SchemeColor",33);
//Ориентация заголовка
v.OlePropertySet("Orientation",-4128);
//Центрирование
v.OlePropertySet("HorizontalAlignment",-4108);
v.OlePropertySet("VerticalAlignment",-4108);
//Рамка заголовка
v.OlePropertyGet("Border").OlePropertySet("ColorIndex",46);
v.OlePropertyGet("Border").OlePropertySet("Weight",2);
v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
//Параметры шрифта
v.OlePropertySet("AutoScaleFont",true);
v.OlePropertyGet("Font").OlePropertySet("Size",12);
v.OlePropertyGet("Font").OlePropertySet("Name","Times New");
v.OlePropertyGet("Font").OlePropertySet("ColorIndex",0);
v.OlePropertyGet("Font").OlePropertySet("Strikethrough",false);
v.OlePropertyGet("Font").OlePropertySet("Superscript",false);
v.OlePropertyGet("Font").OlePropertySet("Subscript",false);
v.OlePropertyGet("Font").OlePropertySet("FontStyle",
                                        "полужирный курсив");
v.OlePropertyGet("Font").OlePropertySet("OutlineFont",true);
v.OlePropertyGet("Font").OlePropertySet("Shadow",true);
v.OlePropertyGet("Font").OlePropertySet("Background",xlTransparent);
v.OlePropertyGet("Font").OlePropertySet("Underline",
                                        xlUnderlineStyleSingle);

Константы для вызова OlePropertySet("Orientation",xlHorizontal):

Толщина линии для вызова OlePropertySet("Weight",2);

Константы стиля линии для вызова OlePropertySet("LineStyle", xlContinuous):

Константы выравнивания текста для вызова

Константа xlTransparent для вызова OlePropertySet("Background",xlTransparent) равна 2. //*****

1.7.6 Присвоение названия осям.

vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("Axes",1,1).
         OlePropertySet("HasTitle",true);
vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("Axes",1,1).
         OlePropertyGet("AxisTitle").OlePropertyGet("Characters").
         OlePropertySet("Text","Компьютеры - Принтеры");
vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("Axes",2,1).
         OlePropertySet("HasTitle",true);
vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("Axes",2,1).
         OlePropertyGet("AxisTitle").
         OlePropertyGet("Characters").
         OlePropertySet("Text","Число");

Для доступа к свойствам диаграммы используется вызовы:

OlePropertyGet("Axes",xlCategory, xlPrimary).
OlePropertyGet("Axes",xlValue, xlPrimary).

Другие константы этого вызова:

typedef enum tagXlAxisType:

typedef enum tagXlAxisGroup:

1.7.7 Нанесение крупной и мелкой сетки.

 //Сетка мелкая
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
        OlePropertySet("HasMajorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
          OlePropertyGet("MajorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
        OlePropertySet("HasMajorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
          OlePropertyGet("MajorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
//Сетка мелкая
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
        OlePropertySet("HasMinorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
          OlePropertyGet("MinorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
        OlePropertySet("HasMinorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
          OlePropertyGet("MinorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);

Для доступа к свойствам также используется вызовы:

OlePropertyGet("Axes",xlCategory). //по оси х
OlePropertyGet("Axes",xlValue).    //по оси y

1.7.8 Подписываем и передвигаем легенду.

vVarBook.OlePropertyGet("ActiveChart").
         OlePropertySet("HasLegend",true);
vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("SeriesCollection",1).
         OlePropertySet("Name","Компьютеры");
vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("SeriesCollection",2).
         OlePropertySet("Name","Принтеры");
Variant v=vVarBook.OlePropertyGet("ActiveChart").
                   OlePropertyGet("Legend");
v.OleProcedure("Select");
//Где разместить - слева, справа, снизу...
v.OlePropertySet("Position", -4152);
//Цвет легенды
v.OlePropertyGet("Interior").OlePropertySet("ColorIndex",34);

Константы для вызова OlePropertySet("Position",xlBottom);

1.7.9 Изменение фона диаграммы и рамки.

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

v=vVarBook.OlePropertyGet("ActiveChart").
           OlePropertyGet("ChartArea");
v.OleProcedure("Select");
v.OlePropertyGet("Interior").OlePropertySet("ColorIndex",35);
v.OlePropertyGet("Border").OlePropertySet("ColorIndex",46);
v.OlePropertyGet("Border").OlePropertySet("Weight",2);
v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);

Толщина линии(Weight)

Константы стиля линии(LineStyle)

1.7.10 Удаление лишних данных с номерами дней с диаграммами.

Здесь требуется удалить практически строку данных, которая до сих пор использовалась как основа для формирования расположения точек графика по оси x. Данные хранятся в чвойстве SeriesCollection.

vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("SeriesCollection",1).
         OleProcedure("Delete");

1.7.11 Удаление лишних данных с номерами дней с диаграммами.

Удалим лишнюю информацию с диаграммы строку с цифрами 1,2,3,4,5,6,7.

vVarBook.OlePropertyGet("ActiveChart").
         OlePropertyGet("SeriesCollection",1).
         OleProcedure("Delete");

1.7.12 Сохранение информации.

Это далеко не весь перечень возможностей по изменению вида и цвета диаграмм и т.д. Для продолжения изучения здесь особенно подходит так называемый "хитрый метод". Но, в принципе, представленной информации должно хватить для создания большинства практических задач. Осталось только запомнить данные в файле и на экране результат работы - Рис 1.1.

//Отключить вывод сообщений с вопросами типа "Заменить файл..."
vVarApp.OlePropertySet("DisplayAlerts",false);
//Сохранить книгу в папке по умолчанию (Мои документы)
//или в файле по указанию
AnsiString vAsCurDir1=vAsCurDir+"\\amount.xls";
vVarApp.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).
        OleProcedure("SaveAs",vAsCurDir1.c_str());
//Закрыть открытое приложение Excel
//vVarApp.OleProcedure("Quit");


В начало

1.8 Текст кода программы, реализующий вывод диаграмм.

Текст кода является продолжением кода, реализующего создание таблицы (п 1.6). В файле Unit1.h добавления не было. В файле Unit1.cpp весь код расположен в обработчике события нажатия кнопки Button2Click.

 Variant v; //Вспомогательная переменная
 if(!fStart) return;
 //Сделать текущей книгу 1
 vVarBook=vVarBooks.OlePropertyGet("Item",1);
 //Сделать текущим лист 1 книги 1
 vVarSheets=vVarBook.OlePropertyGet("Worksheets") ;
 vVarSheet=vVarSheets.OlePropertyGet("Item",1);
 //Смотреть на лист 1 книги 1
 vVarSheet.OlePropertyGet("Select");
 //Объеденить ячейки с данными
 vVarCell=vVarSheet.OlePropertyGet("Range","D4:J6");
 //Выделить ячейки
 vVarCell.OleProcedure("Select");
 //Переменной vVarBooks присвоить значение Charts - свойство
 //объекта Excel.Application, содержащее набор диаграмм
 vVarBooks=vVarApp.OlePropertyGet("Charts");
 //Добавить диаграмму по умолчанию
 vVarBooks.OleProcedure("Add");
 //Перемещаем диаграмму на активный лист
 vVarBook.OlePropertyGet("ActiveChart").
          OleProcedure("Location",2,"Желтый лист");
 //Активируем нужный лист
 vVarSheet=vVarBook.OlePropertyGet("Worksheets","Желтый лист");
 vVarSheet.OleProcedure("Activate");
 //Cмещаем диаграмму в пределах "желтого" листа:
 vVarSheet.OlePropertyGet("ChartObjects").
           OlePropertyGet("Item",1).OlePropertySet("Top",120);
 vVarSheet.OlePropertyGet("ChartObjects").
           OlePropertyGet("Item",1).OlePropertySet("Left",150);
 vVarSheet.OlePropertyGet("ChartObjects").
           OlePropertyGet("Item",1).OlePropertySet("Height",200);
 vVarSheet.OlePropertyGet("ChartObjects").
           OlePropertyGet("Item",1).OlePropertySet("Width",350);
 //Изменяем тип диаграммы
 vVarBook.OlePropertyGet("ActiveChart").
           OlePropertySet("ChartType",52);
 //Присвоение имени диаграммы
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertySet("HasTitle",true);
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertySet("HasTitle",true);
 v=vVarBook.OlePropertyGet("ActiveChart").
            OlePropertyGet("ChartTitle");
 //Присваиваем имя
 v.OleProcedure("Select");
 v.OlePropertyGet("Characters").
   OlePropertySet("Text","Итоги продаж за неделю");
 //Заполнение
 v.OlePropertyGet("Fill").OlePropertySet("Visible",true);
 v.OlePropertyGet("Fill").OlePropertyGet("ForeColor").
                          OlePropertySet("SchemeColor",41);
 //Ориентация заголовка
 v.OlePropertySet("Orientation",-4128);
 //Рамка
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",46);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 //Центровка
 v.OlePropertySet("HorizontalAlignment",-4108);
 v.OlePropertySet("VerticalAlignment",-4108);
 //Шрифт
 v.OlePropertySet("AutoScaleFont",true);
 v.OlePropertyGet("Font").OlePropertySet("Size",12);
 v.OlePropertyGet("Font").OlePropertySet("Name","Times New");
 //Два способа задания цвета
 v.OlePropertyGet("Font").OlePropertySet("ColorIndex",0);
 v.OlePropertyGet("Font").OlePropertySet("Color",clLime);
 v.OlePropertyGet("Font").OlePropertySet("Strikethrough",false);
 v.OlePropertyGet("Font").OlePropertySet("Superscript",false);
 v.OlePropertyGet("Font").OlePropertySet("Subscript",false);
 v.OlePropertyGet("Font").OlePropertySet("Bold",true);
 v.OlePropertyGet("Font").OlePropertySet("Italic",true);
 v.OlePropertyGet("Font").OlePropertySet("OutlineFont",true);
 v.OlePropertyGet("Font").OlePropertySet("Shadow",true);
 v.OlePropertyGet("Font").OlePropertySet("Background",2);
 v.OlePropertyGet("Font").OlePropertySet("Underline",2);
 //Присвоение названия оси х
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("Axes",1,1).
          OlePropertySet("HasTitle",true);
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("Axes",1,1).
          OlePropertyGet("AxisTitle").OlePropertyGet("Characters").
          OlePropertySet("Text","Компьютеры - Принтеры");
 //Присвоение названия оси у
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("Axes",2,1).
          OlePropertySet("HasTitle",true);
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("Axes",2,1).
          OlePropertyGet("AxisTitle").OlePropertyGet("Characters").
          OlePropertySet("Text","Число");
 //Наносим сетку крупную и мелкую
 //Сетка крупная
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
        OlePropertySet("HasMajorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
          OlePropertyGet("MajorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
 ///////////
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
        OlePropertySet("HasMajorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
          OlePropertyGet("MajorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
//Сетка мелкая
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
        OlePropertySet("HasMinorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",2).
          OlePropertyGet("MinorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
 ///////////
 vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
        OlePropertySet("HasMinorGridlines",true);
 v=vVarBook.OlePropertyGet("ActiveChart").OlePropertyGet("Axes",1).
          OlePropertyGet("MinorGridlines");
 v.OleProcedure("Select");
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",8);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
 //Подписываем легенду
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertySet("HasLegend",true);
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("SeriesCollection",2).
          OlePropertySet("Name","Компьютеры");
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("SeriesCollection",3).
          OlePropertySet("Name","Принтеры");
 v=vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("Legend");
 v.OleProcedure("Select");
 v.OlePropertySet("Position",-4152);
 v.OlePropertyGet("Interior").OlePropertySet("ColorIndex",34);
 //Изменяем фон для диаграммы и рамку
 v=vVarBook.OlePropertyGet("ActiveChart").
           OlePropertyGet("ChartArea");
 v.OleProcedure("Select");
 v.OlePropertyGet("Interior").OlePropertySet("ColorIndex",35);
 v.OlePropertyGet("Border").OlePropertySet("ColorIndex",46);
 v.OlePropertyGet("Border").OlePropertySet("Weight",2);
 v.OlePropertyGet("Border").OlePropertySet("LineStyle",1);
 //Удаляем лишнюю информацию с диаграммы строку 1,2,3,4,5,6,7
 vVarBook.OlePropertyGet("ActiveChart").
          OlePropertyGet("SeriesCollection",1).
          OleProcedure("Delete");
 //Отключить вывод сообщений с вопросами типа "Заменить файл..."
 vVarApp.OlePropertySet("DisplayAlerts",false);
 //Сохранить книгу в папке по умолчанию (Мои документы)
 //или в файле по указанию
 AnsiString vAsCurDir1=vAsCurDir+"\\amount.xls";
 vVarApp.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).
         OleProcedure("SaveAs",vAsCurDir1.c_str());
 //Закрыть открытое приложение Excel
 //vVarApp.OleProcedure("Quit");


В начало

1.9 Режимы отображения приложения

Для того, чтобы просмотреть все возможные режима отображения создадим новое приложение (File/New/Application) и поместим 5 кнопок на форму.

Создадим обработчики события для всех кнопок (2 левых клика по кнопке) и обработчик события FormCreate (2 левых клика по площади формы).

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

#include    <vcl.h>
#include    <ComObj.hpp>
#include    <utilcls.h>
#pragma     hdrstop
#include    "Unit1.h"
#pragma     package(smart_init)
#pragma     resource "*.dfm"
TForm1      *Form1;
Variant     vVarApp;
//--------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//--------------------------------------------------
void __fastcall 
TForm1::FormCreate(TObject *Sender)
{
 vVarApp=CreateOleObject("Excel.Application");
 vVarApp.OlePropertySet("Visible",true);
}
//--------------------------------------------------
void __fastcall 
TForm1::Button1Click(TObject *Sender)
{       ////// Полноэкранный режим ////////////
 vVarApp.OlePropertySet("DisplayFullScreen",true);
}
//--------------------------------------------------
void __fastcall 
TForm1::Button2Click(TObject *Sender)
{
 //// Возврат в режим, установленный при запуске /////
 vVarApp.OlePropertySet("DisplayFullScreen",false);
}
//--------------------------------------------------
void __fastcall 
TForm1::Button3Click(TObject *Sender)
{
 /////Минимизированное - свернутое в око/////
 vVarApp.OlePropertySet("WindowState",-4140);
}
//--------------------------------------------------
void __fastcall 
TForm1::Button4Click(TObject *Sender)
{
 //////Окно развернутое во весь экран//////
 vVarApp.OlePropertySet("WindowState",-4137);
}
//--------------------------------------------------
void __fastcall 
TForm1::Button5Click(TObject *Sender)
{
  ////////Нормальный размер окна///////
 vVarApp.OlePropertySet("WindowState",-4143);
}
//--------------------------------------------------

Значения констант:


В начало

1.10 Размеры приложения

Прежде чем изменять размер приложения необходимо выключить полноэкранный режим и затем уже выставить размеры. В предыдущем примере заменяем обработчик события Button2Click на следующий код.

void __fastcall 
TForm1::Button2Click(TObject *Sender)
{
 vVarApp.OlePropertySet("DisplayFullScreen",false);
 vVarApp.OlePropertySet("Width",520);
 vVarApp.OlePropertySet("Height",500);
 vVarApp.OlePropertySet("Left",20);
 vVarApp.OlePropertySet("Top",100);
}

Приложение будет при нажатии Button2 принимать установленные размеры.


В начало

1.11 Управление панелями инструментов

Для управления панелями инструментов используется свойство "CommandBars" и имена панелей, которые необходимо отобразить или скрыть.


В предыдущем примере заменяем обработчик события Button2Click и Button3Click на следующие коды.

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 vVarApp.OlePropertyGet("CommandBars","Standard"). 
         OlePropertySet("Visible",true);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 vVarApp.OlePropertyGet("CommandBars","Standard").
         OlePropertySet("Visible",false);
}

Нажимая поочередно кнопки 2 и 3 будем видеть появление и удаление указанной в вызове панели.


В начало

1.12 Масштаб документа

Следующий пример изменяет масштаб документа по Button1Click на 50% и по Button2Click на 100%. В предыдущем примере внесем следующие изменения.

Variant  vVarApp,vVarBooks;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 vVarApp=CreateOleObject("Excel.Application");
 vVarApp.OlePropertySet("Visible",true);
 vVarBooks=vVarApp.OlePropertyGet("Workbooks");
 vVarApp.OlePropertySet("SheetsInNewWorkbook",1);
 vVarBooks.OleProcedure("Add");
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 vVarApp.OlePropertyGet("ActiveWindow").
               OlePropertySet("Zoom",50);
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 vVarApp.OlePropertyGet("ActiveWindow").
                 OlePropertySet("Zoom",100);
}


В начало

1.13 Спрятать шапки строк и столбцов.

 vVarApp.OlePropertyGet("ActiveWindow").
         OlePropertySet("DisplayHeadings",false);
 vVarApp.OlePropertyGet("ActiveWindow").
          OlePropertySet("DisplayHeadings",true);


В начало

1.14 Расположение книг каскадом и черепицей.

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

ole_1_6.jpg

Рис 1.6 Расположение книг.

Константы для изменения расположения окон.

Variant       vVarApp,vVarBooks;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 vVarApp=CreateOleObject("Excel.Application");
 vVarApp.OlePropertySet("Visible",true);
 vVarBooks=vVarApp.OlePropertyGet("Workbooks");
 vVarApp.OlePropertySet("SheetsInNewWorkbook",2);
 vVarBooks.OleProcedure("Add");
 vVarApp.OlePropertySet("SheetsInNewWorkbook",3);
 vVarBooks.OleProcedure("Add");
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 vVarApp.OlePropertyGet("Windows").OleProcedure("Arrange",1);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 vVarApp.OlePropertyGet("Windows").OleProcedure("Arrange",7);
}


В начало

1.15 Несколько листов одной книги на одной странице.

Получим для книги из трех страниц следующее расположение:

ole_1_7.jpg

Рис 1.7 Листы книги на одной странице.

Способ заключается в обработке каждого листа и формирование для каждого листа нового окна и уничтожение дубликата окна.

Variant       vVarApp,vVarBooks,vVarBook,vVarSheets,vVarSheet;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 vVarApp=CreateOleObject("Excel.Application");
 vVarApp.OlePropertySet("Visible",true);
 vVarBooks=vVarApp.OlePropertyGet("Workbooks");
 //Создается книга из трех листов
 vVarApp.OlePropertySet("SheetsInNewWorkbook",3);
 vVarBooks.OleProcedure("Add");
 vVarBook=vVarBooks.OlePropertyGet("Item",1);
 vVarSheets=vVarBook.OlePropertyGet("Worksheets");
 //Обработка первого листа
 vVarSheet=vVarSheets.OlePropertyGet("Item",1);
 vVarSheet.OleProcedure("Activate");
 vVarApp.OlePropertyGet("ActiveWindow").OleProcedure("NewWindow");
 //Обработка второго листа
 vVarSheet=vVarSheets.OlePropertyGet("Item",2);
 vVarSheet.OleProcedure("Activate");
 vVarApp.OlePropertyGet("ActiveWindow").OleProcedure("NewWindow");
 //Обработка третьего листа
 vVarSheet=vVarSheets.OlePropertyGet("Item",3);
 vVarSheet.OleProcedure("Activate");
 vVarApp.OlePropertyGet("ActiveWindow").OleProcedure("NewWindow");
 //Убрать дубликат окна
 vVarApp.OlePropertyGet("ActiveWindow").OleProcedure("Close");
 //Расположение черепицей
 vVarApp.OlePropertyGet("Windows").OleProcedure("Arrange",xlTiled);
}


В начало

1.16 Поменять листы местами

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

Файл Unit1.cpp

#include 
//==============================
#include           
#include           
//==============================
#pragma hdrstop

#include "Unit1.h"
#include "funcexcel.cpp"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
AnsiString vasCurDir;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 vasCurDir=GetCurrentDir();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 //Макрос
 // Sheets("Лист1").Select
 // Sheets("Лист1").Move After:=Sheets(2)
 if(FileExists(vasCurDir+"\\Book1.xls"))
 {
  iStartExcel(vasCurDir+"\\Book1.xls");
  OleVariant  Before,After;
  Before=EmptyParam;
  After=vVarSheets.OlePropertyGet("Item",2);
  //Меняем местами
  vVarSheet.OleProcedure("Move",Before,After);
  //Или копируем
  //vVarSheet.OleProcedure("Copy",Before,After);
  //Или лист копируем или переносим в новую книгу
  //vVarSheet.OleProcedure("Copy");
  //vVarSheet.OleProcedure("Move");
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 iStopExcel(0,"C:\\1.xls");
}
//---------------------------------------------------------------------------

Файл Unit1.h

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TButton *Button1;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall FormCreate(TObject *Sender);
private:	// User declarations
  //Переменные для работы с Excel
  Variant                vVarApp,vVarBooks,vVarBook,vVarSheets,
                                 vVarSheet,vVarCells,vVarCell;

   //Функции для работы с Excel
  int    __fastcall      iStartExcel(AnsiString vasNameFile);
  int    __fastcall      iStopExcel(int i,AnsiString vasS);
  int    __fastcall      iMerge(int line, int col,int unite,int row);
  int    __fastcall      iInsertExel(AnsiString vas);

public:		// User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Файд funcexcel.cpp

////////////////////////////////////////////////////////////////////////
//                      Старт Excel
////////////////////////////////////////////////////////////////////////
int    __fastcall
TForm1::iStartExcel(AnsiString vasNameFile)
{
 //Создаем объект Excel.Application и загружаем файл бланка
 char vchrgBuf0[100];
 wsprintf(vchrgBuf0,
 "Ошибка при открытии сервера Excel\n для файла %s",
                                   vasNameFile.c_str());
 vasNameFile=vasNameFile.Trim();
 try
 {
  //Создаем объект Excel.Application
  vVarApp=CreateOleObject("Excel.Application");
  vVarApp.OlePropertySet("Visible",true);
  vVarBooks=vVarApp.OlePropertyGet("Workbooks");
  vVarBooks.OleProcedure("Open",vasNameFile.c_str());
  vVarBook=vVarBooks.OlePropertyGet("Item",1);
  vVarSheets=vVarBook.OlePropertyGet("Worksheets");
  //На первый лист
  vVarSheet=vVarBook.OlePropertyGet("Worksheets",1);
  vVarSheet.OleProcedure("Activate");
 }
 catch(...)
 {
  MessageBox(0,vchrgBuf0,"Ошибка", MB_OK);
  vVarApp.OlePropertySet("DisplayAlerts",false);
  vVarApp.OleProcedure("Quit");
  return 1;
 }
 return 0;
}
////////////////////////////////////////////////////////////////////////
//         О Б Ъ Е Д И Н Е Н И Е   И  ВЫБОР  Я Ч Е Е К            //////
//   tip=0 - объединение, 1 - линия сверху, 2 - только селекция   //////
////////////////////////////////////////////////////////////////////////
int    __fastcall
TForm1::iMerge(int line, int col,int unite,int row)
{
 AnsiString vasS[46]={"A","B","C","D","E","F","G","H","I","J","K","L","M",
    "N","O","P","Q","R","S","T","U","V","W","X","Y","Z","AA","AB","AC","AD","AE",
    "AF","AG","AH","AI","AJ","AK","AL","AM","AN","AO","AP","AQ","AR","AS","AT"};
 char buf[10];
 if(row <= 0 || col <= 0 || line <= 0 || unite <= 0)
 {
  MessageBox(0,"Ошибка выбора ячейки для вывода информации Excel",
    "Ошибка", MB_OK);
  return 1;
 }
 int i=line+row-1;
 AnsiString s=vasS[col-1]+IntToStr(line)+":"+vasS[col+unite-2]+IntToStr(i);
 try
 {
  vVarCell=vVarSheet.OlePropertyGet("Range",s.c_str());
  //При tip = 0  объединяем
  vVarCell.OleProcedure("Merge");
  vVarCell.OleProcedure("Select");
 }                         
 catch(...)
 {
  MessageBox(0,"Ошибка выбора ячейки для вывода информации Excel",
    "Ошибка", MB_OK);
  return 1;
 }
 return 0;
}
////////////////////////////////////////////////////////////////////////
//            Запись в выбранную ячейку
////////////////////////////////////////////////////////////////////////
int  __fastcall
TForm1::iInsertExel(AnsiString vas)
{
 try
 {
  //vVarCell.OlePropertySet("WrapText",true);
  if(vas.Length() !=0)
    vVarCell.OlePropertySet("Value",vas.c_str());
 }
 catch(...)
 {
  char vchrgBuf0[100];
  wsprintf(vchrgBuf0,
  "Ошибка при записи данных в ячейку Excel","Ошибка", MB_OK);
  return 1;
 }
 return 0;
}
////////////////////////////////////////////////////////////////////////
//             Выход из Excel
////////////////////////////////////////////////////////////////////////
int    __fastcall
TForm1::iStopExcel(int i,AnsiString vasS)
{
 try
 {
  if(i == 1)
  {
   //НЕ отключить(true) вывод сообщений с вопросами типа 
   //"Заменить файл..."
   vVarApp.OlePropertySet("DisplayAlerts",false);
   //Сохранить книгу
   vVarApp.OlePropertyGet("Workbooks").
           OlePropertyGet("Item",1).
           OleProcedure("SaveAs",vasS.c_str());;
   //Закрыть открытое приложение Excel
  }
  vVarApp.OleProcedure("Quit");
 }
 catch(...)
 {
  MessageBox(0, "Ошибка при сохранении документа в формате .xls",
                 "Ошибка", MB_OK);
  return 1;
 }
 return 0;

}
////////////////////////////////////////////////////////////////////////


В начало

1.17 Автозаполнение или работа с диапазонами

Создадим файл 1.xls, в который предварительно запишем информацию, показанную на Рис.1.8.

ole_1_8.jpg

Рис 1.8 Файл xls для автозаполнения

После открытия файла средcтвами OLE (как это было показано выше) выполним следующий код:

  Variant vRange1=vVarApp.OlePropertyGet("Range","B1:B15");
  Variant vRange=vVarApp.OlePropertyGet("Range","B1:B2");
  vRange.OleProcedure("Select");
  vRange.OleProcedure("AutoFill",vRange1,2);
  vRange=vVarApp.OlePropertyGet("Range","C1");
  vRange.OleFunction("AutoFill",vVarApp.OlePropertyGet("Range","C1:C15"),8);
  vRange=vVarApp.OlePropertyGet("Range","D1");
  vRange.OleFunction("AutoFill",vVarApp.OlePropertyGet("Range","D1:D15"),7);
  vRange=vVarApp.OlePropertyGet("Range","E1");
  vRange.OleFunction("AutoFill",vVarApp.OlePropertyGet("Range","E1:E15"),0);
  vRange=vVarApp.OlePropertyGet("Range","F1");
  vRange.OleFunction("AutoFill",vVarApp.OlePropertyGet("Range","F1:F15"),6);
  vRange=vVarApp.OlePropertyGet("Range","G1");
  vRange.OleFunction("AutoFill",vVarApp.OlePropertyGet("Range","G1:G15"),5);
  vRange=vVarApp.OlePropertyGet("Range","H1");
  vRange.OleFunction("AutoFill",vVarApp.OlePropertyGet("Range","H1:H15"),5);

Значение третьего параметра функции OleFunction это одна из следующих констант:

xlFillYears = 8,   
xlFillWeekdays = 6,
xlFillValues = 4,  
xlFillSeries = 2,  
xlFillMonths = 7,  
xlFillFormats = 3, 
xlFillDefault = 0, 
xlFillDays = 5,    
xlFillCopy = 1,    
xlFill = 5,        

Результат выполнения кода показан на Рис.1.9

ole_1_9.jpg

Рис 1.9 Файл xls после автозаполнения


В начало

1.18 Вставка сторок в Excel

Параграф добавлен по просьбам трудящихся 27.7.2006.

Функции этого примера см. выше. 1.16

//См выше 1.16 
iStartExcel("C:\\1.xls");
vVarSheet.OlePropertyGet("Rows","7:7").OleProcedure("Select");
Variant v=vVarApp.OlePropertyGet("Selection");
//xlShiftDown = -4121
//xlShiftToRight = -4161
//xlShiftUp = -4162
//xlShiftToLeft = -4159
v.OleProcedure("Insert", -4162);
//Сохраняем в C:\\1.xls См выше 1.16 
iStopExcel(1,"C:\\1.xls");


В начало

1.19 Грузим и двигаем рисунки по листу

Параграф добавлен по просьбам трудящихся 1.8.2006.

Функции этого примера см. выше. 1.16

try
{
 if(iStartExcel("C:\\1.xls")) return;
 vVarSheet.OlePropertyGet("Shapes").OleFunction("AddPicture",
    "c:\\1.bmp",false,true,vVarSheet.OlePropertyGet 
   ("Range","B10").OlePropertyGet"Left"),
  vVarSheet.OlePropertyGet("Range","B10").OlePropertyGet("Top"),-1,-1);
  vVarSheet.OlePropertyGet("Pictures","Picture 1");
  Variant v=vVarApp.OlePropertyGet("Selection");
  v.OlePropertyGet("ShapeRange").OleFunction("IncrementLeft",-177.75);
  v.OlePropertyGet("ShapeRange").OleFunction("IncrementTop",100);
  v.OlePropertyGet("ShapeRange").OleFunction("IncrementRotation",-90);
 }catch(...)
 {
 }
 iStopExcel(1);
 Close();


В начало

1.20 Установить параметры страницы

Variavt v=VarSheet.OlePropertyGet("PageSetup")
v.OlePropertySet("LeftMargin",vVarApp.OleFunction("InchesToPoints",0.393700787401575));
v.OlePropertySet("RightMargin",vVarApp.OleFunction("InchesToPoints",0.393700787401575));
v.OlePropertySet("TopMargin",vVarApp.OleFunction("InchesToPoints",0.393700787401575));
v.OlePropertySet("BottomMargin",vVarApp.OleFunction("InchesToPoints",0.393700787401575));
v.OlePropertySet("RightMargin",vVarApp.OleFunction("InchesToPoints",0.393700787401575));
v.OlePropertySet("HeaderMargin",vVarApp.OleFunction("InchesToPoints",0.393700787401575));
v.OlePropertySet("FooterMargin",vVarApp.OleFunction("InchesToPoints",0.393700787401575));

1.21 Защита книги и страницы

Защитить книгу

Данный пример демонстрирует установку защиты от внесения изменений в документ.

Variant v=vVarApp.OlePropertyGet("Workbooks").OlePropertyGet("Item",1);
v.OlePropertySet("WritePassword","mypassword1");
v.OlePropertySet("ReadOnlyRecommended",false);
vVarApp.OlePropertyGet("Workbooks").
   OlePropertyGet("Item",1).OleProcedure("SaveAs",vasS.c_str());

Используя вместо WritePassword (или дополнительно с ним) просто Password (OlePropertySet("Password","mypassword1")) будет установлена защита на доступ к книге.

Снять защиту книги

Метод Open OLE объекта Excel имеет много параметров, среди которых нас интересует Password - пароль на доступ к документу и WriteResPassword - пароль разрешения внесения изменений в документ.

VARIANT Open(VARIANT Filename, VARIANT UpdateLinks, VARIANT ReadOnly,
 VARIANT Format, VARIANT Password,
  VARIANT WriteResPassword,
   VARIANT IgnoreReadOnlyRecommended,
    VARIANT Origin, VARIANT Delimiter,
     VARIANT Editable, VARIANT Notify, VARIANT Converter );

Снять защиту с книги - это значит открыть ее с установленными паролями. Следущий код снимает защиту от запрета внесения изменений в документ (без его использования можно открыть книгу только для чтения).

vVarBooks.OleProcedure("Open",vasPath.c_str(),0,FALSE,1,"","mypassword1",FALSE);

Защитить страницы

vVarSheets=vVarBook.OlePropertyGet("Worksheets") ;
vVarSheet=vVarSheets.OlePropertyGet("Item",1);
vVarSheet.OleProcedure("Activate");

//Макрос установки защиты для ориентации о том, какие можно 
//установить  разрешения на действия на защищенном листе 
//см. Меню Excel Сервис/Защита/Защитить лист
//ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
//False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
//AllowFormattingRows:=True, AllowInsertingColumns:=True, 
//AllowInsertingRows _:=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
//AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
//AllowUsingPivotTables:=True

//Из параметров - все, что разрешено в примере
//DrawingObjects:=True, Contents:=True
vVarBook.OlePropertyGet("ActiveSheet").OleProcedure("Protect","mypassword1",True,True);
vVarSheet=vVarSheets.OlePropertyGet("Item",2);
vVarSheet.OleProcedure("Activate");
vVarBook.OlePropertyGet("ActiveSheet").OleProcedure("Protect","mypassword2",True,True);

Снять защиту страниц

vVarSheet=vVarBook.OlePropertyGet("Worksheets",2);
vVarSheet.OleProcedure("Activate");
vVarBook.OlePropertyGet("ActiveSheet").OleProcedure("Unprotect","mypassword2");
vVarSheet=vVarBook.OlePropertyGet("Worksheets",1);
vVarSheet.OleProcedure("Activate");
vVarBook.OlePropertyGet("ActiveSheet").OleProcedure("Unprotect","mypassword1");


В начало

1.22 Использование информационных рисунков в Excel

Этим материалом поделился с Вами Владимир Гундарцев (gundartsev-v@yandex.ru). Материал печатается в изложении его автора.

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

Идея: В ячейке хранится сразу три картинки (стрелка вверх, стрелка вниз, нейтраль). Только одна картинка имеет свойство 'Visisble' равное true, остальные не видны. Таким образом, чтобы показать измение цены, изменяем только свойства Visible.

Подход: Хранить указатели на картинки в STL контейнере, чтобы иметь простой доступ к ним по имени символа.

ole_1_10.jpg

enum   PICTURE_ARROW   {NEUTRAL, UP, DOWN};
....
//WideString - name of symbol,  Ex_Arr - объект, где хранятся указатели на картинки
map m_Symbol_Arrow;              
// We are working with Unicodes
map::iterator m_It_Symbol_Index;
...
struct Ex_Arr 
{
 Variant arrows[3];
 int     visible;  // only one arrow can be visible NEUTRAL, UP, DOWN
 void new_visible(int type) 
 {
  // make invisible actual arrow
  arrows[visible].OlePropertySet("Visible", false);	
  // update visibility flag
  visible = type;                                                        
  //  make visible a new arrow
  arrows[visible].OlePropertySet("Visible", true);         
 }
 // set all arrow as visible, it is necessary if we want to move cell(s)
 void set(void) 
 {					
  for (int i = 0; i < 3; i ++)				
   // because if a picture is invisible then it is not moved !!!
   if (visible != i)
       arrows[i].OlePropertySet("Visible", true);
 }
 // restoring old status (after moving)
 void restore(void) 
 {					
  for (int i = 0; i < 3; i ++)
   if (visible != i)
     arrows[i].OlePropertySet("Visible", false);
 }
 void erase(void) 
 {
  for (int i = 0; i < 3; i ++)
   arrows[i].OleProcedure("Delete");
 }
};

....
// for example
xlSheet = xlWorkbook.OlePropertyGet("ActiveSheet");
xlShapes   = xlSheet.OlePropertyGet("Shapes");
xlPictures  = xlSheet.OlePropertyGet("Pictures");

...

void TExcel_Class::ChangeArrow
 (int type, WideString symbol, String range)
{
 try 
 {
  Ex_Arr ea;
  m_It_Symbol_Index = m_Symbol_Arrow.find(symbol);
  if (m_It_Symbol_Index == m_Symbol_Arrow.end()) 
  { // first entry, there is no arrows in this cell !
   int     count;
   String insert0   = GetCurrentDir() + "\\Work_Files\\images\\";
   String insert;
   xlSheet.OlePropertyGet("Range", range.c_str()).OleProcedure("Select");
   insert = insert0 + "green_arrow.bmp";
   xlPictures.OleProcedure("Insert", insert.c_str());
   count = xlShapes.OlePropertyGet("Count");
   ea.arrows[UP] = xlShapes.OleFunction("Item", count);
   insert = insert0 + "red_arrow.bmp";
   xlPictures.OleProcedure("Insert", insert.c_str());
   ea.arrows[DOWN] = xlShapes.OleFunction("Item", ++ count);
   insert = insert0 + "no_change.bmp";
   xlPictures.OleProcedure("Insert", insert.c_str());
   ea.arrows[NEUTRAL] = xlShapes.OleFunction("Item", ++ count);
   ea.visible = NEUTRAL;
   ea.arrows[UP].OlePropertySet("Visible", false);
   ea.arrows[DOWN].OlePropertySet("Visible", false);
   // first set of three arrows are set to Excel cell, 
   //now we put the object to map container
   m_Symbol_Arrow.insert(make_pair(symbol, ea));
  } 
  else 
  {// what we need is only to change the visible status of a picture
   Ex_Arr *p_ea = &m_It_Symbol_Index->second;
   if (p_ea->visible != type)
     p_ea->new_visible(type);
  }
 } catch (Exception& err) {
 Error_Handler->TakeError(err.Message + "TExcel_Class::ChangeArrow");
} catch (...) 
{
 Error_Handler->TakeError("... TExcel_Class::ChangeArrow");
}
}


В начало

1.23 Работа с закладками

Этот материал прислал специально для сайта Москальченко В.А. (moskalchenko@kubkredit.com.ru). Он же сообщил, что решение взято на форуме ProgZ.ru и принадлежит участнику форума Rius.

AnsiString BoolMarkName = "www";
Variant Selection = word.OlePropertyGet("Selection");
Selection.OleFunction("GoTo", 4294967295, 0, 0, BookmarkName.c_str());
//4294967295 значение wdGoToBookmark из MSWORD.IDL


В начало

1.24 Запустить макрос

Частый вопрос на тему, как можно запустить именованный макрос, который хранится в книге - привел к тому, что был добавлен этот параграф из одной строчки кода (хотя ответ, без труда, можно найти на любом форуме):

vVarApp.OleProcedure("Run","Имя макроса");


В начало

1.25 Вместо заключения

Богатства возможностей по управлению серверами автоматизации просто потрясает, так как нет ни одного действия, которое можно было бы выполнить в автономно запущенном приложении и которое бы не было доступно для контроллера автоматизации. К сожалению каждое действие, которое требуется выполнить, при программировании контроллеоа в среде "Borland C++ Builder", даже при применении описанного выше "хитрого" метода, порой выполняется с большой затратой времени, но, как поется в песне: "..если долго мучиться, что-нибудь получится!..". Отправные шаги сделаны. Дерзаем далее.

Еcли Вы пришли с поискового сервера - посетите мою главную страничку

На главной странице Вы найдете программы комплекса Veles - программы для автолюбителей, программы из раздела графика - программы для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks - игрушку для детей и взрослых, программу записную книжку, программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ Builder, C# (Windows приложения и ASP.Net Web сайты).

В начало

Введение

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

Пример программы управления OLE сервером Word


Домой



Сайт управляется системой uCoz