oledata.mso

Сегодня разбирался с файлами oledata.mso и editdata.mso

Эти файлы это Word OLE Web Page Storage Stream. Т.е. служат для “описания” объекта, встраиваемого в другой объект через OLE2.

Например, из Outlook вызывается MS Word (как редактор для html-писем) и в тело письма вставляется таблица MS Excel и презенташка PowerPoint.

При этом в письмо будет сохранены такие объекты (для примера выше):
- thumbnail с картинкой-изображением листа таблицы MS Excel (в gif или png формате)
- то же самое для презенташки PowerPoint
- файл с разрешением .wmz, который является банальным zip-архивом, содержащим полноразмерную картинку-изображение листа из MS Excel (в само письмо оно же может быть вставлено с измеренными размерами – типа уменьшено)
- то же самое для презенташки PowerPoint
- файл oledata.mso

Если достать данные из .WMZ-файла не проблема, то расковырять oledata.mso оказалось не так просто. Целый день угробил;-)

Итак:
- файл хранит сжатые (deflate compression) данные
- читаем первые 4 байта. Там хранится длина несжатых данных
- далее до конца файла лежат именно сами сжатые данные.
- раскодируем их с помощью банального ZLib
- получаем несжатый файл, который представляет собой compound storage из нескольких streams
- перебираем их все и каждый из них раскодируем по такому алгоритму, как мы делали с oledata.mso (т.е. читаем 4 байта длины и декодируем через ZLib)

В нашем примере с письмом, мы получим два streams. Один будет содержать таблицу MS Excel, а второй – презенташку.
Открывай их хоть в MS Excel/MS PowerPoint, хоть в другом вьюере, и наслаждайся.

Пару комментариев:
- имя stream-а в раскодированном oledata.mso это ID-объекта, который используется для ссылки. Т.е. в html-коде письма будет ссылка на встраиваемый ole-объект и там будет прописан его ID.
- все это верно не только для писем (.msg). Например, xml-файл из новых .docx/.xlsx (Office 12) использует тот же самый алгоритм для встраивания объектов
- иногда передается не только oledata.mso, но и editdata.mso
У него такая же структура, но в принципе его можно не парсить – там только данные, необходимые для редактирования. Для просмотра данных это не нужно

Comments are closed.