Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1124779315
ru_efim
2005-08-23 10:41
2005.10.09
Помогите разобраться с методом BookmarkValid у TADOQuery


9-1117475173
WandR
2005-05-30 21:46
2005.10.09
Проблема с затекстуриванием


4-1123743511
Ботвин Дмитрий
2005-08-11 10:58
2005.10.09
Раздел импорта ехе-файла


3-1125324617
Maverick
2005-08-29 18:10
2005.10.09
физическое хранение информации в MSSQL


14-1127143097
TUser
2005-09-19 19:18
2005.10.09
PCI-Express vs AGP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский