Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чтение из Excel в Builder


Автор: Ozerman 5.7.2004, 05:06
Записываю в Excel файл данные без труда:
Variant ExcelApp;
ExcelApp = CreateOleObject("Excel.Application");
ExcelApp.OlePropertyGet("Workbooks").OlePropertyGet("Add");
ExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open", "c:\\File.xls");
ExcelApp.OlePropertyGet("Range", "A1:C2").OlePropertySet("Value", "111");
ExcelApp.OlePropertyGet("Workbooks", 1).OlePropertyGet("Save");
ExcelApp.OlePropertyGet("Workbooks").OlePropertyGet("Close");
ExcelApp.Clear();


Но прочитать эти же данные не могу:
Variant ExcelApp;
ExcelApp = CreateOleObject("Excel.Application");
ExcelApp.OlePropertyGet("Workbooks").OlePropertyGet("Add");
ExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open", "c:\\File.xls");
Variant value;
//пробовал так
ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value", value);
//и так
ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Value", value);
//в отладчике value = { ??? }
ExcelApp.OlePropertyGet("Workbooks").OlePropertyGet("Close");
ExcelApp.Clear();

Что делать???

Автор: Олег М 5.7.2004, 09:02
Борландовские объекты, к сожалению не видел. Вообще непонятно нахрена ты автоматизацией пользуешся, а не вызываешь оле-бъекты напрямую. Бейсик что-ли?
Цитата
ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Value", value);

Покажи какие типы параметров у OlePropertyGet. ССылка на вариант?

Автор: Ozerman 5.7.2004, 12:23
Объектов я никаких, кроме описанных выше, не использую. Всё, что мне надо, должно работать и без форм. Типы параметров у OlePropertyGet... Пошутил что-ли??? Там куча всякой лажы, о которой однозначно ничего не скажешь. Чтобы работать с этой функцией, нужно знать OLE Excel, чем позвастаться не могу.

Может быть, правда, я тебя вообще не понял, за что прошу извинить. А может быть и мой вопрос не понятен.

В-общем - не шарю в OLE + Excel + Builder, и помощи не знаю где искать.
Если сможешь помочь прочитать кучу данных из Excel таблиц другим способом, буду несоразмерно благодарен!!!

Автор: Олег М 5.7.2004, 12:34
Цитата
Объектов я никаких, кроме описанных выше, не использую. Всё, что мне надо, должно работать и без форм. Типы параметров у OlePropertyGet... Пошутил что-ли??? Там куча всякой лажы, о которой однозначно ничего не скажешь. Чтобы работать с этой функцией, нужно знать OLE Excel, чем позвастаться не могу.

Из хёдера вытащи объявления OlePropertyGet, который с вариантом и покажи - у меня просто здесь нифига нет.


Цитата
В-общем - не шарю в OLE + Excel + Builder, и помощи не знаю где искать.
Если сможешь помочь прочитать кучу данных из Excel таблиц другим способом, буду несоразмерно благодарен!!!


Ты сейчас делаешь с помощью автоматизации ОЛЕ, которая разработана специально для языков типа бейсик.
В с++ можно получать указатели на интерфейсы и вызывать методы как у обычных классов. Собственно это и будут обычные классы. Для этого надо импортировать библиотеку типов.
Кроме того всё что делаешь в ручную - делается автоматически - создаются классы, методы и т.д. Вручную этого никто не делает.

Не знаю как это делается в борланде - поищи, я в вижуале не помню - там, то ли pragma import или что-то ещё. Короче в сишный файл подцепляешь dll или tlb и всё

Автор: Ozerman 6.7.2004, 02:19
Variant OlePropertyGet(const String& name, TAutoArgsBase* args = 0);
template <class P1> Variant OlePropertyGet(const String& name, P1 p1);
template <class P1, class P2> Variant OlePropertyGet(const String& name, P1 p1, P2 p2);
template <class P1, class P2, class P3> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3);

template <class P1, class P2, class P3, class P4> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4);
template <class P1, class P2, class P3, class P4, class P5> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5);
template <class P1, class P2, class P3, class P4, class P5, class P6> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6);

template <class P1, class P2, class P3, class P4, class P5, class P6, class P7> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7);
template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8);

template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9);
template <class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9, class P10> Variant OlePropertyGet(const String& name, P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8, P9 p9, P10 p10);

Нравится??? Вот и мне тожа!

Автор: Олег М 6.7.2004, 08:42
И что непонятного?
Цитата
ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value", value);

Здесь скорее всего передаётся не сыылка на вариант, а копия, которая при возврате из функции удаляется.
Сделай
Код
ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value", &value)

всё скорее всего заработает

Автор: Олег М 6.7.2004, 11:30
Или, на худой конец, так:
Код
value=ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value", value);

Добавлено @ 11:32
Или ваще так
Код
value=ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value");

Посмотри в хелпе, в конце концов

Автор: Ozerman 6.7.2004, 16:15
УРА!!! Свершилось!!!

Variant value;

value = ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value");//считывает значение из ячейки [1, 1] (1-я строка, 1-ый столбец)

value = ExcelApp.OlePropertyGet("Range", "A2").OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value");//считывает значение из ячейки [2, 1]

value = ExcelApp.OlePropertyGet("Range", "A1").OlePropertyGet("Cells", 1, 2).OlePropertyGet("Value");//считывает значение из ячейки [1, 2]

Спасибо за подсказку!!!

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