Формат файла .bin Office 2007

ОГЛАВЛЕНИЕ

Новыми форматами файла Office 2007 являются файлы ZIP, содержащими части, некоторые из которых являются XML, некоторые другие являются родными форматами файлов, такими как изображения JPEG, а остальные двоичные части называются частями BIN. Части BIN представляют особый интерес для потребителя или обновителя формата файла, так как нижележащие форматы файла недокументированы (в момент написания, 10 августа 2006), и надо разобраться с несколькими дополнительными форматами файла.

•    Скачать чтение/запись OLE (C++) - 9 Кб
•    Скачать считыватель BIFF12 (C++) - 404 Кб
•    Скачать чтение/запись OLE (C#) - 10 Кб
•    Скачать считыватель BIFF12 (C#) - 404 Кб

Введение

Новыми форматами файла Office 2007 являются файлы ZIP, содержащими части, некоторые из которых являются XML, некоторые другие являются родными форматами файлов, такими как изображения JPEG, а остальные двоичные части называются частями BIN. Части BIN представляют особый интерес для потребителя или обновителя формата файла, так как нижележащие форматы файла недокументированы (в момент написания, 10 августа 2006), и надо разобраться с несколькими дополнительными форматами файла.

Части BIN появляются в ряде случаев. При вставке макроса VBA или объекта OLE в документ Word 2007, Excel 2007 или Powerpoint 2007 представляют интерес одна или несколько частей BIN. Части BIN являются записями zip, состоящими из файлов с расширением .BIN, которые фактически содержат свой собственный формат файла, зависящий от типа MIME(многоцелевые расширения почты Интернета), определенного в части отношений (xxx.rels) :
•    Макросы VBA: vbaProject.bin (тип MIME: application/vnd.ms-office.vbaProject)
•    Объекты OLE: oleObjectxxx.bin (тип MIME: application/vnd.openxmlformats-officedocument.oleObject)

Пример vbaProject.bin при открытии файла .DOCM Word 2007

 

Пример oleObjectxxx.bin при открытии файла .PPTX Powerpoint 2007

Прежде чем детально изучить эти две части BIN, также есть части BIN, введенные новой разновидностью формата файла Excel 2007, именуемого двоичной книгой Excel, являющейся файлом, заканчивающимся на .XLSB. Видимо, ради производительности было решено хранить файл Excel с помощью нескольких частей BIN вместо частей XML. Те части BIN являются подгруппой частей XML, наиболее страдающих от проблем производительности и масштабируемости, заметней всего страдает каждая книга из-за своего произвольного размера. Отчего-то книга, стили и ряд других мелких частей также являются частями BIN несмотря на то, что они вносят малый вклад в общую обработку книги. Опять же, есть нижележащие форматы файла, с которыми придется иметь дело потребителю и реализатору.

Некоторые части BIN из двоичного файла .XLSB Excel 2007 с 3 листами

Наряду с проектами VBA и встроенными объектами OLE, части BIN есть в файлах .XLSB Excel 2007 по следующим причинам:
•    Часть книги workbook.bin (тип MIME: application/vnd.ms-excel.workbook)
•    Часть словаря тсилей styles.bin (тип MIME: application/vnd.ms-excel.styles)
•    Для каждого листа,
     o    индексная часть worksheets/binaryIndexxx.bin (тип MIME: application/vnd.ms-excel.binIndexWs)
     o    часть листа worksheets/sheetxxx.bin (тип MIME: application/vnd.ms-excel.worksheet)
     o    необязательная часть настроек принтера printerSettings/printerSettingsxxx.bin (тип MIME: application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings)
•    Необязательная часть цепи расчета calcChain.bin (тип MIME: application/vnd.ms-excel.calcChain)
•    Необязательные части комментариев commentsxxx.bin (тип MIME: application/vnd.ms-office.legacyDrawing)
•    Необязательные части таблиц tables/tablexxx.bin (тип MIME: application/vnd.ms-excel.table)
•    Необязательные части соединений connections.bin (тип MIME: application/vnd.ms-excel.connections)
•    Необязательные части листа диаграмм, листа диалога, макротаблицы (chartsheets/sheetxxx.bin, dialogsheets/sheetxxx.bin,macrosheets/sheetxxx.bin) (тип MIME: application/vnd.ms-excel.chartsheet, application/vnd.ms-excel.dialogsheet, application/vnd.ms-excel.macrosheet)
•    Необязательные части сводной таблицы (pivotTables/pivotTablexxx.bin) (тип MIME: application/vnd.ms-excel.pivotTable)
•    Необязательные части определения и записей кэша сводной таблицы (pivotCache/pivotCacheDefinitionxxx.bin,pivotCache/pivotCacheRecordsxxx.bin) (тип MIME: application/vnd.ms-excel.pivotCacheDefinition,application/vnd.ms-excel.pivotCacheRecords)
•    Необязательные таблицы запроса (queryTables/queryTablexxx.bin) (тип MIME: application/vnd.ms-excel.queryTable)

Заметьте, что типы содержимого MIME не различают, хранятся ли фактические файлы в XML или в BIN.

Вне полного списка частей, взятого из спецификаций Ecma, остальные необязательные части формата файла .XLSB Excel 2007 обычно оставляются в виде XML, и, следовательно, такие же, как и у обычных файлов Excel 2007 (.XLSX, .XLSM, ...):
•    Часть темы (theme/themexxx.xml)
•    Часть фонового изображения (drawings/imagexxx.xml)
•    Части основных и специфичных для приложения свойств документа (docProps/core.xml, docProps/app.xml)
•    Часть пользовательских свойств (customproperty.bin)
•    Часть пользовательских отображений XML (xmlMaps.xml)
•    Часть диаграмм (charts/chartxxx.xml)
•    Часть рисунков (drawings/drawingxxx.xml, drawings/legacyDrawingxxx.vml)
•    Часть внешних ссылок книги (externalLinks/externalLinkxxx.xml)
•    Часть метаданных (metadata.xml)
•    Часть ревизий общей книги (revisions/...)
•    Часть одноячеячной таблицы (tables/tableSinceCellsxxx.xml)
•    Часть изменяемых зависмостей (volatileDependencies.xml)

Вышеуказанное значительное исключение – устаревшие рисунки, хранящиеся с применением формата файла VML. Несмотря на то что VML является разметкой XML, его чтение, запись и возможное отображение требуют больших усилий. Когда вставляются устаревшие рисунки, они могут (например, объекты OLE) или не могут (например, комментарий) содержать разметку отношений с другими частями.
Настройки принтера в файлах Excel 2007 всегда хранятся в виде частей BIN, будь то .XLSB или нет.

Чтение или обновление частей vbaProject.bin

В предыдущих версиях Word, Excel и Powerpoint проекты VBA хранились в виде подконтейнерв OLE контейнера документа OLE. Файлы .doc / .dot / .xls / .xlt / .xlm / .xla / .ppt / .pot / .ppm / .ppa являются контейнерами документа OLE. Как показано ниже, был создан документ Word 97, и в него был добавлен макрос VBA. Обратите внимание на подконтейнер макросов. Он содержит контейнер VBA, содержащий несколько потоков, а также еще два потока.

Чтобы просмотреть контейнер документа OLE, можно использовать одну из частей инструментов Visual Studio 6.0, называемую просмотрщик DocFile, или просмотрщик OLE, свободно доступный здесь.

В предыдущих версиях Word макросы VBA хранились в виде подконтейнера OLE (макросы) вместе с несколькими потоками.

Двойной щелчок по потоку раскроет его фактическое содержимое. Разумеется, каждый поток сам является форматом файла, на что надо обратить особое внимание при его чтении или обновлении. Базовый сценарий – заменить один поток на другой, не предполагающий, что известно, из чего состоят сами потоки.

Вернемся к Word 2007, Excel 2007 и Powerpoint 2007. Можно извлечь запись zip vbaProject.bin из файла с помощью вставленного макроса VBA и открыть его в просмотрщике OLE. Удивляет, что появляется следующее:

 

vbaProject.bin - содержимое определенного выше контейнера макросов.

Для чтения или обновления частей vbaProject.bin нужны вызовы родного API, представленного IStream для потоков и IStorage для контейнеров. Как примечание, обязательное использование вызовов родного API не позволяет исполнять клиентский код в среде частичного доверия, такой как Однократное нажатие: исполнение родного кода предполагает полное доверие.

Вверху статьи находится пример кода, считывающий произвольный контейнер OLE с помощью C++ и C#.

Чтение или обновление частей oleObjectxxx.bin

Сродни частям vbaProject.bin, части oleObjectxxx.bin являются подконтейнерами OLE. Можно просмотреть содержимое файла посредством того же инструмента (просмотрщик файла Doc или аналогичный), и можно прочитать или обновить файл с помощью того же исходного кода, представленного в предыдущем разделе.

В качестве примера создается простой документ Excel 97, в него вставляется объект OLE (к примеру, документ Wordpad), затем он закрывается, и полученный файл .xls просматривается в просмотрщике OLE. Обратите внимание на подконтейнер MBD0032B277 с двумя потоками внутри:

 

В предыдущих версиях офиса встроенные объекты OLE хранятся в виде подконтейнеров (MBD0032B277) файла OLE.

Вернемся к Word 2007, Excel 2007 или Powerpoint 2007. Извлеките часть oleObjectxxx.bin из любого файла, куда был вставлен объект OLE, откройте его в просмотрщике OLE, чтобы увидеть нечто аналогичное:

 

oleObjectxxx.bin – содержимое определенного выше контейнера MBD0032B277.

Части BIN в новых форматах файла содержат разные нижележащие структуры, хоть и имеют общие интерфейсы для ее обхода (IStream/IStorage). Для чтения и обновления частей макросов VBA и частей объектов OLE нужны интерфейсы к IStream и IStorage, и, вероятно, знание нижележащего содержимого потоков (не требуется в случае базовой замены). Это одинаково распространяется на Word, Excel и Powerpoint.

Однако в двоичных книгах Excel 2007 другие части BIN не соблюдают структуру и содержимое.