Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

*.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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.035 c
2-1125339298
_M_I_X_
2005-08-29 22:14
2005.10.09
Сохранить Сохранить как....


3-1124864767
Jeka
2005-08-24 10:26
2005.10.09
бд через инет..


6-1118842370
debuger
2005-06-15 17:32
2005.10.09
Сеть. С чем есть?


14-1126006066
A.L.I.E.S
2005-09-06 15:27
2005.10.09
Кто и где работает самый лучший программист


4-1123881571
кактусбел
2005-08-13 01:19
2005.10.09
Добавление пункта в стандартное меню проводника