Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

Автоматизация Microsoft Excel - продолжение
<< предыдущая страница    

Переходим, собственно, к автоматизации

При программировании "автоматизирующих" приложений вы часто будете использовать тип данных Variant. Этот тип данных позволяет работать со всеми объектами сервера автоматизации при помощи функций OlePropertyGet, OlePropertySet и OleProcedure. OlePropertyGet принимает строку в качестве параметра и возвращает данные, содержащиеся в указанном свойстве объекта. OlePropertySet принимает несколько параметров, первый из которых - строка, указывающая на изменяемое свойство, а последующие параметры - данные, которые будут записаны в это свойство. OleProcedure выполняет указанный метод объекта. Чтобы эти функции стали более понятны вам, представьте, что строка

var1 = var2.OlePropertyGet("Prop1");

равносильна

var1 = var2 -> Prop1;

Аналогично,

var1.OlePropertySet("Prop1", Value)
=
var1 -> Prop1 = Value
var1.OleProcedure("Fun1")
=
var1 -> Fun1()

Итак,

Variant app, ws;
app = CreateOleObject("Excel.Application");
app.OlePropertySet("Visible", true);
app.OlePropertyGet("Workbooks").OleProcedure("Add");
ws = app.OlePropertyGet("Worksheets").OlePropertyGet("Item",1);


Ну вот, 5 строчек кода. 5 сточек кода, которые запустили Microsoft Excel и добавили рабочую книгу с тремя листами. Этот фрагмент можно использовать как шаблон для написания ваших собственных программ. Во второй строке мы создаем объект Excel.Application, представляющий, собственно, приложение Microsoft Excel. Третья строка делает его видимым. В четвертой добавляется рабочая книга (содержащая, по умолчанию, три листа). И, наконец, в пятой строке мы получаем указатель на первый лист, с которым будем впоследствии работать.

Что мы забыли? Вы, вероятно, разочаровались, создав проект и набрав эти строки в обработчике нажатия какой-нибудь кнопки, откомпилировали проект и получили сообщения об ошибке? Конечно, мы же забыли включить заголовочный файл, который позволит работать нам с автоматизируемыми объектами. В 5-м C++Builder'е это файл utilcls.h, в более ранних (если верить статьям Н.Елмановой) - comobj.hpp - экспериментируйте.

А теперь создадим что-нибудь полезное и большое - то, что может пригодиться в рельной задаче и что поближе познакомит вас с иерархией объектов Microsoft Excel. Задачу сфорулируем так: пусть имеется таблица, содержащая информацию о товарах (наименование, единица измерения, цена), а нам нужно создать на ее основе прайс-лист фирмы. Мне нравится работать с таблицам с помощью TQuery, если хотите изменить его на TTable - пожалуйста, поменять нужно всего пару строк. Итак, сначала фрагмент - потом объяснения:

void __fastcall TForm1::Button1Click(TObject *Sender)
{ // -- 1
const int xlAlignCenter = -4108;
Variant app, ws, range;
int Row; // -- 2 app = CreateOleObject("Excel.Application"); app.OlePropertySet("Visible", true); app.OlePropertySet("SheetsInNewWorkbook", 1); app.OlePropertyGet("Workbooks").OleProcedure("Add"); ws = app.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1); // -- 3 ws.OlePropertySet("Name", "Прайс-лист"); // -- 4 ws.OlePropertyGet("Columns").OlePropertyGet("Item",1). OlePropertySet("ColumnWidth", 30); // -- 5 range = ws.OlePropertyGet("Range", "A1:C1"); range.OleProcedure("Merge"); range.OlePropertySet("Value", "Прайс-лист нашей фирмы"); range.OlePropertyGet("Font").OlePropertySet("Size", 12); range.OlePropertyGet("Font").OlePropertySet("Bold", true); range.OlePropertySet("HorizontalAlignment", xlAlignCenter); range.OlePropertySet("VerticalAlignment", xlAlignCenter); range.OlePropertySet("RowHeight", 30); // -- 6 ws.OlePropertyGet("Cells"). OlePropertyGet("Item", 2, 1). OlePropertySet("Value", "Наименование товара"); ws.OlePropertyGet("Cells"). OlePropertyGet("Item", 2, 2). OlePropertySet("Value", "Ед.изм."); ws.OlePropertyGet("Cells"). OlePropertyGet("Item", 2, 3). OlePropertySet("Value", "Цена"); range = ws.OlePropertyGet("Range", "A2:C2"); range.OlePropertyGet("Interior").OlePropertySet("Color", 0xC0C0C0); range.OlePropertySet("HorizontalAlignment", xlAlignCenter); // -- 7 Row = 3; qryPrice -> Close(); qryPrice -> SQL -> Clear(); qryPrice -> SQL -> Add("Select Name,Measure,Price from tblPrice order by Name"); qryPrice -> Open(); // -- 8 while(!qryPrice -> Eof) { ws.OlePropertyGet("Cells"). OlePropertyGet("Item", Row, 1). OlePropertySet("Value", qryPrice -> FieldByName("Name") -> AsString); ws.OlePropertyGet("Cells"). OlePropertyGet("Item", Row, 2). OlePropertySet("Value", qryPrice -> FieldByName("Measure") -> AsString); ws.OlePropertyGet("Cells"). OlePropertyGet("Item", Row, 3). OlePropertySet("Value", qryPrice -> FieldValues["Price"]); qryPrice -> Next(); Row++; } // -- 9 range = ws.OlePropertyGet("Range", "A2:C"+IntToStr(Row-1)); range.OlePropertyGet("Font").OlePropertySet("Name", "Verdana"); range.OlePropertyGet("Font").OlePropertySet("Size", 8); // -- 10 for (int i=1; i<=4; i++) range.OlePropertyGet("Borders"). OlePropertyGet("Item", i). OlePropertySet("LineStyle", 1); // -- 11 ws.OlePropertyGet("Range", "C3:C"+IntToStr(Row-1)). OlePropertySet("NumberFormat", "# ##0.00р."); // -- 12 app.OlePropertySet("DisplayAlerts", false); app.OlePropertyGet("Workbooks").OlePropertyGet("Item", 1). OleProcedure("SaveAs", "price.xls"); // app.OleProcedure("Quit"); }

Блок 1 - объявления переменных и констант. Константа xlAlignCenter будет использоваться при задании выравнивания в ячейках, переменные
app - содержит указатель на объект приложения;
ws - указатель на рабочий лист;
range - указатель на подмножество ячеек;
Row - текущая строка, куда выводится информация.

Блок 2 совпадает с приведенным выше шаблоном за исключением установки свойства SheetsInNewWorkbook в 1, что задает количество листов в создаваемой книге.

Блок 3 задает имя рабочему листу.

Блок 4 устанавливает ширину первого столбца ("А"), равную 30. Остальные столбцы остаются без изменений.

В блоке 5 выводится название отчета - "Прайс-лист нашей фирмы" в ячейку, образованную слиянием трех первых ячеек первой строки листа. В получившейся ячейке устанавливается специфичный размер шрифта и выравнивание, а также задается высота строки.

В блоке 6 создается шапка прайс-листа - выводятся заголовки колонок, фон этих ячеек меняется на серый и снова выравнивание посередине.

Блок 7 инициализирует цикл вывода данных. Текущая строка становится 3 (так как именно с нее мы начинаем выводить данные из таблицы), инициализируется и открывается запрос.

Блок 8 - происходит вывод данных из таблицы на рабочий лист.

Последующие блоки просто форматируют уже полученную информацию. Блок 9 задает шрифт всего прайс-листа. Блок 10 очерчивает каждую ячейку линией. Дело в том, что рамка ячейки представляется четырьмя объектами - левая, правая, верхняя, нижняя рамка. Мы прочерчиваем их все. В блоке 11 задается формат, используемый при выводе цен - округление до двух знаков, пробел между тысячами, "р." после числа. В блоке 12 рабочая книга сохраняется в рабочем каталоге программы под именем price.xls. Уберите символы комментариев, если вам нужно, чтобы Excel закрывался после сохранения файла на диске. В приведенном случае Excel остается открытым, так что можно полюбоваться результатами своей (лучше сказать моей) работы.

Возможные ошибки

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

- если программа не компилируется, убедитесь, что вы включили строку

#include <utilcls.h>

или

#include <comobj.hpp>.

- если сервер не выполняет какие-либо действия, а программа выдает что-нибудь типа "Unknown name" ("Неизвестное имя"), то, скорее всего, вы используете свойство или метод, не поддерживаемые данным объектом.

- если сервер не выполняет какие-либо действия, а программа выдает что-нибудь типа "Exception occured" ("Возникло исключение"), то, скорее всего, где-то что-то вы неправильно указали в качестве параметра функции (либо передали данные неправильного типа, либо передали параметры там, где они не нужны, либо не передали там, где нужны) или неверные данные присваиваете свойству.

Использованные источники, литература и т.п.

Рунет не очень-то богат материалами, посвященными автоматизации, OLE и COM. Очень помогли статьи Н.Елмановой на http://www.citforum.ru/ . Больше, кроме кратких, некоментированных фрагментов в различных форумах, я ничего и не нашел. Особенно тяжело с материалами по C++Builder. В качестве базы хорошо почитать (хотя бы первые две-три главы) очень хорошую книжку Inside OLE в библиотеке MSDN http://msdn.microsoft.com/ . Информация об иерархии объектов почерпнута из уже упоминавшегося файла помощи VBAXL8.HLP, а также опять-таки с сервера MSDN. В поставку пятого C++Builder'а входят заголовочные файлы всех продуктов MS Office (для Excel это excel_xx_srvr.h, где xx-номер версии MS Office), но изучать их тяжело (большие они, да и неудобно ненаметанным глазом там что-нибудь высмотреть), легче воспользоваться библиотекой типов Excel8.Olb, лежащей в каталоге (по умолчанию) C:PROGRAM FILESMICROSOFT OFFICEOFFICE.

Удачного программирования!

<< предыдущая страница    


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте