| Часто задают вопрос, как можно передать данные в 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) |