Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача адреса как диапазона в экселе, какими средствами с++ лучше это сделать? 
:(
    Опции темы
Gunslinger
Дата 23.10.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(xvr @  23.10.2008,  11:36 Найти цитируемый пост)
В Borland'е надо брать компонент ExcelApplication с вкладки Office2K (или OfficeXP, смотря какой набор контролов активирован), там будет сразу все в виде нормальных пропертей и методов

?Я никаких компонентов не брал. Только comobj.hpp подключил.
Цитата(xvr @  23.10.2008,  11:36 Найти цитируемый пост)
Вот функция, преобразующая номер в букву (или несколько)
 Короче говоря, никаких сложных хитровытраханностей - тупой перебор. О откуда 676?

PM MAIL   Вверх
Gunslinger
Дата 23.10.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



методы MyCells:
Код

            String ConvAddress()
                              {
                                  String R_C="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                                  String for_addr;
                                  if(addr.y1<26)
                                        for_addr=IntToStr(R_C[addr.y1])+IntToStr(addr.x1);
                                  if((addr.y2!=0)&&
                                      (addr.y2<26))
                                        for_addr=+":"+IntToStr(R_C[addr.y2])+IntToStr(addr.x2);
                                  return for_addr;
                               };
           bool IsTextValue(Variant& myWorkSheet)
                       {
                          AnsiString buff_text;
                          Variant buff_cell;
                          String for_address=ConvAddress(); 
                           buff_cell=myWorkSheet.OlePropertyGet("Range", for_address);
                           buff_text=buff_cell.AsType(varString);
                           if(Text==buff_text) return true;
                                      else return false;
};

Пишет неверный тип переменной:(. Показывает, похоже, на последнюю строку.

Добавлено @ 17:07
методы MyCells:
Код

            String ConvAddress()
                              {
                                  String R_C="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                                  String for_addr;
                                  if(addr.y1<26)
                                        for_addr=IntToStr(R_C[addr.y1])+IntToStr(addr.x1);
                                  if((addr.y2!=0)&&
                                      (addr.y2<26))
                                        for_addr=+":"+IntToStr(R_C[addr.y2])+IntToStr(addr.x2);
                                  return for_addr;
                               };
           bool IsTextValue(Variant& myWorkSheet)
                       {
                          AnsiString buff_text;
                          Variant buff_cell;
                          String for_address=ConvAddress(); 
                           buff_cell=myWorkSheet.OlePropertyGet("Range", for_address);};

Пишет неверный тип переменной:(. Показывает, похоже, на последнюю строку.

Это сообщение отредактировал(а) Gunslinger - 23.10.2008, 17:07
PM MAIL   Вверх
xvr
Дата 23.10.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Gunslinger @ 23.10.2008,  11:55)
Цитата(xvr @  23.10.2008,  11:36 Найти цитируемый пост)
В Borland'е надо брать компонент ExcelApplication с вкладки Office2K (или OfficeXP, смотря какой набор контролов активирован), там будет сразу все в виде нормальных пропертей и методов

?Я никаких компонентов не брал. Только comobj.hpp подключил.

А надо было взять  smile 

Цитата

Цитата(xvr @  23.10.2008,  11:36 Найти цитируемый пост)
Вот функция, преобразующая номер в букву (или несколько)
 Короче говоря, никаких сложных хитровытраханностей - тупой перебор. 
Да

Цитата

О откуда 676?
26*26

Добавлено @ 17:16
Цитата(Gunslinger @ 23.10.2008,  17:06)
методы MyCells:
Код

            String ConvAddress()
                              {
                                  String R_C="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                                  String for_addr;
                                  if(addr.y1<26)
                                        for_addr=IntToStr(R_C[addr.y1])+IntToStr(addr.x1);
                                  if((addr.y2!=0)&&
                                      (addr.y2<26))
                                        for_addr=+":"+IntToStr(R_C[addr.y2])+IntToStr(addr.x2);
                                  return for_addr;
                               };

Пишет неверный тип переменной:(. Показывает, похоже, на последнюю строку.

Правильно пишет - в IntToStr(R_C[addr.y1]) вызов IntToStr лишний

И вообще, ConvAddress сделан витеевато и неправильно (x и y перепутаны местами) - 
Код

String ConvAddress()
{
  String for_addr;
  for_addr.printf("%c%d",addr.x1+'A'-1,addr.y1);
  if( addr.y2 && addr.y2<26)  for_addr.cat_printf(":%c%d",addr.x2+'A'-1,addr.y2);
   return for_addr;
}



Это сообщение отредактировал(а) xvr - 23.10.2008, 17:17
PM MAIL   Вверх
J0ker
Дата 23.10.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Gunslinger @  23.10.2008,  08:23 Найти цитируемый пост)
Цель кода только не понял. За раз все равно не даст обратиться сразу к двум ячейкам (по крайней мере, через Cells, а с Range опять приходим к вопросу конвертации буква-цифра и наоборот).

у объединенных ячеек адрес левой верхней всегда!!!

Добавлено через 12 минут и 1 секунду
Цитата(Gunslinger @  23.10.2008,  08:23 Найти цитируемый пост)
з.ы. По вашему коду вопрос. В борланде ничего подобного вроде ActiveWorkbook, ActiveSheet не делал... Хотя через Оле работал, там через проперти брал сразу "Workbooks", "Cells" и т.д. За меня борлан делает такую подстановку или это способ обращения другой?

если вы передавали имя праперти через строку (т.е. параметр как "ActiveWorkbook") - то борланд предоставляет общую оболочку к методу Invoke интерфейса IDispatch. Если вы вызывали как метод (т.е. ->GetActiveWorkbook()) - то у борланд генерит интерфейсный класс, и вызов каждого метода такого класса уходит в IDispatch->Invoke
VS берет либо файл содержащий COM класс либо файл содержащий описания типов и генерит (посредством #import) на лету хедер+имплементацию класса оболочки - все праперти заключаются в праперти VC++ - это microsoft specific фича - в стандартном С++ они могут быть реализованы только через функции Get/Set


--------------------
user posted image
PM MAIL   Вверх
Gunslinger
Дата 27.10.2008, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(J0ker @  23.10.2008,  17:47 Найти цитируемый пост)
у объединенных ячеек адрес левой верхней всегда!!!
нифига! 3 объединенные ячейки с текстом в центре. если вывести первую ячейку - будет пустая строка.

Цитата(xvr @  23.10.2008,  17:10 Найти цитируемый пост)
А надо было взять
 серьезно или шутишь?

Цитата(xvr @  23.10.2008,  17:10 Найти цитируемый пост)
(x и y перепутаны местами) 
 Первая координата - по вертикали, цифра.

Пробую передать:
Код

void SetTextFromAddr(Variant& myWorkSheet,String XlsAddr)
            {
               Variant buff_cell;
               String buff_text;
               buff_cell=myWorkSheet.OlePropertyGet("Item",1).OlePropertyGet("Range", XlsAddr).OlePropertyGet("value");// 1).OlePropertyGet("Range",
               buff_text=buff_cell.AsType(varString);
               Text=buff_text;
            };

Выдает неверный тип переменной. Если же в оле указывать, например, N7 - все нормально.
Аргументом не может быть переменная?
PM MAIL   Вверх
J0ker
Дата 27.10.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Gunslinger @  27.10.2008,  14:21 Найти цитируемый пост)
нифига! 3 объединенные ячейки с текстом в центре. если вывести первую ячейку - будет пустая строка.

user posted image
user posted image
user posted image



--------------------
user posted image
PM MAIL   Вверх
xvr
Дата 27.10.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Gunslinger @ 27.10.2008,  14:21)
Цитата(xvr @  23.10.2008,  17:10 Найти цитируемый пост)
А надо было взять
 серьезно или шутишь?


Серьезно. На этой вкладке находятся специально подготовленные для использования в Builder'е ActiveX контролы из Оффиса. Т.е. с их помощью можно вместо myWorkSheet.OlePropertyGet("Range", XlsAddr).OlePropertyGet("value") сразу писать myWorkSheet->Range[XlsAddr]->value
Цитата

Цитата(xvr @  23.10.2008,  17:10 Найти цитируемый пост)
(x и y перепутаны местами) 
 Первая координата - по вертикали, цифра.
Ну если x обозначает координату по ВЕРТИКАЛИ, то все Ок. Однако это несколько неожиданно  smile 

Цитата

Пробую передать:
Код

void SetTextFromAddr(Variant& myWorkSheet,String XlsAddr)
            {
               Variant buff_cell;
               String buff_text;
               buff_cell=myWorkSheet.OlePropertyGet("Item",1).OlePropertyGet("Range", XlsAddr).OlePropertyGet("value");// 1).OlePropertyGet("Range",
               buff_text=buff_cell.AsType(varString);
               Text=buff_text;
            };

Выдает неверный тип переменной. Если же в оле указывать, например, N7 - все нормально.
Аргументом не может быть переменная?
Может, но OlePropertyGet("Item",1) в myWorkSheet.OlePropertyGet("Item",1).OlePropertyGet("Range", XlsAddr).OlePropertyGet("value") лишняя

PM MAIL   Вверх
Gunslinger
Дата 30.10.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(xvr @  27.10.2008,  19:05 Найти цитируемый пост)
OlePropertyGet("Item",1) в myWorkSheet.OlePropertyGet("Item",1).OlePropertyGet("Range", XlsAddr).OlePropertyGet("value") лишняя

Так нормально:
Код

buff_cell=myWorkSheet.OlePropertyGet("Item",1).OlePropertyGet("Range","F8").OlePropertyGet("value");


А так вышибает билдер нафиг с "Неверный тип переменной":
Код

buff_cell=myWorkSheet.OlePropertyGet("Range", XlsAddr).OlePropertyGet("value");



PM MAIL   Вверх
J0ker
Дата 30.10.2008, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(Gunslinger @  30.10.2008,  12:17 Найти цитируемый пост)
А так вышибает билдер нафиг с "Неверный тип переменной":

да уж
VC намного упрощает жисть  smile

Добавлено через 4 минуты и 51 секунду
кстати, я подозреваю (и даже помню!!!), что у мелкософта есть утилита, генерирующая переносимые обертки для библиотек типов
и я думаю что #import именно ее и запускает
поковыряйтесь на MSDN на тему MIDL компилятора


--------------------
user posted image
PM MAIL   Вверх
xvr
Дата 30.10.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(Gunslinger @ 30.10.2008,  12:17)
Цитата(xvr @  27.10.2008,  19:05 Найти цитируемый пост)
OlePropertyGet("Item",1) в myWorkSheet.OlePropertyGet("Item",1).OlePropertyGet("Range", XlsAddr).OlePropertyGet("value") лишняя

Так нормально:
Код

buff_cell=myWorkSheet.OlePropertyGet("Item",1).OlePropertyGet("Range","F8").OlePropertyGet("value");


А так вышибает билдер нафиг с "Неверный тип переменной":
Код

buff_cell=myWorkSheet.OlePropertyGet("Range", XlsAddr).OlePropertyGet("value");

А myWorkSheet это уже конечный Worksheet или коллекция Worksheets? Видимо второе, несмотря на название переменной. (Хотя если у вас у обозначает столбцы а х строки, то уж на название других переменных можно сразу закрывать глаза  smile )

Настоятельно рекомендую перейти на компоненты с вкладки Office, масса вопросов сразу отпадет сама собой.

Добавлено через 2 минуты и 20 секунд
Цитата(J0ker @ 30.10.2008,  17:51)
Цитата(Gunslinger @  30.10.2008,  12:17 Найти цитируемый пост)
А так вышибает билдер нафиг с "Неверный тип переменной":

да уж
VC намного упрощает жисть  smile

У BCB это тоже есть, и уже готовое. Видимо аффтору важен процесс, а не результат  smile 

Цитата

Добавлено @ 17:56
кстати, я подозреваю (и даже помню!!!), что у мелкософта есть утилита, генерирующая переносимые обертки для библиотек типов
и я думаю что #import именно ее и запускает
поковыряйтесь на MSDN на тему MIDL компилятора
MIDL - это в другую сторону, idl он не сделает (хотя тулза есть - OleView например)

PM MAIL   Вверх
J0ker
Дата 30.10.2008, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



да похоже вы правы - не смог найти как это запустить отдельно
неужели они не вынесли это в отдельный тул???
но в любом случае нужны мелкософтовские библиотеки (или их порты), т.к. в сгенеренных исходниках используются специальные умные указатели и обертки для исключений...


--------------------
user posted image
PM MAIL   Вверх
xvr
Дата 31.10.2008, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(J0ker @ 30.10.2008,  21:26)
да похоже вы правы - не смог найти как это запустить отдельно
неужели они не вынесли это в отдельный тул???

Очень похоже, что этим занимается какая нибудь dll в составе компилятора  smile Судя по истории с поддержкой attributed генерации IDispatch::invoke (когда cl генерит от себя код) в Intel компиляторе, это вполне вероятно.
Intel'овский компилятор не умеет генерить этот код, поэтому он запускает Microsoft'овский cl для его генерации, перехватывает промежуточные исходники с внедренном кодом от cl и компилит уже их.  smile 

Цитата

но в любом случае нужны мелкософтовские библиотеки (или их порты), т.к. в сгенеренных исходниках используются специальные умные указатели и обертки для исключений...
Угу, поэтому лучше пользовать родную для BCB разновидность.
PM MAIL   Вверх
Gunslinger
Дата 31.10.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(xvr @  30.10.2008,  21:00 Найти цитируемый пост)
А myWorkSheet это уже конечный Worksheet или коллекция Worksheets? Видимо второе, несмотря на название переменной. 

точно, WorkSheets.
Цитата(xvr @  30.10.2008,  21:00 Найти цитируемый пост)

(Хотя если у вас у обозначает столбцы а х строки, то уж на название других переменных можно сразу закрывать глаза  smile )

 smile 

Цитата(xvr @  30.10.2008,  21:00 Найти цитируемый пост)

Настоятельно рекомендую перейти на компоненты с вкладки Office, масса вопросов сразу отпадет сама собой.

Завтра проверю.

Цитата(xvr @  30.10.2008,  21:00 Найти цитируемый пост)

У BCB это тоже есть, и уже готовое. Видимо аффтору важен процесс, а не результат

Да мне уж хоть результат. smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.