Содержание:

3. Формат BIFF
3.1. Введение
3.2. Общая структура
3.3. Sheet records (Worksheet) поток
  3.3.1. Shared String Table (BIFF8)
3.4. Необходимый набор записей
  3.4.1. Описание основных записей
  3.4.2. Описание записей ячеек
  3.4.3. Как найти ячейки в BIFF файле
3.5. Изменения в новых версиях
  3.5.1. Новые записи в BIFF7 по сравнению с BIFF5
  3.5.2. Измененные записи в BIFF7 по сравнению с BIFF5
  3.5.3. Новые записи в BIFF8
  3.5.4. Измененные записи в BIFF8
4. Литература

3.Формат BIFF

3.1. Введение

BIFF структура представляет собой подряд идущие записи. Все записи имеют следующий общий формат:

ID (2 байта) Размер данных, sz (2 байта) Данные (sz байт)

Первые 4 байта (ID и размер) - это заголовок записи. Размер записи не включает размер заголовка! Все данные записываются в Intel-нотации.

Есть много стандартных записей Exсel. Каждая внутри (секция данных) имеет свой определенный формат. Я попытаюсь рассмотреть как можно больше различных записей.

Записи могут группироваться в потоки. Ограничителем групп (как бы логическими скобками) служат 2 специальные записи: BOF (Begin Of File) и EOF (End Of File). Они имеют следующий формат:

BOF

BIFF2
Смещ. Размер Значение Описание
- 2

0009H

ID
- 2 0004H размер
00 2   версия
02 2 0010H - Worksheet
0020H - Chart
0040H - Macro sheet
тип
BIFF3
Смещ. Размер Значение Описание
- 2

0209H

ID
- 2 0006H размер
00 2   версия
02 2 0010H - Worksheet
0020H - Chart
0040H - Macro sheet
тип
04 2   не используется
BIFF4
Смещ. Размер Значение Описание
- 2

0409H

ID
- 2 0006H размер
00 2   версия
02 2 0010H - Worksheet
0020H - Chart
0040H - Macro sheet
0100H - Workbook globals
тип
04 2   не используется
BIFF5 / BIFF7
Смещ. Размер Значение Описание
- 2

0809H

ID
- 2 0008H размер
00 2 0500H версия
02 2 0005H - Workbook globals
0006H - Visual Basic module
0010H - Worksheet
0020H - Chart
0040H - BIFF4 Macro sheet
0100H - BIFF4 Workbook globals
тип
04 2   ID создания
06 2   год создания
BIFF8
Смещ. Размер Значение Описание
- 2

0809H

ID
- 2 0010H размер
00 2 0600H версия
02 2 0005H - Workbook globals
0006H - Visual Basic module
0010H - Worksheet
0020H - Chart
0040H - BIFF4 Macro sheet
0100H - BIFF4 Workbook globals
тип
04 2   ID создания
06 2   год создания
08 4   флаг истории файла
12 4   наименьшая версия Excel, которая может читать все записи из этого файла

BOF кроме функции открытия логических скобок несет еще и информативную функцию - из него можно узнать, что он ограничивает.

EOF

Все форматы
Смещ. Размер Значение Описание
- 2

000AH

ID
- 2 0000H размер

3.2. Общая структура

Структура различна для разных версий

BIFF2-BIFF4

BOF Type = worksheet
  Sheet records поток
EOF  

BIFF4 Workbook

BOF Type = workbook globals
 
  Workbook globals
...
SHEETSOFFSET Позиция первой SHEETHDR записи
  Workbook globals
...
SHEETHDR Sheet name = "Sheet1",
Длина в байтах следующей BOF/EOF записи
BOF Type = worksheet
  Sheet records поток
EOF  
SHEETHDR Sheet name = "Sheet2",
Длина в байтах следующей BOF/EOF записи
BOF Type = worksheet
  Sheet records поток
EOF  
...  
EOF  

BIFF5-BIFF8

BOF Type = workbook globals
  Workbook globals
...
EOF  
BOF Type = worksheet
  Sheet records поток
EOF  
BOF Type = worksheet
  Sheet records поток
EOF  
...  

Workbook globals - просто перечисление глобальных переменных, а вот поток Sheet records имеет более сложную структуру

3.3. Sheet records (Worksheet) поток

Записи Sheet records имеют 3 секции:

BOF Type = worksheet
  Sheet settings
  Cell records
  Sheet contents
EOF  

3.3.1. Shared String Table (BIFF8)

В формате BIFF8, workbook собирает все строки всех текстовых ячеек в глобальный список, называемый shared string table (SST). Эта таблица располагается в секции workbook globals в записи SST. Вслед за SST записью следует запись EXTSST, которая хранит позицию потока для хэш-таблицы строк. Текстовые ячейки представляются через LABELSST записи, которые содержат индексы в SST. Для чтения важны только SST и LABELSST.

Пример: workbook содержит где-то строки "ААА", "ВВВ" и "ССС"

BOF Type = workbook globals
 
  Workbook globals
...
SST String 0 = "ААА"
String 1 = "ВВВ"
String 2 = "ССС"
EXTSST  
  Workbook globals
...
EOF  
BOF Type = worksheet
 
  Cell records
LABELSST String = 0
LABELSST String = 2
  Cell records
LABELSST String = 1
LABELSST String = 0
  Cell records
EOF  

3.4. Необходимый набор записей

Excel записывает большое число различных записей. Некоторые можно опустить, а некоторые крайне необходимы. Пример из реального файла (всего один лист, никакой лишней информации, BIFF5, всего несколько ячеек заполнены текстом, числами). Не очень важные поля выделены более светлым цветом. Необходимые поля для BIFF5 выделены красным цветом.

BOF Type = workbook globals
 
INTERFACEHDR начало секции интерфейса пользователя. Не имеет поля данных
MMS число ADDMENU/DELMENU записей в книге
TOOLBARHDR  
TOOLBAREND  
INTERFACEEND конец секции интерфейса пользователя. Не имеет поля данных
WRITEACCESS имя пользователя, вводимое при установке Excel
CODEPAGE значение кодовой страницы
FNGROUPCOUNT

число встроенных в данную версию Excel функциональных групп (финансы, математические и тригонометрические, дата и время и т.д.)

WINDOWPROTECT хранит значение из диалога защиты книги (защищен/незащищен)
PROTECT флаг защиты книги или листа
PASSWORD зашифрованный пароль
WINDOW1 описание положения окна книги в окне Excel
BACKUP флаг, должен ли Excel записывать файл backup'а
HIDEOBJ флаг, опции показать/спрятать из диалога опций
1904 система данных, используемая Excel. 1, если система 1904 используется
PRECISION флаг, выбрана ли Precision As Displayed из диалога опций
BOOKBOOL флаг, включена ли опция Save External Link Values

FONT0
...
FONT3
FONT5

...
FONTn

описание шрифтов, встречающихся в файле
FORMAT
...
FORMAT
описание форматов данных, встречающихся в ячейках

XF0
...
XF15
...

XF

расширенное описание формата
PALETTE описание цветовой палитры
STYLE
...
STYLE
каждый стиль в книге должен иметь свою запись Style. Записываются в алфавитном порядке, так, как они должны появляться в ниспадающем меню
BOUNDSHEET описание листов в книге
EOF  
BOF Type = worksheet
 
INDEX индексная запись. Должна быть самой первой в секции worksheet
CALCMODE  
CALCCOUNT  
REFMODE  
INTERATION  
DELTA  
SAVERECALC  
PRINTHEADERS  
PRINTGRIDLINES  
GRIDSET  
GUTS  
DEFAULTROWHEIGHT  
COUNTRY  
WSBOOL  
HEADER  
FOOTER  
HCENTER  
VCENTER  
SETUP  
DEFCOLWIDTH  
DIMENSION описание размера листа: минимальное и максимальное значение (индекс+1)
ROW описание строки

LABEL
RK
NUMBER
FORMULA
...

описание ячейки

  • ARRAY - формула массивом
  • BLANK - пустая ячейка
  • BOOLERR - булево значение или значение ошибки
  • FORMULA - формула
  • LABEL - ячейка с текстом
  • NUMBER - IEEE число с плавающей запятой
  • MULBLANK - несколько пустых ячеек (с версии BIFF5)
  • MULRK - несколько RK ячеек (с версии BIFF5)
  • RK - целое число или число с плавающей запятой
  • RSTRING - ячейка с форматированными символами
  • SHRFMLA - формула общего пользования (shared formula) (с версии BIFF5)
  • STRING - строка, которая представляет результат формулы

 

DBCELL индекс на ячейки
WINDOW1  
WINDOW2 описание положения окна листа в окне книги
SELECTION  
EOF  
...  

3.4.1. Описание основных записей

Что значит основные записи? Это минимальный набор записей, без которых Exel файл не получится. Теоретически его еще можно укоротить, но все же рекомендуется именно такой минимальный набор.

WINDOW1 (3Dh)

Запись WINDOW1 содержит описание атрибутов окна workbook. Поля xWn и yWn содержат расположение окна в 1/20 point, относительно верхнего левого угла окна Microsoft Excel. Поля dxWn и dyWn содержат размер окна, также в 1/20 point.

BIFF5-BIFF8
Смещ. Размер Имя Описание
4 2 xWn горизонтальная позиция окна
6 2 yWn вертикальная позиция окна
8 2 dxWn ширина окна
10 2 dyWn высота окна
12 2 grbit флаг опций
14 2 itabCur индекс выранного workbook tab (отсчет от 0)
16 2 itabFirst индекс первого показываемого workbook tab (отсчет от 0)
18 2 ctabSel число выбранных workbook tabs
20 2 wTabRatio отношение ширины workbook tabs к ширине горизонтальной полосы прокрутки; для получения отношения нужно конвертировать в десятичные числа и делить на 1000

grbit содержит флаги опций, перечисленные в таблице:

BIFF5-BIFF8
Смещ. Бит Маска Имя Описание

0

0

01h

fHidden

= 1 если окно спрятано

1

02h

fIconic

= 1 если окно сейчас показывается как иконка

2

04h

(Reserved)

3

08h

fDspHScroll

= 1 если горизонтальная полоса прокрутки показывается

4

10h

fDspVScroll

= 1 если вертикальная полоса прокрутки показывается

5

20h

fBotAdornment

= 1 если workbook tabs показывается

7-6

C0h

(Reserved)

1

7-0

FFh

(Reserved)

1904 (22h)

Не смотря на то, что без этой записи теоретически можно обойтись, любой Excel файл ее содержит.

Содержит систему данных, используемую Excel

BIFF5-BIFF8
Смещ. Размер Значение Имя Описание
4 2

f1904  = 1, если использована система 1904

FONT (BIFF2, BIFF5-BIFF8 031h; BIFF3-BIFF4 231h)

Таблица шрифтов книги содержит как минимум 5 записей FONT. Записи нумеруются подряд: ifnt = 00h (первая запись FONT), ifnt = 01h, ifnt = 02h, ifnt = 03h, ifnt = 05h (минимальная таблица), и затем ifnt = 06h, ifnt = 07h, и т.д. Заметьте, что записи ifnt = 04h нет в BIFF файле. Это сделано для обратной совместимости со старыми версиями Microsoft Excel. Когда идет чтение записей FONT, необходимо помнить, что запись ifnt = 04h пропускается.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

dyHeight

высота шрифта (в 1/20 point).

6

2

grbit

атрибуты шрифта

8

2

icv

индекс в цветовой палитре

10

2

bls

жирность (Bold style); число от 100dec до 1000dec (64h до 3E8h), которое показывает толщину символа ("boldness"). По умолчинаю 190h для нормального текста и 2BCh для жирного.

12

2

sss

superscript/subscript:
00h = нет
01h = Superscript
02h = Subscript

14

1

uls

подчеркивание:
00h = None
01h = Single
02h = Double
21h = Single Accounting
22h = Double Accounting

15

1

bFamily

семейство шрифтов, как указано в структуре Windows API LOGFONT.

16

 

bCharSet

набор символов, определенный в структуре Windows API LOGFONT.

17

 

(Reserved)

зарезервировано. Должно быть = 0 (ноль).

18

 

cch

длина имени шрифта.

19

 

rgch

имя шрифта.

grbit

BIFF5-BIFF8
Смещ. Бит Маска Имя Описание

0

0

01h

(Reserved)

зарезервировано. Должно быть = 0 (ноль).

1

02h

fItalic

= 1 если шрифт курсив

2

04h

(Reserved)

зарезервировано. Должно быть = 0 (ноль).

0

3

08h

fStrikeout

= 1 если шрифт петачный (struck out)

4

10h

fOutline

= 1 если шрифт outline style (для Macintosh)

5

20h

fShadow

= 1 если шрифт shadow style (для Macintosh)

7-6

C0h

(Reserved)

зарезервировано. Должно быть = 0 (ноль).

1

7–0

FFh

(Unused)

FORMAT (BIFF2-BIFF3 01Eh, BIFF4-BIFF8 41Eh)

Записи FORMAT описывают форматы данных в книге.

Все записи FORMAT должны располагаться вместе в BIFF файле. Порядок записей FORMAT в существующем BIFF файле не должен изменяться. Можно дописать дополнительные записи FORMAT, но они должны добавляться в конец.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

ifmt

индекс формата (для внутреннего использования)

6

1

cch

длина строки формата

7

var

rgch

форматная строка

Microsoft Excel использует поле ifmt для идентификации встроенных форматов, когда он читает файл, созданный различными локализованными версиями.

Форматы:

ifmt

Строка формата

00h

General

01h

0

02h

0.00

03h

#,##0

04h

#,##0.00

05h

($#,##0_);($#,##0)

06h

($#,##0_);[Red]($#,##0)

07h

($#,##0.00_);($#,##0.00)

08h

($#,##0.00_);[Red]($#,##0.00)

09h

0%

0ah

0.00%

0bh

0.00E+00

0ch

# ?/?

0dh

# ??/??

0eh

m/d/yy

0fh

d-mmm-yy

10h

d-mmm

11h

mmm-yy

12h

h:mm AM/PM

13h

h:mm:ss AM/PM

14h

h:mm

15h

h:mm:ss

16h

m/d/yy h:mm

25h

(#,##0_);(#,##0)

26h

(#,##0_);[Red](#,##0)

27h

(#,##0.00_);(#,##0.00)

28h

(#,##0.00_);[Red](#,##0.00)

29h

_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)

2ah

_($* #,##0_);_($* (#,##0);_($* "-"_);_(@_)

2bh

_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)

2ch

_($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_)

2dh

mm:ss

2eh

[h]:mm:ss

2fh

mm:ss.0

30h

##0.0E+0

31h

@

Необходимо заметить, что значения с17h по 24h зарезервированы для локализованных версий

XF (BIFF2 - 43h, BIFF3 - 243h, BIFF4 - 443h, BIFF5-BIFF8 - E0h)

Записи XF хранят описание форматирования для стилей и ячеек. Поле ixfe записи ячейки (BLANK, LABEL, NUMBER, RK, and so on) указывает на соответствующую запись XF, а поле ixfe записи STYLE указывает на соответствующую стилевую запись XF.

Файл BIFF может содержать так много записей XF, сколько необходимо для описания ячеек и стилей. Записи XF находятся в таблице потоком, и индекс записей XF в этой таблице начинается с нуля (0) и указывается в ссылающемся поле ixfe.

Поток книги должен содержать минимальную XF таблицу, состоящую из 15 стилевых XF записей и одной записи XF ячейки (ixfe=0 по ixfe=15). Первая запись XF (ixfe=0) - запись XF для Normal style. Последующие 14 записей (ixfe=1 по ixfe=14) - записи XF, которые соответствуют outline styles RowLevel_1, ColLevel_1, RowLevel_2, ColLevel_2, и т.д. Последняя запись (ixfe=15) - запись XF ячейки по умолчанию для книги.

Кроме этого есть еще 5 дополнительных стилевых записей XF (можно не указывать), которые соответствуют Comma, Comma [0], Currency, Currency [0], и Percent styles.

BIFF5-BIFF7
Смещ. Бит Маска Имя Описание

4

15–0

FFFFh

ifnt

индекс в таблице FONT записей.

6

15–0

FFFFh

ifmt

индекс в таблице FORMAT записей.

8

0

0001h

fLocked

= 1 если ячейка закрыта.

1

0002h

fHidden

= 1 если ячейка скрыта.

2

0004h

fStyle

для ячейки: = 0 XF ячейки.
для стиля: = 1 для записи XF стиля.

3

0008h

f123Prefix

для ячейки: Если опция Transition Navigation Keys выключена (диалоговое окно Options, Transition tab), f123Prefix = 1 говорит, что первый апостроф используется для преобразования содержимого ячейки в простую строку.

Если опция Transition Navigation Keys включена, f123Prefix = 1 говорит о том, что формула в ячейке начинается с одним из четырех префиксов выравнивания Lotus 1-2-3:
' left
" right
^ centered
\ fill

для стиля: = 0 всегда для записи XF стиля

15–4

FFF0h

ixfParent

для ячейки: индекс в таблице XF на запись родительского стиля. Каждая запись XF ячейки должна иметь запись XF родительского стиля, которая обычно ixfeNormal = 0.

для стиля: = FFFh (ixfNULL) всегда для записи XF стиля

10

2–0

0007h

alc

выравнивание:
0 = обычное
1 = влево
2 = по центру
3 = вправо
4 = заполнение
5 = по формату
6 = по центру вдоль выбранного (center across selection)

3

0008h

fWrap

= 1 если текст в ячейке можно переносить.

10

6–4

0070h

alcV

вертикальное выравнивание:
0 = вверх
1 = по центру
2 = вниз
3 = по формату

7

0080h

fJustLast

(используется только в дальневосточных версиях Microsoft Excel)

9–8

0300h

ori

ориентация текста в ячейке:
= 0 без поворота
= 1 текст сверху вниз; символы сверху направо
= 2 текст повернут на 90 градусов против часовой стрелки
= 3 текст повернут на 90 градусов по часовой стрелке

10

0400h

fAtrNum

для ячейки: = 1 если ifmt не равно ifmt родительской стилевой записи XF

для стиля: = 0 если стиль содержит числа (Style dialog box).

11

0800h

fAtrFnt

для ячейки: = 1 если ifnt не равно ifnt родительской стилевой записи XF

для стиля: = 0 если стиль содержит шрифт (Style dialog box).

12

1000h

fAtrAlc

для ячейки: = 1 если alc или fWrap поля не равны соответствующим полям родительской стилевой записи XF

для стиля: = 0 если стиль содержит выравнивание (Style dialog box).

13

2000h

fAtrBdr

для ячейки: = 1 если любое поле границ (dgTop, and so on) не равно соответствующему полю родительской стилевой записи XF

для стиля: = 0 если стиль содержит границы (Style dialog box).

14

4000h

fAtrPat

для ячейки: = 1 если любое поле заполнения (fls, icvFore, icvBack) не равно соответствующему полю родительской стилевой записи XF

для стиля: = 0 если стиль содержит заполнение(Style dialog box).

15

8000h

fAtrProt

для ячейки: = 1 если поля fLocked или fHidden не равны соответствующим полям родительской стилевой записи XF

для стиля: = 0 если стиль содержит защиту ячейки (Style dialog box).

12

6–0

007Fh

icvFore

индекс в цветовой палитре для цвета текста или заполнения

12–7

1F80h

icvBack

индекс в цветовой палитре для цвета фона или заполнения

13

2000h

fSxButton

для ячейки: = 1 если запись XF прикреплена к кнопке PivotTable

для стиля: = 0 всегда для записи XF стиля

15–14

C000h

(Reserved)

14

5–0

003Fh

fls

заполнение

8–6

01C0h

dgBottom

стиль линии нижней границы

15–9

FE00h

icvBottom

индекс в цветовой палитре для цвета границы кнопки

16

2–0

0007h

dgTop

стиль линии верхней границы

5–3

0038h

dgLeft

стиль линии левой границы

8–6

01C0h

dgRight

стиль линии правой границы

15–9

FE00h

icvTop

индекс в цветовой палитре для верхней границы

18

6-0

007Fh

icvLeft

индекс в цветовой палитре для левой границы

13-7

3F80h

icvRight

индекс в цветовой палитре для правой границы

15–14

C000h

(Reserved)

BIFF8
Смещ. Бит Маска Имя Описание

4

15–0

FFFFh

ifnt

индекс в таблице FONT записей.

6

15–0

FFFFh

ifmt

индекс в таблице FORMAT записей.

8

0

0001h

fLocked

= 1 если ячейка закрыта.

1

0002h

fHidden

= 1 если ячейка скрыта.

2

0004h

fStyle

для ячейки: = 0 XF ячейки.
для стиля: = 1 для записи XF стиля.

3

0008h

f123Prefix

для ячейки: Если опция Transition Navigation Keys выключена (диалоговое окно Options, Transition tab), f123Prefix = 1 говорит, что первый апостроф используется для преобразования содержимого ячейки в простую строку.

Если опция Transition Navigation Keys включена, f123Prefix = 1 говорит о том, что формула в ячейке начинается с одним из четырех префиксов выравнивания Lotus 1-2-3:
' left
" right
^ centered
\ fill

для стиля: = 0 всегда для записи XF стиля

15–4

FFF0h

ixfParent

для ячейки: индекс в таблице XF на запись родительского стиля. Каждая запись XF ячейки должна иметь запись XF родительского стиля, которая обычно ixfeNormal = 0.

для стиля: = FFFh (ixfNULL) всегда для записи XF стиля

10

2–0

0007h

alc

выравнивание:
0 = обычное
1 = влево
2 = по центру
3 = вправо
4 = заполнение
5 = по формату
6 = по центру вдоль выбранного (center across selection)

3

0008h

fWrap

= 1 если текст в ячейке можно переносить.

10

6–4

0070h

alcV

вертикальное выравнивание:
0 = вверх
1 = по центру
2 = вниз
3 = по формату

7

0080h

fJustLast

(используется только в дальневосточных версиях Microsoft Excel)

15–8

FF00h

ori

поворот в градусах;
= 0 – 90dec - поворот против часовой стрелки на 0 – 90 градусов,
= 91 – 180dec - поворот против часовой стрелки на 0 – 90 градусов
= 255dec - символы не повернуты

12

3 – 0

000Fh

cIndent

значение отступа (Format Cells dialog box, Alignment tab)

4

0010h

fShrinkToFit

= 1 если Shrink To Fit опция включена (Format Cells dialog box, Alignment tab).

5

0020h

fMergeCell

= 1 если Merge Cells опция включена (Format Cells dialog box, Alignment tab).

7 – 6

00C0h

iReadingOrder

направление чтения (только для дальневосточных версий):
0 = Context
1 = слева-направо
2 = справо-налево

9 – 8

0300h

(Reserved)

 

10

0400h

fAtrNum

= 1 если ifmt не равно ifmt родительской стилевой записи XF

11

0800h

fAtrFnt

= 1 если ifnt не равно ifnt родительской стилевой записи XF

12

1000h

fAtrAlc

= 1 если alc или fWrap поля не равны соответствующим полям родительской стилевой записи XF

13

2000h

fAtrBdr

= 1 если любое поле границ (dgTop, и т.п) не равно соответствующему полю родительской стилевой записи XF

14

4000h

fAtrPat

= 1 если любое поле заполнения (fls, icvFore, icvBack) не равно соответствующему полю родительской стилевой записи XF

15

8000h

fAtrProt

= 1 если поля fLocked или fHidden не равны соответствующим полям родительской стилевой записи XF

14

3 – 0

000Fh

dgLeft

стиль линии левой границы

7 – 4

00F0h

dgRight

стиль линии правой границы

11 – 8

0F00h

dgTop

стиль линии верхней границы

15 – 12

F000h

dgBottom

стиль линии нижней границы

16

6 – 0

007Fh

icvLeft

индекс в цветовой палитре для левой границы

13 – 7

3F80h

icvRight

индекс в цветовой палитре для правой границы

15 – 14

C000h

grbitDiag

1=diag down,
2=diag up,
3=both.

18

6 – 0

0000007Fh

icvTop

индекс в цветовой палитре для верхней границы

13 – 7

00003F80h

icvBottom

индекс в цветовой палитре для нижней границы

20 – 14

001FC000h

icvDiag

индекс в цветовой палитре для диагональной границы

24 – 21

01E00000h

dgDiag

стиль границы

25

03800000h

(Reserved)

31 – 26

FC000000h

fls

заполнение

22

6 – 0

007Fh

icvFore

индекс в цветовой палитре для цвета текста или заполнения

13 – 7

3F80h

icvBack

индекс в цветовой палитре для цвета фона или заполнения

14

4000h

fSxButton

для ячейки: = 1 если запись XF прикреплена к кнопке PivotTable

для стиля: = 0 всегда для записи XF стиля

15

8000h

(Reserved)

Стиль границы

dg*

Стиль границы

0h

нет

1h

тонкая

2h

средняя

3h

пунктир

4h

точечная

5h

толстая

6h

двойная

7h

очень тонкая

8h

пунктирная средняя (только BIFF8)

9h

точка-пунктир (только BIFF8)

Ah

точка-пунктир средняя (только BIFF8)

Bh

пунктир-точка-точка (только BIFF8)

Ch

пунктир-точка-точка средняя (только BIFF8)

Dh

пунктир-точка наклонная (только BIFF8)

STYLE (293h)

Любой стиль в книге, неважно, встроенный он или определенный пользователем, требует отдельной записи STYLE в BIFF файле. Все стили записываются в алфавитном порядке, так, как они появляются в ниспадающем меню.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

ixfe

индекс в таблице XF записей (стилевая запись).

Замечание: ixfe использует только младшие 12 бит поля (биты 11–0). Биты 12, 13 и 14 не используются, и бит 15 (fBuiltIn) = 1 для встроенных стилей и 0 для пользовательских стилей

6

1

istyBuiltIn






cch

Номер встроенного стиля:
= 00h Normal
= 01h RowLevel_n
= 02h ColLevel_n
= 03h Comma
= 04h Currency
= 05h Percent
= 06h Comma[0]
= 07h Currency[0]

Для пользовательского стиля: длина названия стиля

7

1

iLevel

rgch

Уровень outline style RowLevel_n или ColLevel_n

Для пользовательского стиля: название стиля

Автоматические outline styles — RowLevel_1 по RowLevel_7, и ColLevel_1 по ColLevel_7 — хранятся с установкой istyBuiltIn в 01h или 02h и затем устанавливая iLevel по уровню стиля минус 1. Если стиль не автоматический outline style, поле игнорируется.

BOUNDSHEET (85h)

Запись хранит имя листа, тип листа, и позицию в потоке.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

4

lbPlyPos

позиция в потоке, отсчитываемая от начала записи BOF для листа

8

2

grbit

флаг

10

1

cch

длина названия листа

11

var

rgch

название листа

grbit:

BIFF5-BIFF8
Смещ. Бит Маска Имя Описание

0

7-0

0Fh

dt

тип листа:
00h = worksheet или dialog sheet
01h = Microsoft Excel 4.0 macro sheet
02h = chart
06h = Visual Basic module

1

1–0

03h

hsState

Скрыт/показан:
00h = показан
01h = скрыт
02h = очень скрыт (процедура Visual Basic может установить значение Visible для листа, сделав тем самым его очень скрытым. Сделать обратно видимым можно только через Visual Basic, и невозможно через интерфейс пользователя Microsoft Excel)

7-2

FCh

(Reserved)

INDEX (20Bh)

Microsoft Excel записывает INDEX сразу же после BOF для каждого листа в BIFF файле.
BIFF5-BIFF8
Смещ. Размер Имя Описание

4

4

(Reserved)

зарезервировано, должно быть 0 (ноль)

8

2

rwMic

первая строка, которая присутствует в листе

10

2

rwMac

последняя строка, которая присутствует в листе плюс 1

12

4

(Reserved)

зарезервировано, должно быть 0 (ноль)

16

var

rgibRw

массив смещений на DBCELL записи для каждого блока записей ROW. Блок содержит до 32 записей ROW.

Из-за того, что отсчет колонок и строк начинается всегда с 0, а на экране нумерация идет с 1, ячейка A1 хранится как 0; ячейка A2 - как 1, и т.д.

DIMENSION (200h)

Запись DIMENSIONS содержит минимальное и максимальное значение листа. Она показывает размер листа

Значения rwMac и colMac отличаются на 1 от реальных значений строки и колонки. Например, если ячейки на листе существуютмежду B3 и D6, то:

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rwMic

первая определенная строка на листе

6

2

rwMac

последняя определенная строка на листе плюс 1

8

2

colMic

первая определенная колонка на листе

10

2

colMac

последняя определенная колонка на листе плюс 1

12

2

(Reserved)

зарезервировано, должно быть 0 (ноль)

ROW (208h)

Запись ROW описывает одну строку на листе Microsoft Excel. Записи ROW и ассоциированные с ними записи ячеек группируются в блоки по 32 строки. Каждый блок заканчивается записью DBCELL.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитывается от 0.

6

2

colMic

первая существующая колонка в строке.

8

2

colMac

последняя существующая колонка в строке, плюс 1.

10

2

miyRw

высота строки в 1/20 точки

12

2

irwMac

используется Microsoft Excel для оптимизации загрузки файла. Если сами создаете BIFF файл, то установите irwMac в 0.

14

2

(Reserved)

16

2

grbit

флаг опций.

18

2

ixfe

если fGhostDirty = 1 (см. поле grbit), это индекс соответствующей записи XF для строки. В остальных случаях это поле не определено

Замечание: ixfe использует только младшие 12 бит поля (биты 11–0). Бит 12 - fExAsc, бит 13 - fExDsc, а биты 14 и 15 зарезервированы. fExAsc и fExDsc установлены в true, если строка имеет дополнительное пространство выше или ниже.

Поле grbit:

BIFF5-BIFF8
Смещ. Бит Маска Имя Описание

0

2–0

07h

iOutLevel

индекс outline level строки

3

08h

(Reserved)

4

10h

fCollapsed

= 1, если строка collapsed in outlining

5

20h

fDyZero

= 1, если высота строки 0 (ноль)

0

6

40h

fUnsynced

= 1, если высота шрифта и высота строки не совместимы

7

80h

fGhostDirty

= 1, если строка форматирована, даже если она содержит все пустые ячейки.

1

7–0

FFh

(Reserved)

Поле rw содержит отсчитываемый от нуля номер строки. Поля colMic и colMac описывают диапазон колонок в строке.

Поле miyRw содержит высоту строки в 1/20 точки. Поле miyRw может содержать установленный бит 8000h (215), говорящий, что строка стандартной высоты. Младшие 15 бит все еще должна содержать значение высоты. Если спрятать строку, установив высоту строки в 0 (ноль) или используя команду Hide — miyRw все равно содержит оригинальное значение высоты. Это позволяет Microsoft Excel восстановить исходные размеры при нажатии кнопки Unhide.

Каждая строка может иметь атрибуты ячейки по умолчанию, которые контролируют формат всех неопределенных ячеек в строке. Устанавливая атрибуты ячеек по умолчанию для определенной строки, можно эффективно отформатировать неопределенные ячейки в строке без использования памяти для этих ячеек. Эти установки не затрагивают ячеек, которые определены.

Например, если необходимо выровнить влево все ячейки одной строки, то можно определить все 256 ячеек и установить формат для каждой, а можно установить формат по умолчанию для строки и все.

DBCELL

DBCELL хранит поток смещений или попросту говоря ссылки на все ячейки в блоке. DBCELL заканчивает каждый блок записей ROW (до 32 записей).

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

4

dbRtrw

Смещение от начала записи DBCELL до первой записи ROW в блоке; смещение отсчитывается назад.

8

var

rgdb

Массив смещений (2 байта каждый).

WINDOW2 (23Eh)

Запись WINDOW2 содержит атрибуты окна листа в книге (workbook).

BIFF5-BIFF7
Смещ. Размер Значение Имя Описание

4

2

 

grbit

флаг

6

2

 

rwTop

самая верхняя строка, видимая в окне

8

2

 

colLeft

самая левая колонка, видимая в окне

10

4

 

rgbHdr

Цвет сетки и заголовка строки/колонки

grbit:

BIFF5-BIFF7
Смещ. Бит Маска Имя Описание

0

0

01h

fDspFmla

= 1 если должны показываться формулы
= 0 если должны показываться значения

1

02h

fDspGrid

= 1 если должна показываться сетка

2

04h

fDspRwCol

= 1 если должны показываться заголовки строк/колонок

3

08h

fFrozen

= 1 если panes в окне должны быть заморожены

4

10h

fDspZeros

= 1 если должны показываться нулевые значения (0)
= 0 если в окне запрещено показывать нулевые значения (0)

5

20h

fDefaultHdr

= 1 цвет заголовка и сетки - по умолчанию
= 0 используется rgbHdr цвет

6

40h

fArabic

= 1 для арабской версии Microsoft Excel

7

80h

fDspGuts

= 1 если outline символы показываются

1

0

01h

fFrozenNoSplit

= 1 если panes заморожены, но нет разделения

1

02h

fSelected

= 1 если sheet tab выбран

2

04h

fPaged

= 1 если лист сейчас отображается в окне книги

7–3

F8h

(Reserved)

3.4.2. Описание записей ячеек

Для описания ячеек используются записи:

Все эти записи можно разделить на несколько групп:

ARRAY (221h)

Запись ARRAY описывает формулу, которая введена как массив в насколько ячеек. Диапазон ячеек, в которые занесен массив определяется значениями полей rwFirst, rwLast, colFirst и colLast.

Запись ARRAY появляется сразу за записью FORMULA для ячейки в верхнем левом углу массива - поэтому ячейка определена значениями полей rwFirst и colFirst.

Выражение - это формула в виде массива во внутреннем формате Excel.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rwFirst

первая строка массива

6

2

rwLast

последняя строка массива

8

1

colFirst

первая колонка массива

9

1

colLast

последняя колонка массива

10

2

grbit

флаг опций

12

4

chn

при чтении файла BIFF значение этого поля можно игнорировать, но при записи оно должно быть = 00000000h

16

2

cce

длина выражения

18

var

rgce

выражение

Поле grbit:

BIFF5-BIFF8
Смещ. Бит Маска Имя Описание

0

0

01h

fAlwaysCalc

всегда вычислять формулу

 

1

02h

fCalcOnLoad

вычислять формулу когда файл открывается

 

7–2

FCh

(unused)

 

1

7–0

FFh

(unused)

 

BLANK (201h)

Запись BLANK описывает пустую ячейку. Поле rw содержит отсчитываемый с 0 номер строки. Поле col содержит отсчитываемый с 0 номер колонки.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

col

номер колонки, отсчитываемый с 0

8

2

ixfe

индекс записи XF

BOOLERR (205h)

Запись BOOLERR описывает ячейку, содержащую булево значение или значение ошибки.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

col

номер колонки, отсчитываемый с 0

8

2

ixfe

индекс записи XF

10

1

bBoolErr

булево значение (0 - false, 1 - true) или значение ошибки

11

1

fError

флаг булево значение (если = 0)/значение ошибки (если = 1)

Значение ошибки:

Ошибка

Значение (hex)

Значение (dec.)

#NULL!

00h

0

#DIV/0!

07h

7

#VALUE!

0Fh

15

#REF!

17h

23

#NAME?

1Dh

29

#NUM!

24h

36

#N/A

2Ah

42

FORMULA (406h)

Запись FORMULA описывает ячейку, содержащую формулу.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

col

номер колонки, отсчитываемый с 0

8

2

ixfe

индекс записи XF

10

8

num

актуальное значение формулы

18

2

grbit

флаг опций

20

4

chn

при чтении файла BIFF значение этого поля можно игнорировать, но при записи оно должно быть = 00000000h

24

2

cce

длина выражения

26

var

rgce

выражение во внутреннем формате Excel

Поле grbit:

BIFF5-BIFF8
Смещ. Бит Маска Имя Описание

0

0

01h

fAlwaysCalc

всегда вычислять формулу

1

02h

fCalcOnLoad

вычислять формулу когда файл открывается

2

04h

(Reserved)

3

08h

fShrFmla

= 1 если формула - часть общей группы формул (shared formula group). Для более детальной информации смотрите SHRFMLA

7–4

F0h

(Unused)

1

7–0

FFh

(Unused)

Если формула вычисляет число, то поле num содержит актуальное вычисленное число в 8-байтовом IEEE формате. Если формула вычисляет строку, булево значение или ошибку, то старшие 2 байта поля num содержат FFFFh.

Булево значение или значение ошибки хранится как показано в таблице:

BIFF5-BIFF8
Смещ. Размер Имя Описание

0

1

otBool

= 1 для булева значения
= 2 для значении ошибки

1

1

(Reserved)

зарезервировано, должно быть 0 (ноль)

2

1

f

булево значение или значение ошибки

3

3

(Reserved)

зарезервировано, должно быть 0 (ноль)

6

2

fExprO

= FFFFh

Если формула вычисляет строку, то поле num:

BIFF5-BIFF8
Смещ. Размер Имя Описание

0

1

otString

= 0 всегда

1

5

(Reserved)

зарезервировано, должно быть 0 (ноль)

6

2

fExprO

= FFFFh

Строковое значени не содержится в поле num, вместо этого оно записывается в записи STRING, которая следует сразу же за записью FORMULA.

LABEL (204h)

Запись LABEL описывает ячейку, содержащую постоянную строку. Длина строки содержится в поле cch и должно иметь значения 0000h–00FFh (0–255).

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

col

номер колонки, отсчитываемый с 0

8

2

ixfe

индекс записи XF

10

2

cch

длина строки

12

var

rgch

строка

NUMBER (203h)

Запись NUMBER описывает ячейку, содержащую число с правающей запятой. Число, содержащееся с поле num должно быть в 8-байтовом IEEE формате числа с плавающей запятой.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

col

номер колонки, отсчитываемый с 0

8

2

ixfe

индекс записи XF

10

8

num

значение числа с плавающей запятой

MULBLANK (BEh)

Запись MULBLANK эквивалентна 256 записям BLANK; MULBLANK служит для оптимизаци файла. Число полей ixfe может быть определено из поля ColLast (colLast - colFirst + 1). Максимальная длина записи MULBLANK = 256 x 2 + 10 = 522 байт, поскольку Microsoft Excel имеет почти 256 колонок. Заметьте, что 256 пустых ячеек записанных через MULBLANK занимают 522 байта, а 256 ячеек, записанных через BLANK занимают 2560 байт.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

colFirst

номер первой колонки, отсчитываемый с 0

8

var

rgixfe

массив индексов записей XF

10

2

colLast

последняя колонка, содержащая BLANKREC sструктуру

MULRK (BDh)

Запись MULRK эквивалентна до 256 записей RK; MULRK служит для оптимизаци файла. Число 6-байтовых RKREC структур может быть вычислен из поля ColLast и равен colLast - colFirst + 1. Максимальная длина записи MULRK = 256 x 6 + 10 = 1546 байт, поскольку Microsoft Excel имеет почти 256 колонок. 256 RK чисел в записи MULRK занимают 1546 байт, а 256 RK чисел в записи RK занимают 3584 байта.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

colFirst

номер первой колонки, отсчитываемый с 0

8

var

rgrkrec

массив 6-байтовых RKREC структур

var

2

colLast

последняя колонка, содержащая RKREC структуру

RKREC структура:

typedef struct rkrec
        {
        SHORT ixfe;        /* index to XF record */
        long RK;        /* RK number */
        }RKREC;

RK (7Eh)

Для оптимизации и уменьшения размера файла Microsoft Excel использует внутренний числовой тип, называемый число RK.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

col

номер колонки, отсчитываемый с 0

8

2

ixfe

индекс записи XF

10

4

rk

число RK

Число RK - это 30-битное целое или старшие 30 бит IEEE числа. Два бита 32-битного rk поля всегда зарезервированы для RK кодирования; поэтому число RK только 30 бит, а не полные 32.

Есть 4 типа различных чисел RK:


тип RK

приоритет кодирования

число (dec)

RK число (hex)

описание 30-битного кодирования

0

1

1

3F F0 00 00

число IEEE

1

3

1.23

40 5E C0 01

число IEEE x 100

2

2

12345678

02 F1 85 3A

целое

3

4

123456.78

02 F1 85 3B

целое x 100

Microsoft Excel всегда пытается сохранить числа как RK вместо IEEE. Также установлен приоритет кодирования чисел RK. Следующая диаграмма показывает примерный алгоритм кодирования числа. Алгоритм всегда начинается с числа IEEE (полного 64-битного).

Можно использовать следующий код C (источник: MSDN Library) для демонстрации как раскодировать число RK:

Microsoft QuickC;

double NumFromRk(long rk)
    {
    double num;
    if(rk & 0x02)
        {
        // int
        num = (double) (rk >> 2);
        }
    else
        {
        // hi words of IEEE num
        *((long *)&num+1) = rk & 0xfffffffc;
        *((long *)&num) = 0;
        }
    if(rk & 0x01)
        // divide by 100
        num /= 100;
    return num;
    }
main()
    {
    printf("%f\n", NumFromRk (0x02f1853b));
    }

THINK C

short double NumFromRk(long int rk)
    {
    short double num;
    if(rk & 0x02)
        {
        /* int */
        num = (short double) (rk >> 2);
        }
    else
        {
        /* hi words of IEEE num */
        *((long int *)&num + 1) = 0;
        *((long int *)&num) = rk & 0xfffffffc;
        }
    if(rk & 0x01)
        /* divide by 100 */
        num /= 100;
    return num;
    }
main()
    {
    printf("%f\n", NumFromRk (0x02f1853b));
    }

Если Вы записываете запись NUMBER в BIFF файл, то Microsoft Excel может сконвертировать ее в запись RK после чтения файла.

RSTRING (D6h)

Когда часть строки в ячейке имеет форматирование символов, запись RSTRING используется вместо записи LABEL.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rw

номер строки, отсчитываемый с 0

6

2

col

номер колонки, отсчитываемый с 0

8

2

ixfe

индекс записи XF

10

2

cch

длина строки

12

var

rgch

строка

var

1

cruns

число STRUN структур

var

var

rgstrun

массив STRUN структур

STRUN содержит информацию о форматировании строки. STRUN появляется каждый раз, когда форматирование текста меняется.

Структура STRUN:

BIFF5-BIFF8
Смещ. Размер Имя Описание

0

1

ich

индекс на первый символ к которому применяется форматирование

1

1

ifnt

индекс на запись FONT

SHRFMLA (BCh)

Запись SHRFMLA введена для оптимизации размера файла. Она используется вместе с записью FORMULA для уменьшения необходимого пространства для хранения выражения (rgce). В ранних версиях Microsoft Excel, если Вы читали запись FORMULA в которой поле rgce содержало лексему ptgExp, запись FORMULA содержало массив. В Microsoft Excel версии 5.0, это показывает, что содержится массив или общедоступная формула.

Если запись, следующая за FORMULA - это запись ARRAY, то запись FORMULA содержит массив. Если за FORMULA следует SHRFMLA, то FORMULA содержит общедоступную формулу. Можно также посмотреть бит fShrFmla в записи FORMULA (поле grbit) для определения общедоступной формулы.

Когда читается файл, необходимо перевести записи FORMULA и SHRFMLA в эквивалентную запись FORMULA, если Вы планируете использовать выражение. Для этого необходимо взять все записи FORMULA до (но не включая) поле cce, и затем присоединить их к записи SHRFMLA начиная от поля cce и до конца. Затем необходимо сконвертировать некоторые ptgs.

Запись SHRFMLA будет одной или более записей FORMULA, содержащих лексему ptgExp имеющую одни и те же значения полей rwFirst и colFirst как в ptgExp в первой записи FORMULA. Есть только одна запись SHRFMLA для каждой группы общедоступных формул..

Для преобразования значения ptgs, необходимо найти поле rgce из записи SHRFMLA для лексем ptgRefN, ptgRefNV, ptgRefNA, ptgAreaN, ptgAreaNV, или ptgAreaNA. Добавить соответствующие поля rw и col из FORMULA в поля rwFirst и colFirst в ptgs из SHRFMLA. И, наконец, преобразовать ptgs как показано в таблице.

изменить из ptg

изменить в ptg

ptgRefN

ptgRef

ptgRefNV

ptgRefV

ptgRefNA

ptgRefA

ptgAreaN

ptgArea

ptgAreaNV

ptgAreaV

ptgAreaNA

ptgAreaA

Необходимо помнить, что запись STRING появляется сразу за FORMULA если результат формулы - строка.

Если Вы записываете BIFF файл, всегда записывайте стандартную запись FORMULA; не пытайтесь использовать оптимизацию SHRFMLA.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

rwFirst

первая строка

6

2

rwLast

последняя строка

8

1

colFirst

первая колонка

9

1

colLast

последняя колонка

10

2

(Reserved)

12

2

cce

длина выражения

14

var

rgce

выражение

STRING (207h)

Когда результат формулы - строка, сразу за записью FORMULA появляется запись STRING. Если формула - часть массива, то STRING появляется после записи ARRAY.

BIFF5-BIFF8
Смещ. Размер Имя Описание

4

2

cch

длина строки

6

var

rgch

строка

3.4.3. Как найти ячейки в BIFF файле

Для оптимизации доступа к ячейке (RK, FORMULA, и т.п.), Microsoft Excel использует специальные записи INDEX и DBCELL. Можно использовать эти записи, что бы получить самый быстрый доступ к ячейке, а можно просто прочитать весь BIFF поток подряд для нахождения требуемой ячейки. В зависимости от размера и структуры файла неоптимизированный поиск может оказаться очень долгим.

Если Вы записываете BIFF файл, очень рекомендуется записывать INDEX и DBCELL с соответствующими значениями, иначе Microsoft Excel небудет использовать оптимизацию чтения и процесс будет долгим.

Microsoft Excel хранит ячейки блоками, содержащими до 32 строк. Каждая строка, содержащая ячейки, имеет соответствующую запись ROW, и каждый блок имеет запись DBCELL в конце блока.

Запись INDEX содержит смещения (массив rgibRw), отсчитанные от начала BIFF потока, по которым расположены записи DBCELL.

После того, как запись DBCELL найдена, необходимо, используя значения поля dbRtrw найти смещение первой записи ROW в блоке. Это значение - положительное целое, но показывает оно отрицательное смещение, т.е. отсчитываемое назад от адреса записи DBCELL.

После этого можно вычислить начало каждой записи ячейки в блоке, используя массив rgdb в записи DBCELL. В первом элементе массива указано смещение на первую запись ячейки от адреса второй записи ROW. Это сделано из-за того, что необходимо прочитать первую запись ROW для определения номера строки и принятия соответствующего решения.

3.5. Изменения в новых версиях

3.5.1. Новые записи в BIFF7 по сравнению с BIFF5

Код

Запись

1A5h

FILESHARING2

13Dh

TABID

EAh

TABIDCONF

3.5.2. Измененные записи в BIFF7 по сравнению с BIFF5

Код

Запись

Изменения

9Eh

AUTOFILTER

BIFF7 содержит несколько новых полей для поддержки Top 10 AutoFilter.

5Bh

FILESHARING

BIFF7 и BIFF5 записи идентичны, но действие записи в BIFF7 изменено, когда workbook содержит shared list.

В BIFF7 также содержится несколько новых потоков. Потоки User Names и Revision Log поддерживают новые shared list возможности в Microsoft Excel 7.0. Бинарный формат этих потоков не документирован.

DocumentSummaryInformation (новый для BIFF7) и SummaryInformation поддерживают свойства, доступные в Microsoft Excel 7.0, которые стандартизированы для семейства Office 95 приложений.

В Microsoft Excel 7.0 и всех последующих версиях появилась новая возможность - быстрая запись. Это относится больше к OLE2 формату, поскольку запись происходит не секцию Workbook, а в некую последнюю секцию, называемую мусором ("garbage" или "trash"). Естественно при этом файл увеличивается почти в два раза. Поэтому я бы не советовал пользоваться быстрой записью. По скорости она не сильно быстрее обычной. При считывании последовательно всего файла учитывается только последняя часть.

3.5.3. Новые записи в BIFF8

3.5.4. Измененные записи в BIFF8

4. Литература

  1. Schwartz Martin. LAOLA file system "Structure Storage". The binary structure of OLE/Compound Documents. 1996/1997.
  2. Rentz Daniel. Microsoft Excel File Format. 29.06.2001. http://sc.openoffice.org
  3. DIG2000 file format proposal. Project JPEG2000.
  4. Kindel Charlie. OLE Property Sets Exposed. 6.10.1995. MSDN Library
  5. Brockschmidt Kraig. Inside OLE 2nd Edition. Microsoft Press. 1995. MSDN Library
  6. Microsoft Excel File Format. Microsoft Office Technical Documentation Group. 1995. MSDN Library