C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
И снова о работе с Excel
Borgir
Отправлено: 08.09.2003, 08:24


Дежурный стрелочник

Группа: Участник
Сообщений: 48



Я понимаю, что вы сейчас будете страшно материться и отсылать меня в FAQ, но все же спрошу. Как же все-таки работать с EXCEL в Buildere 6? В FAQ описана прямая работа через OLE, а я хотел бы работать через компоненты ExcelApplication, ExcelWorksheet и тд. Все что от них надо это открыть определенный Экселевский файл, вставить в определенных местах некоторые значения и выставить у нужных ячеек типы границ. Сколько не пытался, никак не получается.

Заранее спасибо!!!
ekya
Отправлено: 08.09.2003, 13:05


Ученик-кочегар

Группа: Участник
Сообщений: 27



Насколько я помню, как подсоединиться есть в примерах, может конечно для Ворда, что в принципе неважно.
Хотя я бы не посоветовал пользоваться компонетами, я работать через ОЛЕ
Valdemar
Отправлено: 16.09.2003, 15:42


Мастер участка

Группа: Участник
Сообщений: 433



Я не согласен с ekya, по поводу того, что лучше работать через OLE.
Во-первых, т.к. при работе с OLE применяется позднее связывание, поэтому компилятор не может проверить правильность кода программы на этапе компиляции, потому что он не знает существует ли у COM-сервера запрашиваемое свойство или функция. Из этого вытекает снижение скорости работы.
Во-вторых, уж очень много писанины получается если использовать OLE, а при использовании компонент с закладки Servers помогает Code Insight.
Конкретных примеров привести не могу, т.к. работал только с Word. Советую почитать хелп по VBA для Excel. Там есть описание всех свойств и методов.
Гость_laifik
  Отправлено: 17.09.2003, 09:43


Не зарегистрирован







Только что занималась проблеммой Excel, вот примеры. Может это несколько не совсем ответы на все поставленные вопросы, но все таки:
Открытие файла через форму диалога:
CODE

void __fastcall TPWordForm::N9Click(TObject *Sender)
{
   // Устанавливаем путь к файлу

       AnsiString sFile;

      if (OpenDialog1->Execute())
   {
    sFile = OpenDialog1->FileName;
    // Инициализируем 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);
    }
  App.OlePropertySet("Visible",true);
 
 Sh.Clear();
 App.Clear();

    }
}
Через OpenDialog1->FileName можно указать конкретный файл.
Далее, вставка данных из таблицы в  Excel:
//---------------------------------------------------------------------------

void __fastcall TPWordForm::Button1Click(TObject *Sender)
{

   MakeReport();
}
//---------------------------------------------------------------------------
// Данные в Exel
void TPWordForm::MakeReport()
{
TDateTime tor, s, po, rab;
AnsiString hos, mas, tran, na, fir;
float chas,opl;
int y;
   ExcelInit("");

   toExcelCell(1,1,String("Дата"));
   toExcelCell(1,2,String("Фирма"));
 
    // Определяем ширину столбцов
   Sh.OlePropertyGet("Columns").OlePropertyGet("Item",1).OlePropertySet("ColumnWidth", 10);
   Sh.OlePropertyGet("Columns").OlePropertyGet("Item",2).OlePropertySet("ColumnWidth", 7);

         // Даем название листа книги
   Sh = App.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
   Sh.OlePropertySet("Name", "Сверка");


//Соединение с таблицей БД

//Подсчет строк в таблице
y = Table1->RecordCount;

Table1->First();
do
{
   for(int i=0; i<y; i++){

      tor = Table1->AsDateTime;
      toExcelCell(i+3, 1, String(tor));

Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",4).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",4).OlePropertySet("Weight", 2);
Sh.OlePropertyGet("Cells",i+3,1).OlePropertyGet("Borders",4).OlePropertySet("ColorIndex", 1);

      hos = Table1->AsString;
      toExcelCell(i+3, 2, String(hos));
      Sh.OlePropertyGet("Cells", i+3,2).OlePropertySet("HorizontalAlignment", 3);
   // где 4 — по левому краю, 2 — по правому, 3 — по центру)

Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",4).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",4).OlePropertySet("Weight", 2);
Sh.OlePropertyGet("Cells",i+3,2).OlePropertyGet("Borders",4).OlePropertySet("ColorIndex", 1);
 
      Table1->Next();
      }
      }
 while (Table1->Eof!=TRUE);


