Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > работа с Excel в XE2


Автор: Дима 20.12.11, 13:50
перешёл с 2007-го на XE2... Уже кучу проблем поборол и давно радуюсь новому XE2...

Но тут всплыли траблы с работой в Excel. Был создан небольшой класс работающий через OLE с Excel...
Отказывается работать!


Вот кусок кода для примера:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     Variant var_Excel,var_Book,var_Sheet,var_Cell;
     
     var_Excel=Variant::CreateObject("Excel.Application");
     var_Excel.OlePropertySet("Visible",true);
     
     var_Book=var_Excel.OlePropertyGet("Workbooks").OlePropertyGet("Add");
     var_Sheet = var_Book.OlePropertyGet("Worksheets",1);
     var_Sheet.OleProcedure("Activate");
     
     var_Cell = var_Sheet.OlePropertyGet("Range","A1");//НА ЭТОЙ СТРОЧКЕ ОШИБКА
     var_Cell.OlePropertySet("Value","Hello world");
     
     var_Book.OleProcedure("Save");
     var_Excel.OleProcedure("Quit");


при попытке выполнить
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var_Sheet.OlePropertyGet("Range","A1");
вылетает ошибка "EOleSysError Неверный тип переменной"...


в настройках проекта стоит "_TCHAR maps to : char" пробую так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var_Sheet.OlePropertyGet("Range",(wchar_t)"A1");

вообще вылетает OLE error 800A03EC...

Автор: artsb 29.12.11, 08:08
Пробуйте:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var_Cell = var_Sheet.OlePropertyGet(L"Range",L"A1");
    // или
    var_Cell = var_Sheet.OlePropertyGet(L"Range",WideString(L"A1"));

Ещё можно через "Cells"
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    var_Cells = var_Sheet.OlePropertyGet(L"Cells");
    var_Cell = var_Cells.OlePropertyGet(L"Item", _Col_, _Row_);

Автор: Дима 29.12.11, 08:12
Спасибо, к этому времени я уже освоил TApplicationExcel. Оказалась ОЧЕНЬ удобная штука.
Выпадающие списки методов весьма кстати - учитывая то что нет обширной документации по работе с Ole.

Автор: artsb 29.12.11, 08:22
Ясно. У меня XE и в нём нет TApplicationExcel... Хотя помнится, что в более старых версиях он был. Похоже возродили... Или вы установили пакет отдельно?

Автор: Дима 29.12.11, 08:31
Цитата artsb @
У меня XE и в нём нет TApplicationExcel... Хотя помнится, что в более старых версиях он был. Похоже возродили... Или вы установили пакет отдельно?

Его не убрали и не возрождали - просто по умолчанию отключили.
В Project->Options->Packages включил птичку "C++ Builder Office 2000 Servers Package"

Но даже после апдейта хелпа эта птичка опять была выключена. Embarcadero как-бы намекает - пользоваться им не надо :D

Автор: artsb 29.12.11, 09:47
Ах вот оно в чём дело :) Действительно есть такой пакет. Значит, я так "хотел" использовать эти компоненты, что аж прямо поленился их поискать :)
Спасибо.

Автор: vepdl 18.01.12, 10:17
Подскажите где найти TApplicationExcel. Галку включил.

У меня на var_Excel.OleProcedure("Quit"); выбрасывает с Break (First chance exception at $75ABD36F. Exception class $40000015 with message 'system exception (code 0x40000015) at 0x75abd36f'. Process SM.exe (4416)
)

Автор: Дима 20.01.12, 07:16
Цитата vepdl @
Подскажите где найти TApplicationExcel. Галку включил.

После включения галки появляется раздел Office2K. Там и есть TApplicationExcel.

Автор: vepdl 24.01.12, 06:40
Подскажите, где взять документацию для ExcelApplication (желательно с примерами).

Автор: Дима 24.01.12, 19:14
Цитата vepdl @
Подскажите, где взять документацию для ExcelApplication (желательно с примерами).

Google
у Borland-a, а теперь Embarcadero нет описания этих компонентов

Могу дать свой класс работы с Excel, сделанный на основе TApplicationExcel.
Правда там методов там кот наплакал, самое основное что мне надо было. Дописывать буду мере необходимости.

Автор: vepdl 25.01.12, 03:50
Если можно. Спасибо. (vepdl собака mail.ru)

Автор: Vix 11.01.22, 07:14
лечение "EOleSysError Неверный тип переменной":

привести указатель к типу OleVariant

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    void TFExcel::toExcelCell(int Row,int Column, AnsiString data)
    {
        try {
            Sh.OlePropertyGet("Cells", Row,Column).OlePropertySet("Value", (OleVariant)data.c_str());
        } catch(...) {
         ;
        }
    }

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)