Работа с сервером Excel
При создании нового документа в Excel (рабочая книга) из совокупности библиотек выбираются объекты, которые составляют каркас документа. Эти объекты доступны программисту.
Объект ExcelApplication задает приложение Excel, его свойства, методы и события характеризуют приложение в целом. Одно из свойств (Workbooks) возвращает все открытые в приложении рабочие книги.
Объект ExcelWorkbook задает рабочую книгу и имеет в свою очередь свойство Worksheets – все рабочие листы книги.
Объект Worksheet – это конкретный лист рабочей книги.
-
Установка связи с объектом
В библиотеке 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;
-
Работа с ячейками таблицы
Запись значения в активную ячейку
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));