for (int l=1; l<=11; l++)
{
//Форматирование строк
//Первая строка
Sh.OlePropertyGet("Cells",1,l).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",1,l).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",1,l).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);

//Вторая строка
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",2).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",2).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",2).OlePropertySet("ColorIndex", 1);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",4).OlePropertySet("LineStyle",1);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",4).OlePropertySet("Weight", 3);
Sh.OlePropertyGet("Cells",2,l).OlePropertyGet("Borders",4).OlePropertySet("ColorIndex", 1);


   if(!App.IsEmpty())App.OlePropertySet("Visible",true);
//---

   Sh.Clear();
   App.Clear();
   Rang.Clear();
}

в .h прописано
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Db.hpp>
#include <DBCtrls.hpp>
#include <DBGrids.hpp>
#include <DBTables.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
#include <OleServer.hpp>
#include "Word_2K_SRVR.h"
#include <DB.hpp>
#include "Excel_2K_SRVR.h"
#include <Menus.hpp>
#include <utilcls.h>
#include <OleCtnrs.hpp>
#include <Dialogs.hpp>
#include <dbcgrids.hpp>
#include <Mask.hpp>

#include <comobj.hpp>
#include "CSPIN.h"  
#include <ComCtrls.hpp>
#include <AppEvnts.hpp>

private: // User declarations
       void __fastcall formulaExcel(int sRow, int sColumn, int row);
       void __fastcall ExcelInit(String File);
       void __fastcall toExcelCell(int c1,int c2, String data);
       void __fastcall toExcelCell(int c1,int c2, Variant data);
       void MakeReport();
       void __fastcall Connect(void);

Все это у меня работает, если чего лишнего не убрала за ненадобностью загромождения. Оставила вывод двух столбцов.
biggrin.gif

Отредактировано Admin — 17/09/2003, 15:08
Borgir
Отправлено: 17.09.2003, 14:01


Дежурный стрелочник

Группа: Участник
Сообщений: 48



Пришлось мне сделать работу с EXCEL через ОЛЕ. Вроде бы все работает нормально: файл открывает, данные в ячейки перегоняет, EXCEL показывает и тд. Но вот с закрытием какие-то глюки получаются. Я сделал закрытия приложения EXCEL в событии OnClose формы. Визуально вроде бы все закрывается нормально. Но в процессах остается висеть "Excel.exe", и как результат второй раз открытие Excel невозможно. То есть он вроде как открывает файл, но на экране появляется только верхняя часть окна EXCEL, а рабочего пространства (где должна быть таблица) нет. Подскажите как правильно закрывать ентот EXCEL из моего приложения?
Заранее спасибо!
Admin
Отправлено: 17.09.2003, 16:33


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE
а я хотел бы работать через компоненты ExcelApplication, ExcelWorksheet и тд



CODE

 void __fastcall TForm1::Button1Click(TObject *Sender)
{
 OpenDialog->Execute();
 ExcelApplication->Connect();
 ExcelWorkbook->ConnectTo(ExcelApplication->Workbooks->
                         Open(WideString(OpenDialog->FileName)));
 ExcelWorksheet->ConnectTo(ExcelWorkbook->ActiveSheet);
 ExcelApplication->set_Visible(0, true);
 // .....
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  ExcelWorksheet->Disconnect();
  ExcelWorkbook->Disconnect();
  ExcelApplication->Quit();
  ExcelApplication->Disconnect();
}
//----------------------------------------
 

Вернуться в Вопросы программирования в C++Builder