Большой архив статей, книг, документации по программированию, вебдизайну, компьютерной графике, сетям, операционным системам и многому другому
 
<Добавить в Избранное>    <Сделать стартовой>    <Реклама на сайте>    <Контакты>
  Главная Документация Новости ИТ Программы Книги Games   Обои   Экспорт RSS E-Books
 
Поиск по сайту

TOP-10 программ
Symantec Norton Ghost 9.0
Partition Magic 8.0.2 Pro
Xilisoft 3GP Video Converter v3.1.7.0616b
Norton AntiVirus 2005
Xilisoft 3GP Video Converter v2.1.52.831b
Антивирус Касперского Personal 5.0.303 beta 2
RAR Password Cracker 4.12
ABBYY PDF Transformer v1.00.820
MP3 To Ringtone Gold v3.02
Mobtime Cell Phone Manager v5.3.1
 
Наши сервисы
Рассылка новостей. Подпишитесь на рассылку сейчас и вы всегда будете в курсе последних событий в мире информационных технологий.
Новостные информеры. Поставьте наши информеры к себе и у вас на сайте появится дополнительный постоянно обновляемый раздел.
Добавление статей. Если вы являетесь автором статьи или обзора на тему ИТ присылайте материал нам, мы с удовольствием опубликуем его у себя на сайте.
 
 

   Программирование -> C++ Builder -> Работа с Exсel из приложения, написанного на C++Builder

Часто задают вопрос, как можно передать данные в 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 и посмотреть там какие еще команды (функции) есть для управления.
 
Популярные книги

Системное администрирование на 100 % (+CD)

Подробнее

Дизайн помещений и интерьеров в 3ds max 7 (+CD)

Подробнее

Самоучитель Macromedia Flash 5

Подробнее

 

 
Новости ИТ
01.12.2008  Buffalo выпустил миниатюрные USB-накопители
01.12.2008  VENTO TA-U1 - стильный корпус представлен Asus
01.12.2008  Fujitsu-Siemens выпускает в продажу внешний ускоритель для ноутбуков
01.12.2008  Оригинальные чехлы для ноутбуков от Choiix
01.12.2008  Опубликован код драйвера для беспроводных карт Atheros
01.12.2008  Лучший блог 2008
01.12.2008  Linux запустили на Apple iPhone
01.12.2008  LG KC780
01.12.2008  MSI дополнит линейку Wind-нетбуков двумя моделями
01.12.2008  Nikon D3X - 24,5 млн пикселей для профессионалов
01.12.2008  Киловаттник HIPER M1000 с КПД выше 85%
01.12.2008  AMD впервые снизила цены линейки Radeon HD 4800
01.12.2008  Чистильщики: Wise Registry Cleaner v.3.8.2
01.12.2008  Антивирусы: RemoveIT Pro v4 SE (30.11.2008)
01.12.2008  Корпус ASUS Vento TA-U1 можно поставить вместо новогодней ёлки
01.12.2008  Диагностика: PC Wizard 2008 v.1.871
01.12.2008  Диагностика: NextSensor v.2.7.6.0 Build 1130
01.12.2008  Тестовые приложения: PassMark BurnInTest v.6.0 Build 1000 Beta 15
01.12.2008  Неофициальные драйверы для модемов Motorola
01.12.2008  Драйверы и утилиты для сетевых хранилищ D-Link
 
Полезно

 
Copyright © CompDoc.Ru
При цитировании и перепечатке ссылка на www.compdoc.ru обязательна. Карта сайта.
 
Rambler's Top100