Главная страница
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.008 c
1-46375
Тема
2002-04-01 19:07
2002.04.15
Какую книгу выбрать


4-46542
slym
2002-02-12 17:23
2002.04.15
Как из массива байтов сделать битмап?


4-46545
fddiynic
2002-02-13 04:10
2002.04.15
winaip32


1-46356
андрей Татуков
2002-04-04 10:46
2002.04.15
RichEdit.Print зависает (бесконечный Спулинг)


1-46328
Reals
2002-04-03 20:12
2002.04.15
Проблема с отладкой ISAPI приложения.