![]() |
|
Модераторы: bsa |
![]()
|
|
| wallstreet |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Добрый день, подскажите кто знает, как правильно парсить данные в формате xlTable.
Описание формата
Хотелось бы услышать совет с чего начать) На данном этапе я получаю данные в этом формате в массив типа BYTE, хотя возможно необходимо принимать их в char, создавать строку, а потом только парсить. Вобщем кто знает, проясните вопрос плз. Добавлено через 13 минут и 1 секунду поидее если по байтам пройтись циклом, то получится что после байта 0×0010 (tdtTable) второй будет означать кол-во байтов в данных, третий кол-во строк в экспортируемой таблице, а четвертый кол-во полей (столбцов). Только вот может есть функция какая-нибудь для работы с байтами или нет я не знаю? |
|||
|
||||
| wallstreet |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Думаю надо делать как-то так:
Подскажите как это сделать правильно? Хотя бы намек на истину) Это сообщение отредактировал(а) wallstreet - 10.7.2012, 14:16 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Нет, не так. Пусть DataBuf имеет тип BYTE, но это не отменяет того факта, что в начале каждого блока стоят два WORD'а. Вы же всё равно считаете их байтами В начале DataBuf должен идти блок с типом tdtTable, к данным он не относится, лишь сообщает размеры таблицы. 256 - это что такое? Как это сочетается с числом байт в DataBuf? Кстати, где можно увидеть число байт в массиве DataBuf? Где он заканчивается??? Немного ссылок:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
как-то так
Добавлено через 4 минуты и 44 секунды Всегда поражался "дальновидности" мелкомягких... Это ж надо - заложились на более чем 255 типов (!!!) данных в ячейке Добавлено через 10 минут и 42 секунды Учти, НЕ БУДЕТ компилироваться gcc, т.к. по стандарту не разрешено объявлять нулевые массивы. Студия же кушает и не ломается Это сообщение отредактировал(а) borisbn - 10.7.2012, 14:49 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
borisbn
Немного сложнее))) Ячейки могут объединяться в один блок И, по-моему, не float, а double... И ещё нужен контроль длины ячейки и выхода за пределы границы буфера:
А то мало ли какие данные на вход попадут... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
feodorv, да, конечно... сложнее. Я просто дал чушку и напильник
Добавлено через 50 секунд Лень было открывать документацию и досконально изучать, а ТСу это придётся делать -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| wallstreet |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Благодарю за помощь. Пилю гири))
Единственно я немного не понимаю каким образом cells объединяются в блоки?!?!?! К примеру пришел блок (ExcelBlockTable) с размерами таблицы (tableInfo->tdt), затем размер данных (tableInfo->cb) и затем сами данные. Данные заполняются по порядку, сначала первая строка (А1, B1, C1, D1....), потом вторая и тд. Так вот вопрос по объединению ячеек в блок. Правильно ли я понимаю, приходят данные сначала одного типа, потом второго и так далее? Или же приходят изначально построчно данные разных типов подряд, а потом уже, когда таблица заполнена, приходят блоками только те данные которые изменились в таблице??? Моя же задача при этом собирать эти данные, формировать в блоки и вставлять в мой список по их индексу в таблице (типо A1, D3, C2 )? Кстати некоторые импортируемые таблицы постоянно меняют размер, кол-во записей увеличивается постоянно. Отсюда следует что массивы я использовать не могу из-за нестатичности их размера. Использую двумерный список, но слабо представляю как вставлять в него значения по индексу?!?!? |
|||
|
||||
| wallstreet |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
на самом деле немного не понял высказывание:
Если вы намекаете на
то это размер буфера, в который динамически льются данные, мне необходимо их распарсить и уже в нормальном виде вывести в отдельный список. Да обязательные атрибуты занимают ограниченное число байт, но сколько будут занимать данные, я не знаю. Так, на глаз, больше 200 конкретно в моей таблице еще не было, поэтому и поставил с запасом. |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
нет. на то, что под тип данных в ячейке мелкомягкими отведено более одного байта слушай, а как ты выделяешь фон текста ? да ещё и в поле код ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Эээ... Тогда нужно сохранять какое-то состояние чтения из буфера, так как MS не обязана выравнивать xlTable-данные по 256-байтной границе Я давал ссылки на документ с примерами данных и даже кое-какой (пусть и C#) код. Внимательный анализ кода
обнаружит, что во втором цикле нету изменения переменной C. Вот и вопрос на засыпку: куда оно делось? Ну и примеры данных Вам в руки:
Здесь три ячейки объединены в один блок
Да формат не оптимален. Но все почему-то хвалят за оптимальность (наверное, по сравнению с dbf) -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| wallstreet |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
Благодарю за ссылку, многое для себя почрпнул.
Вот на выходных решил переписать код на c++, который вы приводили в качестве примера на с# В принципе приложение компилируется, но при получении данных возникает вредная ошибка
Что это за ошибка и с чем ее едят я уже начитался от и до. Только вот найти не могу нулевой указатель в который якобы происходит попытка записи данных. С помощью breakpoint выследил построчно последнюю строку с которой ошибка не возникает. Если опустить точку брейка ниже на строку, ошибка появляется. Вот собственно код: ConnDecl.h
ConnRealization.cpp (участок коллбека, в котором обрабатываем сообщение об отправке нам данных)
реализация ParseXTbl()
наверняка наскрещивал слонов с носорогами и профи будут в "восторге" от увиденного, но сам никак не могу найти проблемный участок. Если кто свежим взглядом заметит, я буду признателен. |
||||||||
|
|||||||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Ошибки здесь:
Должно быть так:
|
||||
|
|||||
| wallstreet |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
благодарю за участие в теме, но так, увы, не получится т.к. LPWSTR это wchar_t, а не char. А 2 байтный wchar_t никак использовать не могу. Сейчас поменял на:
вроде процесс пошел |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| wallstreet |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 153 Регистрация: 11.8.2011 Репутация: нет Всего: нет |
||||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |