Скачиваний:
49
Добавлен:
28.06.2014
Размер:
282.62 Кб
Скачать

Работа с сервером Excel

При создании нового документа в Excel (рабочая книга) из совокупности библиотек выбираются объекты, которые составляют каркас документа. Эти объекты доступны программисту.

Объект ExcelApplication задает приложение Excel, его свойства, методы и события характеризуют приложение в целом. Одно из свойств (Workbooks) возвращает все открытые в приложении рабочие книги.

Объект ExcelWorkbook задает рабочую книгу и имеет в свою очередь свойство Worksheets – все рабочие листы книги.

Объект Worksheet – это конкретный лист рабочей книги.

    1. Установка связи с объектом

В библиотеке VCL имеются специальные компоненты, представляющие объекты Excel в приложении Builder C++. При проектировании приложения необходимо разместить на форме пиктограммы желаемых компонент, а для установки связи с объектами использовать метод Connect(). Вот несколько примеров такой связи:

  • Установить связь с Excel

ExcelApplication1->Connect();

  • Установить связь с активной рабочей книгой

ExcelWorkbook1-> ConnectTo (ExcelApplication1->ActiveWorkbook);

  • Установить связь с активным листом

ExcelWorksheet1 -> ConnectTo ( ExcelWorkbook1->ActiveSheet);

  • Получить лист, следующий за ExcelWorksheet1, и установить связь с ним

ExcelWorksheet2 -> ConnectTo (ExcelWorksheet1 -> get_Next());

Окно Excel станет видимым (или невидимым, если параметр равен false) только после вызова специального метода:

#define lcid LOCALE_SYSTEM_DEFAULT

ExcelApplication1->set_Visible(lcid,true);

Для вызова некоторых методов и свойств используется специальная константа LOCALE_SYSTEM_DEFAULT (lcid), ее значение равно 0.

Количество рабочих книг, открытых в приложении, и число рабочих листов в книге можно определить так:

int n= ExcelApplication1-> Workbooks-> Count;

Label1->Caption=(AnsiString) n;

n= ExcelWorkbook1-> Worksheets->Count;

Label2->Caption=(AnsiString) n;

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

WideString filename="d:/work.xls";

ExcelApplication1->Workbooks->Open(filename);

Для сохранения рабочей книги используется метод Save:

ExcelWorkbook1->Save(lcid);

Можно добавить новую рабочую книгу и установить с ней связь.

ExcelApplication1->Workbooks -> Add();

ExcelWorkbook3-> ConnectTo ( ExcelApplication1->ActiveWorkbook);

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

ExcelWorkbook1->set_Author(0,TVariant("Павлов Иван Петрович"));

Label1->Caption=ExcelWorkbook1->get_Author(lcid);

Сделать рабочий лист активным:

ExcelWorksheet2 ->Activate (lcid);

Можно установить новое имя листа:

ExcelWorksheet1->set_Name((TVariant)"MyList");

Label6->Caption=(AnsiString)ExcelWorksheet1->Name;

    1. Работа с ячейками таблицы

Запись значения в активную ячейку

ExcelApplication1->ActiveCell->set_Value((TVariant)"a");

Можно выделить указанную ячейку (например “D1”) и сделать ее активной:

ExcelWorksheet2 -> get_Range ((TVariant)"D1",(TVariant)"D1") -> Select();

ExcelApplication1->get_ActiveCell() -> set_Value((TVariant)"888");

Массив ячеек

В Excel предусмотрено обращение к ячейкам таблицы как к элементам двумерного массива Cells(<номер строки>,<номер столбца>). В Builder C++ сначала нужно получить доступ к этому массиву, вызвав метод get_Cells(), а затем метод set_Item(<номер строки>, <номер столбца>, <значение>) запишет заданное значение в элемент с указанными индексами. Все параметры перед передачей серверу должны быть упакованы в особый формат TVariant.

Например,

  • - число 222 записывается в ячейку с номерами (1,1):

ExcelWorksheet2 -> get_Cells()-> set_Item((TVariant)1,(TVariant)1,(TVariant)"222");

  • - формула записывается в ячейку (2,2):

ExcelWorksheet2 -> get_Cells()-> set_Item((TVariant)2,(TVariant)2,(TVariant)"=A1+D1");

  • для записи формул можно использовать функции:

ExcelWorksheet2 -> get_Cells()-> set_Item((TVariant)5,(TVariant)1,(TVariant)"=СУММА(A1:A3");

Запись в цикле:

int i, j;

TVariant k;

for (i=0; i<3; i++)

for (j=0; j<4; j++)

{ k=(TVariant)(i+j);

ExcelWorksheet2 -> get_Cells()-> set_Item((TVariant)(i+1),(TVariant)(j+1),k);

}

Извлечение из ячейки:

k= (TVariant)ExcelWorksheet2 -> get_Cells()-> get_Item((TVariant)1,(TVariant)4);

ExcelWorksheet2 -> get_Range((TVariant)"A7",(TVariant)"A7")-> Select();

ExcelApplication1->get_ActiveCell()->set_Value(k);

Объект Range рабочего листа ExcelWorksheet предоставляет удобный доступ к таблице и может представлять:

  • ячейку таблицы

Например, в ячейку B1 занести число 4:

ExcelWorksheet1->get_Range((TVariant)"B1",

(TVariant)"B1")->set_Value((TVariant)4);

  • диапазон ячеек

Запись формулы в ячейки “с3-с6”:

ExcelWorksheet2->get_Range((TVariant)"с3",(TVariant)"с6") -> set_Value((TVariant)"=a3+b3");

Когда формула присваивается диапазону ячеек, то переменные в формуле имеют относительные имена, поэтому в данном примере в ячейку c4 будет вписана формула “=a4 +b4” и т.д.

  • прямоугольную область,

Название города помещается в 12 ячеек

ExcelWorksheet1->get_Range((TVariant)"A2",(TVariant)"D4")->

set_Value((TVariant)"Москва ");

Получить значение из ячейки можно следующим образом:

TVariant y;

y=ExcelWorksheet2->get_Range((TVariant)"b5",(TVariant)"b5")->get_Value();

Очистить содержимое диапазона ячеек:

ExcelWorksheet2 -> get_Range((TVariant)"D1",(TVariant)"E3")-> Clear();

Копировать диапазон ячеек через буфер обмена:

ExcelWorksheet2 -> get_Range((TVariant)"A1",(TVariant)"B3")->Copy();

ExcelWorksheet2 -> get_Range((TVariant)"A7",(TVariant)"B9")->Select();

ExcelWorksheet2 -> Paste();

Смещение Offset

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

Например, следующий оператор задает запись в ячейку, отстоящую от b5 на (–1, 3), то есть в ячейку

ExcelWorksheet2->get_Range((TVariant)"b5",(TVariant)"b5")->

get_Offset ((TVariant)-1,(TVariant)3)->set_Value((TVariant)"=b5+d4");

В следующем примере числами заполняется прямоугольная область (5 строк, 4 столбца; базовая ячейка “a3”):

int i, j;

for (i=0; i<5; i++)

for (j=0; j<4; j++)

ExcelWorksheet1 -> get_Range((TVariant)"a3",(TVariant)"a3")->

get_Offset((TVariant)i,(TVariant)j)->set_Value((TVariant)(i+j));