![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
*.xls и *.doc (Внутрення структура файлов) [D7]
Wolferio © (2005-09-14 17:27:00)Добрый день!
У меня возник такой вопрос. Как роспознать форматы типа *xls и *.doc, если по внутренней структуре они одинаковы (начинаються они с байтов: 1 - $D0,2 - $CF,3 - $11,4 - $E0), не учитывая их росширение.
Спасибо.
Суслик (2005-09-15 11:40:00) [1]defunct
нет бы по делу что-то ответил
Defunct (2005-09-15 04:31:00) [2]> (дело в том, что до сей поры я только создавал biff8, но похоже нужно будет и читать)
Чукча не читатель, чукча - писатель? ;>
Суслик (2005-09-14 19:08:00) [3]Кстати может удасться надыбать тут хорошую доку по biff8?
Есть у кого более детальная чем та, которую дают open office?
(дело в том, что до сей поры я только создавал biff8, но похоже нужно будет и читать)
KilkennyCat (2005-09-14 19:07:00) [4]
> Как мне програмно определить сколько байт в файле(В нутри
> его.)
имеетсмя ввиду что? полезной информации?
> [9] Суслик © (14.09.05 19:03)
> да не придирайся к словам и все.
ок :)
Суслик (2005-09-14 19:03:00) [5]да не придирайся к словам и все.
ясно, что биф никоего отношения к оле не имеет.
Просто биф (как формат данных) они (MS) сохраняют на дистке используя ole.
-------
Описанного явления в excel не замечал.
KilkennyCat (2005-09-14 19:02:00) [6]
> [7] Суслик © (14.09.05 18:57)
Буду :)
Начиная с пятой версии екселя (бифф5, а не бифф8 :) ) происходит инкапсуляция (выдрал из статьи, сам это слово не использую) биффа в оле2.
Но есть хитрость - это не всегда. Когда я разбирал побайтно ексель и ворд, я замечал, что при определенных условиях они сохраняют файл в первородном формате.
Суслик (2005-09-14 18:57:00) [7]
> [6] KilkennyCat © (14.09.05 18:52)
Не придирайся к словам :)
KilkennyCat (2005-09-14 18:52:00) [8]
> Если имеется в виду последние (biff8 или biff8x), то они
> сделаны на основе ole storage.
не верно. Оле - это оле. Бифф - это бифф.
Суслик (2005-09-14 18:00:00) [9]
> [3] Wolferio © (14.09.05 17:54)
странный ты, я же тебе объяснил все - данные самого excel лежат внутри структуры ole stream, которая может иметь произвольный формат. Читай файл ты ничего не добъешься. Нужно читать ole stream.
Суслик (2005-09-14 17:59:00) [10]Типа такого
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;
Wolferio (2005-09-14 17:54:00) [11]Но если определять по внутренней структуре файла, видно что первых 4 байта они одинаковы. Но можна прочиталь *.doc файл с зади (Microsoft Word). Вопрос: Как мне програмно определить сколько байт в файле(В нутри его.)
Суслик (2005-09-14 17:48:00) [12]смотря какая версия 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:47:00) [13]Ну кто нибуть мне поможет?