Часто задают вопрос, как можно передать данные в 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);
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() */
//---------------------------------------------------------------------------
Ну вот приложение и готово.
Запустите его, откомпилируйте и посмотрите результат.
Теперь также просто Вы можете в своих программах это все повторить.
Точно также передаваемые данные можно взять из БД, нужным образом обработать
и передать в Excel.
Для того, чтобы посмотреть что еще и как можно делать с Excel Вы можете
запустить Excel,
зайти в редактор по VisualBasic и посмотреть там какие еще команды (функции)
есть для управления.
|