Поставим целью из приложения (контроллера автоматизации) создать документ, изображенный на Рис 1.1. Он типичен с точки зрения созданя прикладных программ, использующих для вывода информации Excel и содержит три наиболее часто используемых составных элемента: текстовое поле, электронную таблицу и диаграмму. Путь создания данного документа - это шаги, которые позволят освоить работу с OLE сервером Excel.
Рис 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. Включить в проект модули:
#include <ComObj.hpp> #include <utilcls.h>
2. Определить - лучше глобально (для наглядности и удобства) - переменные,
отражающие иерархию объектов Excel
Приложение->Набор
книг->Книга->Набор страниц->Страница->ячейки(ячейка):
Variant vVarApp,vVarBooks,vVarBook,vVarSheets, vVarSheet,vVarCells,vVarCell;
3. создать объект автоматизации:
vVarApp=CreateOleObject("Excel.Application");
Можно видеть у отдельных авторов в некоторых примерах конструкцию вида Excel.Application.9 и т.п. , что не является обязательным, а скорее всего и вредным - ориентация будет на конкретную библиотеку *.olb. Без указания версии Offise приложение берет ее из реестра (HREY_CLASSES_ROOT раздел Word.Application ключ CurVer, там можно прочитать Excel.Application.8 или Excel.Application.9 или ...).
С этого момента можно пользоваться свойствами и методами созданного ole сервера, а именно:
Установка свойства.
vVarApp.OlePropertySet("имя", значение);
Чтение значения свойства.
переменная = app.OlePropertyGet("имя");
Вызов метода:
vVarApp.OleProcedure("имя",список параметров метода);
Список интерфейсов и констант в 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). с описанием всех использованных констант, а также свойств и методов содержащихся в сервере объектов.
Рис 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. Запустить Ехель.
2. Сервис/Maкрос/Начать запись
3. Выполннить последовательность нужных действий.
4. Остановить запись
5. Вызвать Visual Basic (Alt+F11)
6. Tools/Macros/Edit
7. Перевести код из кода Visual Basic в С++.
Рассмотрим создание двух рабочих книг из 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. Взять лист.
vVarSheet=vVarSheets.OlePropertyGet("Item",1);
2. Выбрать ячейку или группу ячеек на выбранном листе. Для отдельной ячейки (x и y координаты ячейки):
vVarCell=vVarSheet.OlePropertyGet("Cells"). OlePropertyGet("Item",x,y);
Для группы ячеек:
vVarCell=vVarSheet.OlePropertyGet("Range","A1:C4"); vVarCell.OleProcedure("Merge");
3. Установить режим выравнивания текста в ячейке (ячейках).
vVarCell.OlePropertySet("HorizontalAlignment",-4108); vVarCell.OlePropertySet("VerticalAlignment",-4108);
Выравнивание текста - вертикальное - Константы
xlHAlignCenter -4108
xlHAlignCenterAcrossSelection 7
xlHAlignDistributed -4117
xlHAlignFill 5
xlHAlignGeneral 1
xlHAlignJustify -4130
xlHAlignLeft -4131
xlHAlignRight -4152
Выравнивание текста - горизонтальное - Константы
xlVAlignBottom = -4107
xlVAlignCenter = -4108
xlVAlignDistributed = -4117
xlVAlignJustify = -4130
xlVAlignTop = -4160
4. Установить размер шрифта.
vVarCell.OlePropertyGet("Font").OlePropertySet("Size",15);
5. Установить цвет шрифта ячейки.
vVarCell.OlePropertyGet("Font").OlePropertySet("Color",clBlue);
6. Установить стиль шрифта ячейки.
//Жирный vVarCell.OlePropertyGet("Font"). OlePropertySet("Bold",true); //Курсив vVarCell.OlePropertyGet("Font"). OlePropertySet("Italic",true); //Зачеркнутый vVarCell.OlePropertyGet("Font"). OlePropertySet("Strikethrough",true); //Верхний индекс vVarCell.OlePropertyGet("Font"). OlePropertySet("Superscript",true); //Нижний индекс vVarCell.OlePropertyGet("Font"). OlePropertySet("Subscript",true); //Без линий vVarCell.OlePropertyGet("Font"). OlePropertySet("OutlineFont",true); //C тенью vVarCell.OlePropertyGet("Font"). OlePropertySet("Shadow",true); //Подчеркнутое одинарной линией по значению vVarCell.OlePropertyGet("Font"). OlePropertySet("Underline",2); //Подчеркнутое двойной линией по значению vVarCell.OlePropertyGet("Font"). OlePropertySet("Underline",-4119); //Подчеркнутое одинарной линией по ячейке vVarCell.OlePropertyGet("Font"). OlePropertySet("Underline",4); //Подчеркнутое двойной линией по значению vVarCell.OlePropertyGet("Font"). OlePropertySet("Underline",5);
Здесь значение констант:
xlUnderlineStyleDouble = -4119,
xlUnderlineStyleDoubleAccounting = 5,
xlUnderlineStyleNone = -4142,
xlUnderlineStyleSingle = 2,
xlUnderlineStyleSingleAccounting = 4
7. Установить имя шрифта ячейки.
vVarCell.OlePropertyGet("Font").OlePropertySet("Name","Arial");
8. Установить заливку ячейки (если необходимо).
vVarCell.OlePropertyGet("Interior"). OlePropertySet("ColorIndex",35);
9. Установить значение данных.
vVarCell.OlePropertySet("Value","Мой текст"); vVarCell.OlePropertySet("Value",25);
10. Вписать формулы аналогично данным.
vVarCell.OlePropertySet("Value","=СУММ(A1:A10)");
11. Если необходимо установить размер ячеек.
vVarCell.OlePropertySet("RowHeight", 20); vVarCell.OlePropertySet("ColumnWidth",10);
12. Если необходимо изменить ориентацию текста.
vVarCell.OlePropertySet("Orientation",90);
Аналогично как и при заполнении таблицы рамка рисуется для выбранной ячейки или объединенной группы ячеек.
Шаги рисования рамки:
1. Взять лист.
vVarSheet=vVarSheets.OlePropertyGet("Item",1);
2. Выбрать ячейку или группу ячеек на выбранном листе. Для отдельной ячейки (x и y координаты ячейки):
vVarCell=vVarSheet.OlePropertyGet("Cells"). OlePropertyGet("Item",x,y);
Для группы ячеек:
vVarCell=vVarSheet.OlePropertyGet("Range","A1:C4"); vVarCell.OleProcedure("Merge");
3. Задать шрифт для текста, выравнивание и заливку как показано в предыдущем параграфе.
4. Установить рамку вокруг выбранных ячеек проведением линий с выбранной стороны (Borders) с указанием стиля линии (LineStyle) толщины (Weight) и цвета линии(ColorIndex).
vVarCell.OlePropertyGet("Borders",10). OlePropertySet("LineStyle",1); vVarCell.OlePropertyGet("Borders",10). OlePropertySet("Weight",4); vVarCell.OlePropertyGet("Borders",10). OlePropertySet("ColorIndex",46);
Константы, определяющие где проводить линию:
xlInsideHorizontal 12
xlInsideVertical 11
xlDiagonalDown 5
xlDiagonalUp 6
xlEdgeBottom 9
xlEdgeLeft 7
xlEdgeRight 10
xlEdgeTop 8
Константы стиля линии
xlContinuous 1
xlDash -4115
xlDashDot 4
xlDashDotDot 5
xlDot -4118
xlDouble -4119
xlSlantDashDot 13
xlLineStyleNone -4142
Толщина линии
xlHairline 1
xlMedium -4138
xlThick 4
xlThin 2
Таким образом для обрамления с 4х сторон ячейки или группы ячеек надо приведенные выше 3 строки кода повторить 4 раза (для каждой стороны).
5. Если необходимо установить размер ячеек.
vVarCell.OlePropertySet("RowHeight", 20); vVarCell.OlePropertySet("ColumnWidth",10);
6. Написать текст для отображения в рамке.
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");
Результат данного этапа показан на рисунке 1.3
Рис 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; } } //--------------------------------------------------------
Для отображения данных листа на диаграмме необходимо выделить эти данные, переменной 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 листа сразу же отобразится на диаграмме.
Рис 1.4 Вставка диаграммы по умолчанию.
Диаграмма вставлена перед "Желтым листом", т.е. перед тем листом, для которого и создается диаграмма, и это не всегда удобно. Ставим целью переместить диаграмму на лист с таблицей. Добавим следующий код к коду в Button3Click:
vVarBook.OlePropertyGet("ActiveChart"). OleProcedure("Location",2,"Желтый лист");
Здесь можно использовать константы:
xlLocationAsNewSheet = 1;
xlLocationAsObject = 2;
xlLocationAutomatic = 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);
Изменение типа диаграммы связано с изменением свойства - ChartType. До этого работа осуществлялась с диаграммой по умолчанию (Рис. 1.5).
Рис 1.5 Диаграмма по умолчанию.
vVarBook.OlePropertyGet("ActiveChart"). OlePropertySet("ChartType",52);
В результате тип диаграммы изменится на один из типов, определяемых множеством констант:
xlColumnClustered = 51,
xlColumnStacked = 52,
xlColumnStacked100 = 53,
xl3DColumnClustered = 54,
xl3DColumnStacked = 55,
xl3DColumnStacked100 = 56,
и т.д.
И еще порядка 70 типов диаграмм. Полный перечень в указанных выше библиотеках.
Продолжаем дописывать код - задаем имя диаграмме.
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):
xlHorizontal = -4128;
xlVertical = -4166.
Толщина линии для вызова OlePropertySet("Weight",2);
xlHairline 1
xlMedium -4138
xlThick 4
xlThin 2
Константы стиля линии для вызова OlePropertySet("LineStyle", xlContinuous):
xlContinuous 1
xlDash -4115
xlDashDot 4
xlDashDotDot 5
xlDot -4118
xlDouble -4119
xlSlantDashDot 13
xlLineStyleNone -4142
Константы выравнивания текста для вызова
xlHAlignCenter -4108
xlHAlignCenterAcrossSelection 7
xlHAlignDistributed -4117
xlHAlignFill 5
xlHAlignGeneral 1
xlHAlignJustify -4130
xlHAlignLeft -4131
xlHAlignRight -4152
Константа xlTransparent для вызова OlePropertySet("Background",xlTransparent) равна 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","Число");
Для доступа к свойствам диаграммы используется вызовы:
OlePropertyGet("Axes",xlCategory, xlPrimary). OlePropertyGet("Axes",xlValue, xlPrimary).
Другие константы этого вызова:
typedef enum tagXlAxisType:
xlCategory = 1, //по оси х
xlValue = 2 //по оси y
typedef enum tagXlAxisGroup:
xlPrimary = 1,
xlSecondary = 2
//Сетка мелкая 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
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);
xlBottom = -4107;
xlLeft = -4131;
xlRight = -4152;
xlTop = -4160.
Рамка рисуется аналогично рисованию рамки при создании таблиц и используются теже константы.
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)
xlHairline 1
xlMedium -4138
xlThick 4
xlThin 2
Константы стиля линии(LineStyle)
xlContinuous 1
xlDash -4115
xlDashDot 4
xlDashDotDot 5
xlDot -4118
xlDouble -4119
xlSlantDashDot 13
xlLineStyleNone -4142
Здесь требуется удалить практически строку данных, которая до сих пор использовалась как основа для формирования расположения точек графика по оси x. Данные хранятся в чвойстве SeriesCollection.
vVarBook.OlePropertyGet("ActiveChart"). OlePropertyGet("SeriesCollection",1). OleProcedure("Delete");
Удалим лишнюю информацию с диаграммы строку с цифрами 1,2,3,4,5,6,7.
vVarBook.OlePropertyGet("ActiveChart"). OlePropertyGet("SeriesCollection",1). OleProcedure("Delete");
Это далеко не весь перечень возможностей по изменению вида и цвета диаграмм и т.д. Для продолжения изучения здесь особенно подходит так называемый "хитрый метод". Но, в принципе, представленной информации должно хватить для создания большинства практических задач. Осталось только запомнить данные в файле и на экране результат работы - Рис 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.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");
Для того, чтобы просмотреть все возможные режима отображения создадим новое приложение (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); } //--------------------------------------------------
Значения констант:
xlMinimized -4140
xlMaximized -4137
xlNormal -4143
Прежде чем изменять размер приложения необходимо выключить полноэкранный режим и затем уже выставить размеры. В предыдущем примере заменяем обработчик события 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 принимать установленные размеры.
Для управления панелями инструментов используется свойство "CommandBars" и имена панелей, которые необходимо отобразить или скрыть.
Standard
Formatting
Visual Basic
Web
WordArt
Clipboard
External Data
Exit Design Mode
Stop Recording
Chart
Picture
Reviewing
Drawing
PivotTable
Forms
Control Toolbox
В предыдущем примере заменяем обработчик события 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 будем видеть появление и удаление указанной в вызове панели.
Следующий пример изменяет масштаб документа по 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); }
vVarApp.OlePropertyGet("ActiveWindow"). OlePropertySet("DisplayHeadings",false); vVarApp.OlePropertyGet("ActiveWindow"). OlePropertySet("DisplayHeadings",true);
Создаем две книги из 2х и 3х листов и при нажатии кнопок будем менять расположение как на рисунке.
Рис 1.6 Расположение книг.
Константы для изменения расположения окон.
xlCascade = 7;
xlTiled = 1;
xlHorizontal = -4128;
xlVertical = -4166.
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.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); }
Этот параграф добавлен 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.xls, в который предварительно запишем информацию, показанную на Рис.1.8.
Рис 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
Рис 1.9 Файл xls после автозаполнения
Параграф добавлен по просьбам трудящихся 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.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();
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));
Данный пример демонстрирует установку защиты от внесения изменений в документ.
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");
Этим материалом поделился с Вами Владимир Гундарцев (gundartsev-v@yandex.ru). Материал печатается в изложении его автора.
Задача: Есть поток финансовой информации в реальном времени (например цены на акции, курсы валют, объемы продаж товаров...). Нужно сделать так, чтобы при изменении цен (выросла, упала, осталась прежней), соответствующая картинка (стрелка вверх, стрелка вниз, нейтраль) появлялась рядом со значением цены в ячейке. Ячеек может быть сколь угодно много.
Идея: В ячейке хранится сразу три картинки (стрелка вверх, стрелка вниз, нейтраль). Только одна картинка имеет свойство 'Visisble' равное true, остальные не видны. Таким образом, чтобы показать измение цены, изменяем только свойства Visible.
Подход: Хранить указатели на картинки в STL контейнере, чтобы иметь простой доступ к ним по имени символа.
enum PICTURE_ARROW {NEUTRAL, UP, DOWN}; .... //WideString - name of symbol, Ex_Arr - объект, где хранятся указатели на картинки mapm_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"); } }
Этот материал прислал специально для сайта Москальченко В.А. (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
Частый вопрос на тему, как можно запустить именованный макрос, который хранится в книге - привел к тому, что был добавлен этот параграф из одной строчки кода (хотя ответ, без труда, можно найти на любом форуме):
vVarApp.OleProcedure("Run","Имя макроса");
Богатства возможностей по управлению серверами автоматизации просто
потрясает, так как нет ни одного действия, которое можно было бы выполнить в
автономно запущенном приложении и которое бы не было доступно для контроллера
автоматизации. К сожалению каждое действие, которое требуется выполнить, при
программировании контроллеоа в среде "Borland C++ Builder", даже при применении
описанного выше "хитрого" метода, порой выполняется с большой затратой времени,
но, как поется в песне: "..если долго мучиться, что-нибудь получится!..".
Отправные шаги сделаны. Дерзаем далее.
На главной странице Вы найдете программы комплекса Veles - программы для автолюбителей, программы из раздела графика - программы для работы с фото, сделанными цифровым фотоаппаратом, программу Bricks - игрушку для детей и взрослых, программу записную книжку, программу TellMe - говорящий Русско-Английский разговорник - программу для тех, кто собирается погостить за бугром или повысить свои знания в английском, теоретический материал по программированию в среде Borland C++ Builder, C# (Windows приложения и ASP.Net Web сайты).
Пример программы управления OLE сервером Word