Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Вниз
*.xls и *.doc (Внутрення структура файлов) Найти похожие ветки
← →
Wolferio © (2005-09-14 17:27) [0]Добрый день!
У меня возник такой вопрос. Как роспознать форматы типа *xls и *.doc, если по внутренней структуре они одинаковы (начинаються они с байтов: 1 - $D0,2 - $CF,3 - $11,4 - $E0), не учитывая их росширение.
Спасибо.
← →
Wolferio © (2005-09-14 17:47) [1]Ну кто нибуть мне поможет?
← →
Суслик © (2005-09-14 17:48) [2]смотря какая версия excel.
У них их много. Если имеется в виду последние (biff8 или biff8x), то они сделаны на основе ole storage. То что ты видишь - это данные не самого екселя, а данные ole storage.
Если открыть файл excel как ole stream, то из него можно читать данные.
Формат устроен на основе т.н. записей - заголовк (2 байта, кажется) и данные. Запиши идут последовательно. Первой записью идет BOF. Ее id = $0809.
Как сделано для word - не знаю, но полагаю, что также.
Информация взята из документации с сайта openoffice.org. Откуда конкретно брал не помню - ищи и будет тебе счастье.
PS. Разбараться с Ole storage нужно в msdn по ключевым словам Istram и IStorage. Можешь также поискать реализации использования данных интерфейсов.
← →
Wolferio © (2005-09-14 17:54) [3]Но если определять по внутренней структуре файла, видно что первых 4 байта они одинаковы. Но можна прочиталь *.doc файл с зади (Microsoft Word). Вопрос: Как мне програмно определить сколько байт в файле(В нутри его.)
← →
Суслик © (2005-09-14 17:59) [4]Типа такого
var
kW: WideString;
kStorage: IStorage;
kStream: IStream;
kId: Word;
kCount: LongInt;
begin
kW := WideString("e:\temp\книга1.xls");
try
OleCheck(StgOpenStorage(PWideChar(kW), nil,
STGM_READ or STGM_SHARE_EXCLUSIVE, nil, 0, kStorage));
OleCheck(kStorage.OpenStream("Workbook", nil,
STGM_READ or STGM_SHARE_EXCLUSIVE, 0, kStream));
OleCheck(kStream.Read(@kId, SizeOf(kId), @kCount));
except
ShowMessage("not excel");
abort();
end;
if kid = $0809 then
ShowMessage("excel")
else
ShowMessage("not excel")
end;
← →
Суслик © (2005-09-14 18:00) [5]
> [3] Wolferio © (14.09.05 17:54)
странный ты, я же тебе объяснил все - данные самого excel лежат внутри структуры ole stream, которая может иметь произвольный формат. Читай файл ты ничего не добъешься. Нужно читать ole stream.
← →
KilkennyCat © (2005-09-14 18:52) [6]
> Если имеется в виду последние (biff8 или biff8x), то они
> сделаны на основе ole storage.
не верно. Оле - это оле. Бифф - это бифф.
← →
Суслик © (2005-09-14 18:57) [7]
> [6] KilkennyCat © (14.09.05 18:52)
Не придирайся к словам :)
← →
KilkennyCat © (2005-09-14 19:02) [8]
> [7] Суслик © (14.09.05 18:57)
Буду :)
Начиная с пятой версии екселя (бифф5, а не бифф8 :) ) происходит инкапсуляция (выдрал из статьи, сам это слово не использую) биффа в оле2.
Но есть хитрость - это не всегда. Когда я разбирал побайтно ексель и ворд, я замечал, что при определенных условиях они сохраняют файл в первородном формате.
← →
Суслик © (2005-09-14 19:03) [9]да не придирайся к словам и все.
ясно, что биф никоего отношения к оле не имеет.
Просто биф (как формат данных) они (MS) сохраняют на дистке используя ole.
-------
Описанного явления в excel не замечал.
← →
KilkennyCat © (2005-09-14 19:07) [10]
> Как мне програмно определить сколько байт в файле(В нутри
> его.)
имеетсмя ввиду что? полезной информации?
> [9] Суслик © (14.09.05 19:03)
> да не придирайся к словам и все.
ок :)
← →
Суслик © (2005-09-14 19:08) [11]Кстати может удасться надыбать тут хорошую доку по biff8?
Есть у кого более детальная чем та, которую дают open office?
(дело в том, что до сей поры я только создавал biff8, но похоже нужно будет и читать)
← →
Defunct © (2005-09-15 04:31) [12]> (дело в том, что до сей поры я только создавал biff8, но похоже нужно будет и читать)
Чукча не читатель, чукча - писатель? ;>
← →
Суслик © (2005-09-15 11:40) [13]defunct
нет бы по делу что-то ответил
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c