Builder excel открыть файл excel

Работа с Exсel из приложения, написанного на C++Builder (часть 2)

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

Все ответы и примеры построены на программном коде первого урока
(http://cbuilder.ru/WinLesson/bles1.htm)

Список вопросов, ответы на которые приводятся в данном уроке.

1 Как получить из ячейки не только ее значение, но и формулу данной ячейки ?
2 Как нарисовать диаграмму ?
3 Как нарисовать границы у выбранного диапазона ячеек (бордюр) ?
4 Как получить значение какой-либо ячейки ?
5 Как задать формат для ячейки ?
6 Как установить масштаб для документа ?
7 Как выровнять данные в ячейке ?
8 Как установить высоту строки ?
9 Как установить ширину столбца ?
10 Как установить цвет ячеек ?
11 Как задать количество листов в книге ?
12 Как дать название листу ?
13 Как сохранить получившийся документ ?
14 Как установить настройки при печати ?
14 Как распечатать получившийся документ ?
15 Как закрыть документ Excel ?

Для того, чтобы лучше понять работу с Excel, рассмотрим иерархию объектов в Excel.


Примерная иерархия вложенных объектов OLE-сервера.

Итак, на вершине — объект Application (у нас в примере Variant App),
Workbooks — книга (не используем), работаем сразу с листом — WorkSheets — у нас Variant Sh,
группы ячеек Cells — для них используем объект Variant Rang;

«Свойствами объектов Excel могут являться так называемые коллекции объектов.
Например, коллекция Workbooks является свойством объекта Excel.Application, при этом она содержит
набор вложенных объектов — рабочих книг Excel, а те, в свою очередь, обладают свойством Worksheets,
представляющим собой коллекцию рабочих листов, каждый из которых обладает свойством Cells,
являющимся коллекцией ячеек.
Аналогично, коллекция Charts также является свойством рабочей книги»
из статьи » Создание контроллеров автоматизации с помощью C++Builder» Наталия Елманова

Итак, запускаем предыдущий проект и добавляем в него следующий код.

Вопрос. У меня в ячейке есть число, но оно рассчитывается по формуле в этой ячейке.
Как получить из ячейки не только ее значение, но и формулу данной ячейки ?

// получить формулу из ячейки
Variant __fastcall TForm1::fromExcelFormula(int Row, int Column)
<
try <
Variant result,cur;
cur = Sh.OlePropertyGet(«Cells»,Row,Column);
result = cur.OlePropertyGet(«Formula»);
return result;
>catch(. ) <;>
>
// получаем значение и формулу из ячейки 34,5
void __fastcall TForm1::Button1Click(TObject *Sender)
<
Label3->Caption = fromExcelCell(34,5); // получить значение из ячейки
Label4->Caption = fromExcelFormula(34,5); // получить формулу из ячейки
>
//————————————————

Вопрос. Как нарисовать диаграмму ?

void __fastcall TForm1::Button5Click(TObject *Sender)
<
Variant Chart;
Chart=App.OlePropertyGet(«Charts»).OleFunction(«Add»); // добавим объект диаграмму
Chart.OlePropertySet(«ChartType»,65); // установим один из типов диаграммы

// выберем ячейки для построения диаграммы, это строки 3 — 31 и столбец 3
Chart.OleProcedure(«SetSourceData»,Sh.OlePropertyGet(«Range»,Sh.OlePropertyGet(«Cells»,3,3),
Sh.OlePropertyGet(«Cells»,31,3)),2);
Chart.OlePropertyGet(«SeriesCollection»,1).OlePropertySet(«XValues»,Sh.OlePropertyGet(«Range»,
Sh.OlePropertyGet(«Cells»,2,3),Sh.OlePropertyGet(«Cells»,31,3)));
Chart.OleProcedure(«Location»,2,Sh.OlePropertyGet(«Name»));
// установим место вывода диаграммы
// для этого получим UsedRange — испольуемый диапазон ячеек, и отступим вниз на 25 пикселей
Sh.OlePropertyGet(«ChartObjects»,1).
OlePropertySet(«Top»,Sh.OlePropertyGet(«UsedRange»).OlePropertyGet(«Height»)+25);
// и слева от края 10 пикселей
Sh.OlePropertyGet(«ChartObjects»,1).OlePropertySet(«left»,10);
// встаем на начало
Sh.OlePropertyGet(«Cells»,1,1).OleProcedure(«Select»);
>
//——————————————————

Вопрос. Как нарисовать границы у выбранного диапазона ячеек (бордюр) ?

// Устанавливаем диапазон ячеек для рисования бордюра A2:E31
int m = 30;
AnsiString s = «A2:E»+IntToStr(m+1);
Variant range = App.OlePropertyGet(«Range», s.c_str());
for (int i=1; i Вопрос. Как получить значение какой-либо ячейки ?

Label3->Caption = fromExcelCell(34,5); // получить значение ячейки 34,5

// получить значение ячейки
Variant __fastcall TForm1::fromExcelCell(int Row, int Column)
<
try <
Variant result,cur;
cur = Sh.OlePropertyGet(«Cells»,Row,Column);
result = cur.OlePropertyGet(«Value»);
return result;
>catch(. ) <;>
>
//——————-

Вопрос. Как задать формат для ячейки ?

// устанавливаем формат числа для ячейки 1,1
Sh.OlePropertyGet(«Cells», 1,1).OlePropertySet(«NumberFormat», «0.00»);
// устанавливаем формат строка для ячейки 1,2
Sh.OlePropertyGet(«Cells», 1,2).OlePropertySet(«NumberFormat», «@»);
// устанавливаем формат даты для ячейки 1,3
Sh.OlePropertyGet(«Cells», 1,3).OlePropertySet(«NumberFormat», «ДД.ММ.ГГГГ»);

Вопрос. Как установить масштаб для документа ?

// Устанавливаем масштаб = 75%
App.OlePropertyGet(«ActiveWindow»).OlePropertySet(«Zoom», 75);

Вопрос. Как выровнять данные в ячейке ?

// Выравнивам данные в ячейке
Sh.OlePropertyGet(«Cells», 1,1).OlePropertySet(«HorizontalAlignment», 4);
// где 4 — по левому краю, 2 — по правому, 3 — по центру)

// или по-другому это можно записать так
// Rang = Sh.OlePropertyGet(«Cells»,1,1);
// Rang.OlePropertySet(«HorizontalAlignment»,4);
// и для вертикального выравнивания — VerticalAlignment

Вопрос. Как установить высоту строки ?

// устанавливаем высоту 60
Rang.OlePropertySet(«RowHeight», 60);

Вопрос. Как установить ширину столбца ?

// устанавливаем ширину столбца 12
Sh.OlePropertyGet(«Columns»).OlePropertyGet(«Item»,1).OlePropertySet(«ColumnWidth», 12);

Вопрос. Как установить цвет ячеек ?

Rang = Sh.OlePropertyGet(«Range», «A1:E1»);
Rang.OlePropertyGet(«Interior»).OlePropertySet(«ColorIndex»,4);

Вопрос. Как задать количество листов в книге ?

// Определяем количество листов в книге — 1
App.OlePropertySet(«SheetsInNewWorkbook», 1);

Вопрос. Как дать название листу ?

// Даем название нашему листу «Наш лист итогов»
Sh = App.OlePropertyGet(«Worksheets»).OlePropertyGet(«Item», 1);
Sh.OlePropertySet(«Name», «Наш лист итогов»);

Вопрос. Как сохранить получившийся документ ?

// Не спрашивать о замене файла, если он уже есть
App.OlePropertySet(«DisplayAlerts», false);

// Сохраняем файл как «Firm.xls»
App.OlePropertyGet(«WorkSheets»,1).OleProcedure(«SaveAs»,»Firm.xls»);

Вопрос. Как установить настройки при печати ?

// Левое и правое поля отступа для печати
Sh.OlePropertyGet(«PageSetup»).OlePropertySet(«LeftMargin», 80);
Sh.OlePropertyGet(«PageSetup»).OlePropertySet(«RightMargin»,20);

Вопрос. Как распечатать получившийся документ ?

Вопрос. Как закрыть документ Excel ?

try <
App.OlePropertyGet(«WorkBooks»,1).OleProcedure(«Close»);
>catch(. ) <
ShowMessage(«Не забудьте сами закрыть Excel.»);
>
// закрыть сам Excel
App.OleProcedure(«Quit»);

//——————————
Посмотреть как все это работает и другие возможности
для C++Builder 6 полный проект можно скачать и посмотреть в работе здесь (15 Кб).

Многие спрашивают — как ускорить вывод в Excel больших массивов данных ,
слишком медленно все работает.
Наиболее идеальный вариант — воспользоваться компонентами XLSReadWrite2 или аналогичными.
Также, в проекте есть пример, как можно немного ускорить такой вывод,
для этого при выводе данных можно не выводить данные последовательно в каждую ячейку
в цикле, а лучше сформировать вариантный массив, и выполнить присвоение области
(Range)
этого массива, только после этого делая Excel видимым.
Также более быстрая работа происходит при использовании библиотеки типов.

Все замечания и предложения и добавления: support@cbuilder.ru
Если Вы используете Excel или Word в работе с C++Builder,
присылайте примеры, проекты и интересные решения нам,
а также если у вас остались вопросы — спрашивайте.

В следующем уроке:

Для облегчения вывода данных в Excel можно использовать шаблоны.
Мы рассмотрим работу с шаблонами (.xlt) и использование макросов.

Источник

Builder excel открыть файл excel

В предыдущих уроках мы сами формировали отчет в Excel, от начала и до конца,
но это не всегда удобно, иногда проще создать нужную форму отчета (шаблон .xlt),
а уже потом выводить в нее данные (например из базы данных).
Особенно это удобно, если форма отчета может незначительно измениться,
тогда нет необходимости вносить изменения в проект на C++Builder,
достаточно будет лишь изменить шаблон.
Кроме того, часть информации рассчитывается по формулам, записанным в шаблон,
и при изменении этих формул, также нет необходимости вносить изменения
в проект на C++Builder,достаточно изменить формулу в шаблоне.

Давайте рассмотрим этот вариант.

У нас есть некая база данных, и в ней таблица поставщиков SaleMan
и связанная с ней таблица товаров Goods, которые они поставляют.
Создадим на их основе отчет » Счет-фактура » и » Накладная » по
выбранному поставщику.

Оба отчета будут использовать один шаблон (.xlt) и выводиться в один файл (.xls)
(на одном листе WorkSheets 1 — Счет-фактура, на другом WorkSheets 2 — Накладная)
Создадим шаблон отчета (рассмотрите прилагаемый файл NaclSf.xlt)
Всем полям, в которые будут выводиться данные, дадим интуитивно понятные
имена.

Например: НомерНАКЛ , ДатаНАКЛ, ПоставщикНАКЛ, ИННПНАКЛ, НомерСФ , ДатаСФ и др.

Формат таблиц SaleMan и Goods следующий:

SaleMan

ID integer ID поставщика
Org string Hазвание организации-поставщика
Addr string Адрес поставщика
InnOrg string ИНН постащика

Goods

ID integer ID товара
IDSale integer поставщик товара
Name string наименование товара
Izmer string единица измерения
Count float количество
Price float цена за ед изм

Разумеется это крайне обрезанный и упрощенный вариант, удобный для примера.

Variant App, Sh;
TDate Today = Now();

// устанавливаем путь к файлу шаблона
AnsiString sFile = GetCurrentDir()+»\NaclSf.xlt»;

// инициализируем Excel, открываем этот шаблон
try <
App=Variant::GetActiveObject(«Excel.Application»);
> catch(. ) <
try < App=Variant::CreateObject(«Excel.Application»); >
catch (. ) <
Application->MessageBox(«Невозможно открыть Microsoft Excel!»
» Возможно этого приложения на компьютере не установлено.»,»Ошибка»,MB_OK+MB_ICONERROR);
>>
try <
App.OlePropertyGet(«WorkBooks»).OleProcedure(«Open»,sFile.c_str(),0,false,1);
Sh=App.OlePropertyGet(«WorkSheets»,1);
> catch(. ) <
Application->MessageBox(«Ошибка открытия книги Microsoft Excel!»,»Ошибка»,MB_OK+MB_ICONERROR);
>

// выводим в шаблон данные
// сначала заголовок
toExcel(App,»НомерНАКЛ»,SaleManID->Value);
toExcel(App,»ДатаНАКЛ»,Today.DateString());
toExcel(App,»ПоставщикНАКЛ»,SaleManOrg->Value.c_str());
toExcel(App,»ИННПНАКЛ»,SaleManInn->Value.c_str());

toExcel(App,»НомерСФ»,SaleManID->Value);
toExcel(App,»ДатаСФ»,Today.DateString());
toExcel(App,»АдресПСФ»,SaleManAddr->Value.c_str());
toExcel(App,»ПоставщикСФ»,SaleManOrg->Value.c_str());
toExcel(App,»ИННПСФ»,SaleManInn->Value.c_str());

// определяем в n количество товара (строк для ввода в шаблон)
Goods->First();
int n = 0; while(!Goods->Eof) < n++; Goods->Next(); >
// или int n = Goods->RecordCount;

// вставляем в шаблон нужное количество строк
Variant C;
App.OlePropertyGet(«WorkSheets»,1).OleProcedure(«Select»);
C=App.OlePropertyGet(«Range»,»ТоварСФ»);
C=App.OlePropertyGet(«Rows»,(int) C.OlePropertyGet(«Row»)+1);
for(int i=1;i First();
int i = 0;
while(!Goods->Eof) <
toExcel(App,»ТоварСФ»,i,GoodsName->Value.c_str());
toExcel(App,»ТоварНАКЛ»,i,GoodsName->Value.c_str());
toExcel(App,»НомерППНАКЛ»,i,i+1);
toExcel(App,»СтранаСФ»,i,»Россия»);
toExcel(App,»ЕдизмСФ»,i,GoodsIzmer->Value.c_str());
toExcel(App,»ЕдизмНАКЛ»,i,GoodsIzmer->Value.c_str());
toExcel(App,»КолСФ»,i,GoodsCount->Value);
toExcel(App,»КолНАКЛ»,i,GoodsCount->Value);
toExcel(App,»ЦенаСФ»,i,GoodsPrice->Value);
toExcel(App,»ЦенаНАКЛ»,i,GoodsPrice->Value);
toExcel(App,»СтоимСФ»,i,GoodsPrice->Value*GoodsCount->Value);
toExcel(App,»СтоимостьСНДССФ»,i,(GoodsPrice->Value*GoodsCount->Value*5)/100.);
toExcel(App,»ВсегоНАКЛ»,i,GoodsPrice->Value*GoodsCount->Value);
toExcel(App,»СуммаНДССФ»,i,(GoodsPrice->Value*GoodsCount->Value*5)/100.);
toExcel(App,»СуммаНДСНАКЛ»,i,(GoodsPrice->Value*GoodsCount->Value*5)/100.);
i++; Goods->Next();
>

// и наконец, делаем Excel видимым
App.OlePropertySet(«Visible»,true);

Полный проект примера к C++Builder 6 с шаблоном и таблицами можно скачать здесь (12 Кб)

Теперь об использовании макросов.

Практически любые наши действия в Excel могут быть описаны с помощью макросов.
Создадим и запишем в шаблоне новый макрос, дадим ему имя. (например MyMacros1)
Всё .
Теперь запустим макрос на выполнение

и необходимые действия из макроса будут выполнены.
Разумеется, нужно, чтобы эти макросы были подготовлены заранее
и сохранены в шаблоне, а уже при формировании отчета (.xls) на
основании этого шаблона (.xlt), макросы можно будет применять.

Источник

Работа с Exсel из приложения, написанного на C++Builder (часть 1)

Часто задают вопрос, как можно передать данные в Excel и управлять
им из приложения, написанного на C++Builder
Для этого есть несколько путей. Рассмотрим один из вариантов — как это сделать
через технологию OLE, не используя
компоненты
с вкладки Office97 палитры компонентов.
Мы можем вывести данные в новый файл Excel, или заранее создать шаблон .xlt
и выводить данные в шаблон.
На этом уроке мы создадим новый файл (новую книгу)
Пример с шаблоном рассмотрим в следующем уроке.

Давайте построим простое приложение C++Builder и передадим из него:
данные, формулы и сохраним получившийся файл на диске, после чего можем
и закрыть Excel.
Итак, создаем новое приложение C++Builder, назовем файл с формой main.cpp
и форма по умолчанию Form1.
Для удобства вынесем все наши действия в отдельные функции.
Разместим на форме Form1 кнопку bToExcel и 2 компонента DateTimePicker,
назовем их DTP1 и DTP2

Присвоим в конструкторе формы им значения

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
DTP1->Date = Now() — 30;
DTP2->Date = Now();
}
//----------------------------------------------------------------------------
Объявим в main.h в секции private используемые переменные и функции:
//----------------------
private: // User declarations
void __fastcall ExcelInit(String File);
void __fastcall formulaExcel(int sRow, int sColumn, int row);
void __fastcall toExcelCell(int c1,int c2, String data);
void __fastcall toExcelCell(int c1,int c2, Variant data);
Variant App,Sh;
void MakeReport();
//----------------------
Напишем пример-функцию MakeReport(), которая это все делает
(вызываться может, например, по нажатию кнопки bToExcel
в обработчике нажатия кнопки)

void __fastcall TForm1::bToExelClick(TObject *Sender)
{
MakeReport();
}
//-----------------------------------------------------------------
// а вот и вся программа

void TForm1::MakeReport()
{
// запускаем Excel
ExcelInit("");
// записываем в него заголовки
toExcelCell(1,1,String("Дата"));
toExcelCell(1,2,String("Наименование"));
toExcelCell(1,3,String("Количество"));
toExcelCell(1,4,String("Цена за еденицу"));
toExcelCell(1,5,String("Сумма"));
// записываем в него данные
for(int i=0; i < 30; i++){
toExcelCell(i+2, 1, Variant(DTP1->Date + i));
AnsiString s = "Молоко "+IntToStr(i+1)+"% жирности";
toExcelCell(i+2, 2, String(s));
toExcelCell(i+2, 3, Variant(i*2+3));
toExcelCell(i+2, 4, Variant(i*17.5+1));
toExcelCell(i+2, 5, Variant((i*2+3) * (i*17.5+1)));
}
toExcelCell(32,1,String("Итого"));
// записываем 2 формулы (диапазон значений)
formulaExcel(32, 3, 30);
formulaExcel(32, 5, 30);
// еще формула
toExcelCell(34,1,String("Налог 5%"));
App.OlePropertyGet("Cells", 34, 5).OlePropertySet("Formula", String("=E32*5%").c_str());
// делаем его видимым
if(!App.IsEmpty())App.OlePropertySet("Visible",true);
// сохраняем его на диске в файл MyTest.xls
try{
App.OlePropertyGet("WorkBooks",1).OleProcedure("SaveAs","MyTest");
}catch(...){
ShowMessage("Не забудьте сохранить сделанные изменения !");
}
// можем при желании и сразу закрыть, если закрывать не нужно — удалите этот блок
//---
try{
App.OlePropertyGet("WorkBooks",1).OleProcedure("Close");
}catch(...){
ShowMessage("Не забудьте сами закрыть Excel.");
}
//---
// освобождаем ресурсы
Sh.Clear();
App.Clear();
}
//------------------------------------------------------------------------
Функция ExcelInit() — подключение к Excel.
Прежде всего нам нужно запустить программу Excel (или если Excel запущен — подключиться к нему)
void __fastcall TForm1::ExcelInit(String File)
{
// если Excel запущен — подключиться к нему
try {
App=Variant::GetActiveObject("Excel.Application");
} catch(...) {
// Excel не запущен — запустить его
try { App=Variant::CreateObject("Excel.Application"); } catch (...) {
Application->MessageBox("Невозможно открыть Microsoft Excel!"
"Возможно Excel не установлен на компьютере.","Ошибка",MB_OK+MB_ICONERROR);
} }
try {
if(File!="")
App.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str());
else
App.OlePropertyGet("WorkBooks").OleProcedure("add");
Sh=App.OlePropertyGet("WorkSheets",1);
} catch(...) {
Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
"Ошибка",MB_OK+MB_ICONERROR);
}
}/* ExcelInit() */
//----------------------------------------------------------------
Теперь напишем функцию toExcelCell() передачи данных в Excel в указанный столбец и строку
void __fastcall TForm1::toExcelCell(int Row,int Column, AnsiString data)
{
try {
Variant cur = Sh.OlePropertyGet("Cells", Row,Column);
cur.OlePropertySet("Value", data.c_str());
} catch(...) { ; }
}/* toExcelCell() */
//------------------------------------------------------------------------
void __fastcall TForm1::toExcelCell(int Row,int Column, Variant data)
{
try {
Variant cur = Sh.OlePropertyGet("Cells", Row,Column);
cur.OlePropertySet("Value", data);
} catch(...) { ; }
}/* toExcelCell() */
//---------------------------------------------------------------------------
И, наконец, функция передачи формулы
void __fastcall TForm1::formulaExcel(int sRow, int sColumn, int row)
{
try {
App.OlePropertyGet("Cells", sRow, sColumn).OlePropertySet("FormulaR1C1",
("=СУММ(R[-"+AnsiString(row)+"]C:R[-1]C)").c_str());
} catch(...) { ; }
}/* formulaExcel() */
//---------------------------------------------------------------------------

Ну вот приложение и готово.
Если Вам не хочется набирать вручную, готовый пример проекта к C++Builder
6 можно скачать здесь (.rar 5 Кб)
Запустите его, откомпилируйте и посмотрите результат.
Теперь также просто Вы можете в своих программах это все повторить.
Точно также передаваемые данные можно взять из БД, нужным образом обработать
и передать в Excel.
Для того, чтобы посмотреть что еще и как можно делать с Excel Вы можете
запустить Excel,
зайти в редактор по VisualBasic и посмотреть там какие еще команды (функции)
есть для управления.
А на следующем уроке мы поговорим о том, как можно передать данные в шаблон
(.xlt)


При нажатии на кнопку открывается файл таблицы Excel. Скрытый режим открытия и выход из Excel.

Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <Comobj.hpp> //Хидер для OLE объктов
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Variant Ap, Bs; //Переменные   EA - Application, B-Workbooks
 Ap = CreateOleObject("Excel.Application");
 Bs = Ap.Exec(PropertyGet("Workbooks"));
 Bs.Exec(Function("Open") << L"c:\excel\data.xlsx");   //Наш файл Excel
 Ap.Exec(PropertySet("Visible") << true); //Видимость   Excel
 //Ap.Exec(Procedure("Quit"));  //Выход из Excel
}
//---------------------------------------------------------------------------

Unit1.h

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// User declarations
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Подробности
Родительская категория: Уроки и примеры программирования на С++
Категория: Уроки и примеры программирования C++ Embarcadero RAD Studio 10 | C++ Builder 10

Просмотров: 5496

Перейти к содержимому

С помощью языка C++ можно работать со сторонними программами. Требуется только библиотека-парсер,  в которой будут описаны способы взаимодействия с этой программой. Для примера рассмотрим работу с Microsoft Office Excel и компиляторы Borland C++ Builder и Microsoft Visual C++.

В Borland C++ Builder для взаимодействия с Excel достаточно подключения одной библиотеки ComObj.hpp, которая дает возможность оперирования с Ole, благодаря чему и возможно принимать и посылать данные Excel.

Рассмотрим пример такой программы:

{

  string word;

  Variant exl;

  exl = CreateOleObject(«Excel.Application»);

  exl.OlePropertyGet(«Workbooks»).OleProcedure(«Open», «D:\1.xls»);

  for(int i = 1 ; i < 5; i++)

    for(int j = 1; j < 4; j++)

      word=exl.OlePropertyGet(«Cells», i, j);

}

Программа выполняет следующую задачу: посредством Ole создает объект (CreateOleObject()),  распознаваемый как объект документа Excel. После этого объект exl открывает файл по заданному пути и интерпретирует его (OleProcedure(«Open», «D:\1.xls»). Затем в переменную word выдаются значения клеток.

Итак, при помощи команд OlePropertyGetOlePropertySet и OleProcedure можно получить доступ ко всем объектам и коллекциям Excel.

Аналогичная программа в Microsoft Visual C++ выглядит следующим образом.

Файл Office.h для версии Excel 2007 года. Для других годов — аналогично.

#define Uses_MSO2007

// for MS Office 2007

#import «C:\Program Files\Common Files\Microsoft Shared\OFFICE12\MSO.DLL» auto_rename no_namespace

#import «C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB» auto_rename no_namespace

#import «C:\Program Files\Microsoft Office\OFFICE12\EXCEL.EXE» auto_rename

И файл cpp:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

// excel.cpp : main project file.

#include «stdafx.h»

#include <conio.h>

#include <iostream>

#include «Office.h»

using namespace System;

using namespace std;

int main(array<System::String ^> ^args)

{

  double t;

  ::CoInitialize(NULL);

  using namespace Excel;

  _ApplicationPtr excel(L«Excel.Application»);

  excel->Workbooks->Open(«D:\1.xls»);

  RangePtr pRange = excel->Cells;

  for(int i = 1 ; i < 5; i++)

    for(int j = 1; j < 4; j++)

      {

        t=pRange->Item[i][j];

        cout<<t;

      }

  ::CoUninitialize();

  getch();

  return 0;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  DTP1->Date = Now() - 30;
  DTP2->Date = Now();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 MakeReport();
}
//---------------------------------------------------------------------------
// а вот и вся программа
 
void TForm1::MakeReport()
{
    // запускаем Excel
    ExcelInit("");
 
    // записываем в него заголовки
    toExcelCell(1,1,WideString("Дата"));
    toExcelCell(1,2,WideString("Наименование"));
    toExcelCell(1,3,WideString("Количество"));
    toExcelCell(1,4,WideString("Цена за еденицу"));
    toExcelCell(1,5,WideString("Сумма"));
 
    // записываем в него данные
    for(int i=0; i < 30; i++){
       toExcelCell(i+2, 1, Variant(DTP1->Date + i));
       AnsiString s = "Молоко "+IntToStr(i+1)+"% жирности";
       toExcelCell(i+2, 2, WideString(s));
       toExcelCell(i+2, 3, Variant(i*2+3));
       toExcelCell(i+2, 4, Variant(i*17.5+1));
       toExcelCell(i+2, 5, Variant((i*2+3) * (i*17.5+1)));
       }
 
    toExcelCell(32,1,WideString("Итого"));
 
    // записываем 2 формулы (диапазон значений)
    formulaExcel(32, 3, 30);
    formulaExcel(32, 5, 30);
 
    // еще формула
    toExcelCell(34,1,WideString("Налог 5%"));
    App.OlePropertyGet("Cells", 34, 5).OlePropertySet("Formula", WideString("=E32*5%"));
 
    // делаем его видимым
 
    if(!App.IsEmpty())App.OlePropertySet("Visible",true);
 
    // сохраняем его на диске в файл MyTest.xls
    try{
      App.OlePropertyGet("WorkBooks",1).OleProcedure("SaveAs","MyTest");
      }catch(...){
         ShowMessage("Не забудьте сохранить сделанные изменения !");
         }
 
     // можем при желании и сразу закрыть, если закрывать не нужно - удалите этот блок
     //---
     try{
       App.OlePropertyGet("WorkBooks",1).OleProcedure("Close");
       }catch(...){
          ShowMessage("Не забудьте сами закрыть Excel.");
      }
     //---
 
    // освобождаем ресурсы
    Sh.Clear();
    App.Clear();
}
//--------------------------------------------------------------------------
void __fastcall TForm1::ExcelInit(String File)
{
  // если Excel запущен - подключиться к нему
  try {
   App=Variant::GetActiveObject("Excel.Application");
  } catch(...) {
     // Excel не запущен - запустить его
     try { App=Variant::CreateObject("Excel.Application"); } catch (...) {
      Application->MessageBox(L"Невозможно открыть Microsoft Excel!"
      L"Возможно Excel не установлен на компьютере.",L"Ошибка",MB_OK+MB_ICONERROR);
  } }
  try {
    if(File!="")
     App.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str());
    else
     App.OlePropertyGet("WorkBooks").OleProcedure("add");
 
    Sh=App.OlePropertyGet("WorkSheets",1);
  } catch(...) {
    Application->MessageBox(L"Ошибка открытия книги Microsoft Excel!",
                                         L"Ошибка",MB_OK+MB_ICONERROR);
  }
}/* ExcelInit() */
//---------------------------------------------------------------------------
void __fastcall TForm1::toExcelCell(int Row,int Column, WideString data)
{
  try {
    Variant  cur = Sh.OlePropertyGet("Cells", Row,Column);
    cur.OlePropertySet("Value", data);
    //ShowMessage("1");
  } catch(...) { ; }
}/* toExcelCell() */
//---------------------------------------------------------------------------
void __fastcall TForm1::toExcelCell(int Row,int Column, Variant data)
{
  try {
    Variant  cur = Sh.OlePropertyGet("Cells", Row,Column);
    cur.OlePropertySet("Value", data);
    //ShowMessage("2");
  } catch(...) { ; }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::formulaExcel(int sRow, int sColumn, int row)
{
   try {
    App.OlePropertyGet("Cells", sRow, sColumn).OlePropertySet("FormulaR1C1",WideString("=СУММ(R[-"+WideString(row)+"]C:R[-1]C)"));
 
  } catch(...) { ; }
}/* formulaExcel() */
//---------------------------------------------------------------------------

Новичок

Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.7.2004
Где: Владивосток

Репутация: нет
Всего: нет

Variant OlePropertyGet(const String& name, TAutoArgsBase* args = 0);
template <class P1> Variant OlePropertyGet(const String& name, P1 p1);
template <class P1, class P2> Variant OlePropertyGet(const String& name, P1 p1, P2 p2);
template <class P1, class P2, class P3> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3);

template <class P1, class P2, class P3, class P4> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4);
template <class P1, class P2, class P3, class P4, class P5> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
template <class P1, class P2, class P3, class P4, class P5, class P6> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6);

template <class P1, class P2, class P3, class P4, class P5, class P6, class P7> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7);
template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8);

template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9);
template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class P10> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10);

Нравится??? Вот и мне тожа!

Это сообщение отредактировал(а) Ozerman — 6.7.2004, 16:25

Like this post? Please share to your friends:
  • Build word with these letters
  • Build word of mouth
  • Build word in a word games
  • Build word from letters
  • Build up sentences with the correct word order