Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Вниз

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, что он свободен :)




Форум: "WinAPI";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.027 c
4-46541           Poirot                2002-02-07 02:54  2002.04.15  
Как вставить в системное меню POPUP....


14-46504          Blackweber            2002-03-07 00:32  2002.04.15  
Военмех


3-46271           Bill                  2002-03-19 15:08  2002.04.15  
Кто знает аналог StrinGrid?


7-46523           EskimOS               2002-01-21 10:38  2002.04.15  
Работа с большим файлом...


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