![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Gunslinger |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Снова привет! И снова речь о MyCells
Оказалось, что четыре координаты x1,y1,x2,y2 использовать не получится. Прочитать значение 2х объединенных ячеек в экселе возможно только через диапазон, и работает эта штука так:
Общий план:
Сейчас проверяются ячейки только одинарные. А нужно еще объединенные по 2. Было бы здорово указывать напрямую, но в ОLE штука вроде
Вызывает ошибку недопустимое число параметров. Мои варианты: 1. Хранить координаты ячейки как енум - для буквы соответствие цифра. 2. Затем все соединять в строку. Или может нах не париться и хранить адреса объектов MyCells как строки (они все равно используются только для сравнения), а перед передачей Оле - делать конкатенацию? Тогда нельзя будет делать парсинг по листу forом (тогда делать через енум или еще чего-нибудь в с++, о чем я не знаю). |
||||||
|
|||||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
excel можно переключить в режим адресации R1C1
|
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Знаешь как? Нечто вроде
выдает ошибку. Это сообщение отредактировал(а) Gunslinger - 21.10.2008, 09:57 |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Насколько я помню ничего переключать не надо, он и так воспримет адресацию в любом формате. Только R1C1 ничем не проще, чем A1, диапазон придется задавать все так же в виде 2х точек через ':' (R1C1:R2C2) А что касается диапазона, то проще всего сделать класс для хранения координат (у тебя Address) и сделать ему метод, возвращающий этот адрес в виде строки
Это сообщение отредактировал(а) xvr - 21.10.2008, 10:15 |
||||||
|
|||||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
xvr, а я сейчас отписывать в тему про OLE собрался
Уточненяюсь: R1C1 выглядит как, например, 12,1? Это сообщение отредактировал(а) Gunslinger - 21.10.2008, 10:29 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Нет, оно выглядит как R12C1 |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
ошибка. С одним адресом - тоже. Точно режим переключать не нужно? Добавлено @ 09:53 вижу 2 варианта: 1. Адресация А8:B8. Тогда нужно что-то думать о конвертации букв в цифры. 2. R1C8:R2C8. Нужно думать только о парсинге строки и выдерании цифр. При записи - о конкатенации букв R,C,: с преобразованными в символы цифрами. Но тут проще, так как есть стандартный IntToStr. Это сообщение отредактировал(а) Gunslinger - 22.10.2008, 09:53 |
|||
|
||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Да, действительно нужно
У Application есть метод ConvertFormula, может пригодится:
|
||||||||||
|
|||||||||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
за ConvertFormula спасибо - запомню, если понадобится. К счастью не в этом проекте. И вообще не понадобится - запарил меня уже этот эксел, хочу уже программировать что-нибудь другое. Про засаду R1C1 тоже спасибо, а то я уже сравнение написал.
Для меня пока нет. Единственная мысль - enum. Но при этом хочу оставить адресную структуру как есть, т.е. int x2, y2;. Можно ли присвоить номер enuma? Вроде:
? |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
Gunslinger, скажите что вам нужно конкретно от экселя я вам пример сделаю пока время есть.
|
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
J0ker, спасибо за желание помочь, но с этим форумом я и так обленился. Смысл мысли такой:
1. Oбъединенные ячейки можно читать только через Range. А там адрес в формате A1:B1. 2. Есть класс MyCell, сварганенный общими силами. Это - контрольные ячеки, в которых хранится адрес и значение стопудово известных ячеек в экселе. Чтобы проверить, та структура файла, прежде чем читать, или нет. 3. Можно было бы хранить адреса в текстовом формате, как и Range, а сравнивать текст. Но! далее будет чтение записей. Сколько их будет - хз, так что чтение ячеей делать буду в for. Приростил x,y. Значит придется конвертировать int в string. C конвертером я сам разбирусь, вот только не уверен, можно ли хранить связку буква-цифра в enum (псевдокод в предыдущем посте) - с ним никогда не работал. Вот это меня интересует. |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
я не совсем понял что вы хотите делать с enum - enum это простая подстановка выполняемая на этапе компиляции
остальное чуть позже гляну ковырялся я сто лет назад с экселем через COM может вспомню... Добавлено через 2 минуты и 34 секунды
если это конкретный документ или документ основанный на конкретном темплете - я применял именованные объекты - в экселе вы можете поименовать ячейки и рэнджи и потом обращаться к ним по имени |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
вот сваял пример - visual studio - борланда нету... но принцип должен быть тем-же:
Добавлено @ 02:41 PS: я использовал import для упрощения решения, но в принципе можно и руками прописать все обращения к дисп-интерфейсу - но это геморно я там вижу у вас на борланде тоже своя оболочка, так что должно быть похоже Добавлено @ 02:44 PPS: да чуть не забыл - оно коннектится к запущеному приложению и читает ячейку A1 с активной страницы активной книги. Там где закоментаренное CreateInstance - можно создавать новый инстанс, соответственно он будет пустой - без книг. Добавлено @ 02:49 PPPS:что-бы было понятно - такие вызовы как _bstr_t v = pSheet->Cells->Item[1][1]; - означают вызов pSheet->GetCells()->GetItem(...) с соответствующими параметрами - они просто в VC++ организованы через праперти - microsoft specific PPPPS поправил немного Это сообщение отредактировал(а) J0ker - 23.10.2008, 04:33 |
|||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Цель кода только не понял. За раз все равно не даст обратиться сразу к двум ячейкам (по крайней мере, через Cells, а с Range опять приходим к вопросу конвертации буква-цифра и наоборот).
з.ы. По вашему коду вопрос. В борланде ничего подобного вроде ActiveWorkbook, ActiveSheet не делал... Хотя через Оле работал, там через проперти брал сразу "Workbooks", "Cells" и т.д. За меня борлан делает такую подстановку или это способ обращения другой? |
||||
|
|||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Присвоить можно, а преобразовать в строку - нет (получится обычное число) Вот функция, преобразующая номер в букву (или несколько) (Писал прямо тут, не проверял)
Добавлено через 5 минут и 49 секунд
В Borland'е надо брать компонент ExcelApplication с вкладки Office2K (или OfficeXP, смотря какой набор контролов активирован), там будет сразу все в виде нормальных пропертей и методов |
||||||||
|
|||||||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
?Я никаких компонентов не брал. Только comobj.hpp подключил. Короче говоря, никаких сложных хитровытраханностей - тупой перебор. О откуда 676? |
|||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
методы MyCells:
Пишет неверный тип переменной:(. Показывает, похоже, на последнюю строку. Добавлено @ 17:07 методы MyCells:
Пишет неверный тип переменной:(. Показывает, похоже, на последнюю строку. Это сообщение отредактировал(а) Gunslinger - 23.10.2008, 17:07 |
||||
|
|||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
А надо было взять
Добавлено @ 17:16
Правильно пишет - в IntToStr(R_C[addr.y1]) вызов IntToStr лишний И вообще, ConvAddress сделан витеевато и неправильно (x и y перепутаны местами) -
Это сообщение отредактировал(а) xvr - 23.10.2008, 17:17 |
||||||||||
|
|||||||||||
| J0ker |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
у объединенных ячеек адрес левой верхней всегда!!! Добавлено через 12 минут и 1 секунду
если вы передавали имя праперти через строку (т.е. параметр как "ActiveWorkbook") - то борланд предоставляет общую оболочку к методу Invoke интерфейса IDispatch. Если вы вызывали как метод (т.е. ->GetActiveWorkbook()) - то у борланд генерит интерфейсный класс, и вызов каждого метода такого класса уходит в IDispatch->Invoke VS берет либо файл содержащий COM класс либо файл содержащий описания типов и генерит (посредством #import) на лету хедер+имплементацию класса оболочки - все праперти заключаются в праперти VC++ - это microsoft specific фича - в стандартном С++ они могут быть реализованы только через функции Get/Set |
||||
|
|||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
нифига! 3 объединенные ячейки с текстом в центре. если вывести первую ячейку - будет пустая строка.
серьезно или шутишь? Первая координата - по вертикали, цифра. Пробую передать:
Выдает неверный тип переменной. Если же в оле указывать, например, N7 - все нормально. Аргументом не может быть переменная? |
|||
|
||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
||||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Серьезно. На этой вкладке находятся специально подготовленные для использования в Builder'е ActiveX контролы из Оффиса. Т.е. с их помощью можно вместо myWorkSheet.OlePropertyGet("Range", XlsAddr).OlePropertyGet("value") сразу писать myWorkSheet->Range[XlsAddr]->value
|
||||||||
|
|||||||||
| Gunslinger |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Так нормально:
А так вышибает билдер нафиг с "Неверный тип переменной":
|
||||||
|
|||||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
да уж VC намного упрощает жисть Добавлено через 4 минуты и 51 секунду кстати, я подозреваю (и даже помню!!!), что у мелкософта есть утилита, генерирующая переносимые обертки для библиотек типов и я думаю что #import именно ее и запускает поковыряйтесь на MSDN на тему MIDL компилятора |
|||
|
||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
А myWorkSheet это уже конечный Worksheet или коллекция Worksheets? Видимо второе, несмотря на название переменной. (Хотя если у вас у обозначает столбцы а х строки, то уж на название других переменных можно сразу закрывать глаза Настоятельно рекомендую перейти на компоненты с вкладки Office, масса вопросов сразу отпадет сама собой. Добавлено через 2 минуты и 20 секунд
У BCB это тоже есть, и уже готовое. Видимо аффтору важен процесс, а не результат
|
||||||||||||
|
|||||||||||||
| J0ker |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 4 Всего: 14 |
да похоже вы правы - не смог найти как это запустить отдельно
неужели они не вынесли это в отдельный тул??? но в любом случае нужны мелкософтовские библиотеки (или их порты), т.к. в сгенеренных исходниках используются специальные умные указатели и обертки для исключений... |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Очень похоже, что этим занимается какая нибудь dll в составе компилятора Intel'овский компилятор не умеет генерить этот код, поэтому он запускает Microsoft'овский cl для его генерации, перехватывает промежуточные исходники с внедренном кодом от cl и компилит уже их.
|
||||
|
|||||
| Gunslinger |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
точно, WorkSheets.
Завтра проверю.
Да мне уж хоть результат. |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |