Формат файла .bin Office 2007 - Часть общих строк

ОГЛАВЛЕНИЕ

Часть общих строк

Часть общих строк просто индексирует строки, чтобы разложить на множители строки, неоднократно используемые в листах или других частях (например, заголовок диаграммы). Это затрудняет чтение BIFF12, так как часть общих строк надо прочитать перед чтением других частей, таких как листы, в противном случае есть шанс, что будет невозможно разобраться во встречаемых индексах строк.
Часть общих строк также применяется для хранения богатых строк, т.е. строк, где применяется несколько стилей форматирования, иначе называемых "прогоны форматирования".

Тогда как XML-описание прогонов форматирования очень похоже на то, что в Word, BIN-описание очень похоже на старый BIFF, т.е. хранится неформатированная строка, за которой следуют прогоны форматирования, являющиеся 4-байтными парами {позиция, стиль}, определяющими стиль, применяемый от текущей позиции вплоть до заданной позиции в строке (отсчет от нуля). В результате, если не интересуют прогоны форматирования, то строка читается так, словно прогонов форматирования вообще нет. Ниже приведены примеры общих строк:

// BIN общих строк: a -

<sst count="1" uniqueCount="1">
9f 01 (08) 01 00 00 00 01 00 00 00

<si><t>a</t></si>
13 (07)
        00           nb formatting runs
        01 00 00 00  len of string (number of Unicode characters)
        61 00        string "a"

</sst>
a0 01 (00)

// BIN общих строк: a,b, cc -

<sst count="3" uniqueCount="3">
9f 01 (08) 03 00 00 00 03 00 00 00

<si><t>a</t></si>
13 (07)
        00            nb formatting runs
        01 00 00 00   len of string (number of Unicode characters)
        61 00         string "a"

<si><t>b</t></si>
13 (07)
        00            nb formatting runs
        01 00 00 00   len of string (number of Unicode characters)
        62 00         string "b"

<si><t>cc</t></si>
13 (09)
        00            nb formatting runs
        02 00 00 00   len of string (number of Unicode characters)
        63 00 63 00   string "cc"

</sst>
a0 01 (00)


// BIN общих строк: a,b, cc со строкой a, используемой дважды -

<sst count="4" uniqueCount="3">
9f 01 (08) 04 00 00 00 03 00 00 00

<si><t>a</t></si>
13 (07)
        00             nb formatting runs
        01 00 00 00    len of string (number of Unicode characters)
        61 00          string "a"

<si><t>b</t></si>
13 (07)
        00             nb formatting runs
        01 00 00 00    len of string (number of Unicode characters)
        62 00          string "b"

<si><t>cc</t></si>
13 (09)
        00             nb formatting runs
        02 00 00 00    len of string (number of Unicode characters)
        63 00 63 00    string "cc"

</sst>
a0 01 (00)


// BIN общих строк: abcd, где bc красный -

<sst count="1" uniqueCount="1">
9f 01 (08) 01 00 00 00 01 00 00 00

<si><.../t></si>
13 (19)
        01               nb formatting runs
        04 00 00 00      len of string (number of Unicode characters)
        61 00 62 00 63 00 64 00 string "abcd"
        02 00 00 00      formatting run 1 {pos=2, style=0}
        01 00 01 00      formatting run 2 {pos=1, style=1}
        03 00 00 00      formatting run 3 {pos=3, style=0}

</sst>
a0 01 (00)

Задействуются следующие записи:

//записи общих строк
public const int BIFF12_SI              = 0x13;
public const int BIFF12_SST             = 0x019F;
public const int BIFF12_SST_END         = 0x01A0;

Часть стилей

Часть стилей, подобно части общих строк, является словарем разложенных на множители стилей форматирования, представленных индексами. Самый простой стиль форматирования называется стиль XF, представленный индексом с отсчетом от нуля, группирующий несколько форматирований, таких как узор заливки, рамки, и так далее. Стили ячейки являются разновидностями стилей XF, поверх которых существуюи новые кнцепции в Excel 2007, такие как стили таблицы и темы (темы определены в отдельной части, оставленной в XML даже в двоичном файле .XLSB).

Ниже приведен пример части стилей в XML, а затем в BIN:

// Так часть стилей выглядит в XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<styleSheet
    xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/5/main">
  <fonts count="1">
    <font>
      <sz val="11"/>
      <color theme="1"/>
      <name val="Calibri"/>
      <family val="2"/>
      <scheme val="minor"/>
    </font>
  </fonts>
  <fills count="2">
    <fill><patternFill patternType="none"/></fill>
    <fill><patternFill patternType="gray125"/></fill>
  </fills>

  <borders count="1">
    <border><left/><right/><top/><bottom/>
    <diagonal/></border>
  </borders>

  <cellStyleXfs count="1">
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
  </cellStyleXfs>

  <cellXfs count="1">
    <xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
  </cellXfs>

  <cellStyles count="1">
    <cellStyle name="Normal" xfId="0" builtinId="0"/>
  </cellStyles>

  <dxfs count="0"/>

  <tableStyles count="0" defaultTableStyle="TableStyleMedium9"
            defaultPivotStyle="PivotStyleLight16"/>

  <colors/>
