Форум: "WinAPI";
Текущий архив: 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, что он свободен :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.117 c