http://cbuilder.ru
Работа с 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)

support@cbuilder.ru