Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: CL | DM;

Вниз

C++Builder & ExcelApplication   Найти похожие ветки 

 
slydiman ©   (2002-02-08 23:56) [0]

Задача - нужно прочитать XLS файл на C++Builder.
Использовал компоненты TExcelApplication и пр. для Excel2k.

ExcelApplication->Connect();
ExcelWorkbook->ConnectTo( ExcelApplication->Workbooks->Add(Filename,0) );
ExcelWorksheet->ConnectTo( ExcelWorkbook->ActiveSheet );
...
ExcelWorksheet->Disconnect();
ExcelWorkbook->Disconnect();
ExcelApplication->Disconnect();

Проблема в том что после ExcelApplication->Disconnect();
Excel остается в памяти до закрытия всего приложения. Причем если до закрытия приложения запустить еще одну копию Excel руками, то она вылетает с ошибкой.

При использовании на Delphi кода типа
var
ExcApp : Variant;
...
ExcApp := CreateOleObject("Excel.Application")
после вызова ExcApp.Quit Excel благополучно отгружается.
Сделать также на C++Builder не так просто, класс Variant имеет ограниченное число функций.

Variant ExcApp = CreateOleObject("Excel.Application");
...
ExcApp.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs","test.xls");
...
ExcApp.OleProcedure("Quit");

Мне даже не удалось найти пример с открытием файла.
Использовать классы от VC++ тоже не получается, они не стыкуются с VCL.

Help!!!

PS. Функция ExcelApplication->Disconnect(); содержит внутри себя ExcelApplication->Quit(); так что можно не предлагать :)


 
[NIKEL] ©   (2002-02-13 18:41) [1]

Используй OLE.
кидаешь на фому OleContanier и далее

if(OpenDialog->Execute())
{
OleContainer->CreateObjectFromFile(OpenDialog->FileName);
OleContainer->Repaint();
//далее можно...
OleContainer->SaveAsDocument(OpenDialog->FileName);
}

... но с переносимостью такого приложения могут быть проблемы :(


 
nikkie ©   (2002-02-13 19:04) [2]

вариант на дельфи

program Project1;
{$APPTYPE CONSOLE}
uses ActiveX, Excel97;

var
App : ExcelApplication;
begin
CoInitialize(nil);
App := CoExcelApplication.Create;
App.Visible[0] := true;
App.Quit;
App := nil;
CoUninitialize;
end.

если не делать App := nil, то остается процесс excel.exe до тех пор, пока не будет вызван CoUninitialize. более того, если забыть сделать CoUninitialize, то excel.exe так и останется висеть после завершения программы.

не знаю, как там на Builder"e со smart pointers, на крайний случай, просто надо сделать App->Release(). короче, надо сказать excel, что он свободен :)



Страницы: 1 вся ветка

Текущий архив: 2002.04.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.01 c
1-46353
UDS
2002-04-03 23:07
2002.04.15
Одномерный массив. Как заполнить числами от 1 до 10?


3-46281
vladnt
2002-03-26 12:05
2002.04.15
Возникла маленькая проблемка.


1-46450
AFROLOV
2002-04-03 11:21
2002.04.15
Resize форм


14-46511
erwin
2002-03-08 15:25
2002.04.15
как?


6-46478
ECM
2002-02-02 01:03
2002.04.15
Функция InternetDial(…) под Win2K