</styleSheet>

// Таким образом после разбиения части BIN на записи можно сопоставить
// записи с разметкой XML.

// Обратите внимание, что идентификаторы записей являются двумя байтами слева,
// связанная длина записи обрамлена круглыми скобками,
// а за ними идет само содержимое записи.


<styleSheet>
96 02 (00)

<fonts>
e3 04 (04) 01 00 00 00

<font>
  <sz val="11"/>
  <color theme="1"/>
  <name val="Calibri"/>
  <family val="2"/>
  <scheme val="minor"/>
</font>
2b (27) dc 00 00 00 90 01 00 00 00 02 00 00 07 01 00 00 00 00 00
ff 02 07 00 00 00 43 00 61 00 6c 00 69 00 62 00 72 00 69 00

</fonts>
e4 04 (00)

<fills count="2">
db 04 (04) 02 00 00 00

<fill><patternFill patternType="none"/></fill>
2d (44) 00 00 00 00 03 40 00 00 00 00 00 ff 03 41 00 00 ff ff
ff ff 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00

<fill><patternFill patternType="gray125"/></fill>
2d (44) 11 00 00 00 03 40 00 00 00 00 00 ff 03 41 00 00 ff ff ff ff
00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00 00 00 00 00 00
        00 00 00 00 00 00

</fills>
dc 04 (00)

<borders count="1">
e5 04 (04) 01 00 00 00

<border><left/><right/><top/><bottom/>
<diagonal/></border>
2e (33) 00 00 00 01 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00
00 00 00 01 00 00 00 00 00 00 00
        00 00 01 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00

</borders>
e6 04 (00)

<cellStyleXfs count="1">
f2 04 (04) 01 00 00 00

<xf numFmtId="0" fontId="0" fillId="0" borderId="0"/>
2f (10) ff ff 00 00 00 00 00 00 00 00 00 00 10 10 00 00

</cellStyleXfs>
f3 04 (00)

<cellXfs count="1">
e9 04 (04) 01 00 00 00

<xf numFmtId="0" fontId="0" fillId="0" borderId="0" xfId="0"/>
2f (10) 00 00 00 00 00 00 00 00 00 00 00 00 10 10 00 00

</cellXfs>
ea 04 (00)

<cellStyles count="1">
eb 04 (04) 01 00 00 00

<cellStyle name="Normal" xfId="0" builtinId="0"/>
30 (18) 00 00 00 00 01 00 00 ff 06 00 00 00 4e 00 6f 00 72 00 6d 00
61 00 6c 00

</cellStyles>
ec 04 (00)

<dxfs>
f9 03 (04) 00 00 00 00

</dxfs>
fa 03 (00)

<tableStyles count="0" defaultTableStyle="TableStyleMedium9"
            defaultPivotStyle="PivotStyleLight16"/>
fc 03 (50) 00 00 00 00 11 00 00 00 54 00 61 00 62 00 6c 00 65 00 53
00 74 00 79 00 6c 00 65 00 4d 00
65 00 64 00 69 00 75 00 6d 00 39 00 11 00 00 00 50 00 69 00 76 00 6f
00 74 00 53 00 74 00 79 00
6c 00 65 00 4c 00 69 00 67 00 68 00 74 00 31 00 36 00

</tableStyles
fd 03 (00)

<colors>
d9 03 (00)

</colors>
da 03 (00)

</styleSheet>
97 02 (00)

Задействуются следующие записи:

//записи стилей
public const int BIFF12_FONT            = 0x2B;
public const int BIFF12_FILL            = 0x2D;
public const int BIFF12_BORDER          = 0x2E;
public const int BIFF12_XF              = 0x2F;
public const int BIFF12_CELLSTYLE       = 0x30;
public const int BIFF12_STYLESHEET      = 0x0296;
public const int BIFF12_STYLESHEET_END  = 0x0297;
public const int BIFF12_COLORS          = 0x03D9;
public const int BIFF12_COLORS_END      = 0x03DA;
public const int BIFF12_DXFS            = 0x03F9;
public const int BIFF12_DXFS_END        = 0x03FA;
public const int BIFF12_TABLESTYLES     = 0x03FC;
public const int BIFF12_TABLESTYLES_END = 0x03FD;
public const int BIFF12_FILLS           = 0x04DB;
public const int BIFF12_FILLS_END       = 0x04DC;
public const int BIFF12_FONTS           = 0x04E3;
public const int BIFF12_FONTS_END       = 0x04E4;
public const int BIFF12_BORDERS         = 0x04E5;
public const int BIFF12_BORDERS_END     = 0x04E6;
public const int BIFF12_CELLXFS         = 0x04E9;
public const int BIFF12_CELLXFS_END     = 0x04EA;
public const int BIFF12_CELLSTYLES      = 0x04EB;
public const int BIFF12_CELLSTYLES_END  = 0x04EC;
public const int BIFF12_CELLSTYLEXFS    = 0x04F2;
public const int BIFF12_CELLSTYLEXFS_END = 0x04F3;