Содержание:
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. Литература
BIFF структура представляет собой подряд идущие записи. Все записи имеют следующий общий формат:
ID (2 байта) | Размер данных, sz (2 байта) | Данные (sz байт) |
Первые 4 байта (ID и размер) - это заголовок записи. Размер записи не включает размер заголовка! Все данные записываются в Intel-нотации.
Есть много стандартных записей Exсel. Каждая внутри (секция данных) имеет свой определенный формат. Я попытаюсь рассмотреть как можно больше различных записей.
Записи могут группироваться в потоки. Ограничителем групп (как бы логическими скобками) служат 2 специальные записи: BOF (Begin Of File) и EOF (End Of File). Они имеют следующий формат:
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 кроме функции открытия логических скобок несет еще и информативную функцию - из него можно узнать, что он ограничивает.
Все форматы | |||
Смещ. | Размер | Значение | Описание |
- | 2 | 000AH |
ID |
- | 2 | 0000H | размер |
Структура различна для разных версий
BIFF2-BIFF4
|
BIFF4 Workbook
|
BIFF5-BIFF8
|
Workbook globals - просто перечисление глобальных переменных, а вот поток Sheet records имеет более сложную структуру
Записи Sheet records имеют 3 секции:
|
В формате BIFF8, workbook собирает все строки всех текстовых ячеек в глобальный список, называемый shared string table (SST). Эта таблица располагается в секции workbook globals в записи SST. Вслед за SST записью следует запись EXTSST, которая хранит позицию потока для хэш-таблицы строк. Текстовые ячейки представляются через LABELSST записи, которые содержат индексы в SST. Для чтения важны только SST и LABELSST.
Пример: workbook содержит где-то строки "ААА", "ВВВ" и "ССС"
|
Excel записывает большое число различных записей. Некоторые можно опустить, а некоторые крайне необходимы. Пример из реального файла (всего один лист, никакой лишней информации, BIFF5, всего несколько ячеек заполнены текстом, числами). Не очень важные поля выделены более светлым цветом. Необходимые поля для BIFF5 выделены красным цветом.
|
Что значит основные записи? Это минимальный набор записей, без которых Exel файл не получится. Теоретически его еще можно укоротить, но все же рекомендуется именно такой минимальный набор.
Запись 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) |
Не смотря на то, что без этой записи теоретически можно обойтись, любой 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: |
14 |
1 |
uls |
подчеркивание: |
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 ячейки. |
|
3 |
0008h |
f123Prefix |
для ячейки: Если опция Transition
Navigation Keys выключена (диалоговое окно Options, Transition tab),
f123Prefix = 1 говорит, что первый апостроф используется для
преобразования содержимого ячейки в простую строку. для стиля: = 0 всегда для записи XF стиля |
|
15–4 |
FFF0h |
ixfParent |
для ячейки: индекс в таблице XF на запись родительского стиля. Каждая запись XF ячейки должна иметь запись XF родительского стиля, которая обычно ixfeNormal = 0. для стиля: = FFFh (ixfNULL) всегда для записи XF стиля |
|
10 |
2–0 |
0007h |
alc |
выравнивание: |
3 |
0008h |
fWrap |
= 1 если текст в ячейке можно переносить. |
|
10 |
6–4 |
0070h |
alcV |
вертикальное выравнивание: |
7 |
0080h |
fJustLast |
(используется только в дальневосточных версиях Microsoft Excel) |
|
9–8 |
0300h |
ori |
ориентация текста в ячейке: |
|
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 ячейки. |
|
3 |
0008h |
f123Prefix |
для ячейки: Если опция Transition
Navigation Keys выключена (диалоговое окно Options, Transition tab),
f123Prefix = 1 говорит, что первый апостроф используется
для преобразования содержимого ячейки в простую строку. для стиля: = 0 всегда для записи XF стиля |
|
15–4 |
FFF0h |
ixfParent |
для ячейки: индекс в таблице XF на запись родительского стиля. Каждая запись XF ячейки должна иметь запись XF родительского стиля, которая обычно ixfeNormal = 0. для стиля: = FFFh (ixfNULL) всегда для записи XF стиля |
|
10 |
2–0 |
0007h |
alc |
выравнивание: |
3 |
0008h |
fWrap |
= 1 если текст в ячейке можно переносить. |
|
10 |
6–4 |
0070h |
alcV |
вертикальное выравнивание: |
7 |
0080h |
fJustLast |
(используется только в дальневосточных версиях Microsoft Excel) |
|
15–8 |
FF00h |
ori |
поворот в градусах; |
|
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 |
направление чтения (только для дальневосточных
версий): |
|
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, |
|
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 в BIFF файле. Все стили записываются в алфавитном порядке, так, как они появляются в ниспадающем меню.
BIFF5-BIFF8 | |||
Смещ. | Размер | Имя | Описание |
4 |
2 |
ixfe |
индекс в таблице XF записей (стилевая запись). |
6 |
1 |
istyBuiltIn cch |
Номер встроенного стиля: Для пользовательского стиля: длина названия стиля |
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, поле игнорируется.
Запись хранит имя листа, тип листа, и позицию в потоке.
BIFF5-BIFF8 | |||
Смещ. | Размер | Имя | Описание |
4 |
4 |
lbPlyPos |
позиция в потоке, отсчитываемая от начала записи BOF для листа |
8 |
2 |
grbit |
флаг |
10 |
1 |
cch |
длина названия листа |
11 |
var |
rgch |
название листа |
grbit:
BIFF5-BIFF8 | ||||
Смещ. | Бит | Маска | Имя | Описание |
0 |
7-0 |
0Fh |
dt |
тип листа: |
1 |
1–0 |
03h |
hsState |
Скрыт/показан: |
7-2 |
FCh |
(Reserved) |
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, и т.д.
Запись 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 описывает одну строку на листе 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 заканчивает каждый блок записей ROW (до 32 записей).
BIFF5-BIFF8 | |||
Смещ. | Размер | Имя | Описание |
4 |
4 |
dbRtrw |
Смещение от начала записи DBCELL до первой записи ROW в блоке; смещение отсчитывается назад. |
8 |
var |
rgdb |
Массив смещений (2 байта каждый). |
Запись WINDOW2 содержит атрибуты окна листа в книге (workbook).
BIFF5-BIFF7 | ||||
Смещ. | Размер | Значение | Имя | Описание |
4 |
2 |
grbit |
флаг |
|
6 |
2 |
rwTop |
самая верхняя строка, видимая в окне |
|
8 |
2 |
colLeft |
самая левая колонка, видимая в окне |
|
10 |
4 |
rgbHdr |
Цвет сетки и заголовка строки/колонки |
grbit:
BIFF5-BIFF7 | ||||
Смещ. | Бит | Маска | Имя | Описание |
0 |
0 |
01h |
fDspFmla |
= 1 если должны показываться формулы |
1 |
02h |
fDspGrid |
= 1 если должна показываться сетка |
|
2 |
04h |
fDspRwCol |
= 1 если должны показываться заголовки строк/колонок |
|
3 |
08h |
fFrozen |
= 1 если panes в окне должны быть заморожены |
|
4 |
10h |
fDspZeros |
= 1 если должны показываться нулевые значения
(0) |
|
5 |
20h |
fDefaultHdr |
= 1 цвет заголовка и сетки - по умолчанию |
|
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) |
Для описания ячеек используются записи:
Все эти записи можно разделить на несколько групп:
Запись 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 описывает пустую ячейку. Поле rw содержит отсчитываемый с 0 номер строки. Поле col содержит отсчитываемый с 0 номер колонки.
BIFF5-BIFF8 | |||
Смещ. | Размер | Имя | Описание |
4 |
2 |
rw |
номер строки, отсчитываемый с 0 |
6 |
2 |
col |
номер колонки, отсчитываемый с 0 |
8 |
2 |
ixfe |
индекс записи XF |
Запись 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 описывает ячейку, содержащую формулу.
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 для булева значения |
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 описывает ячейку, содержащую постоянную строку. Длина строки содержится в поле 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 описывает ячейку, содержащую число с правающей запятой. Число, содержащееся с поле num должно быть в 8-байтовом IEEE формате числа с плавающей запятой.
BIFF5-BIFF8 | |||
Смещ. | Размер | Имя | Описание |
4 |
2 |
rw |
номер строки, отсчитываемый с 0 |
6 |
2 |
col |
номер колонки, отсчитываемый с 0 |
8 |
2 |
ixfe |
индекс записи XF |
10 |
8 |
num |
значение числа с плавающей запятой |
Запись 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 эквивалентна до 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;
Для оптимизации и уменьшения размера файла 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:
|
приоритет кодирования |
число (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:
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)); }
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 используется вместо записи 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 введена для оптимизации размера файла. Она используется вместе с записью 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 |
выражение |
Когда результат формулы - строка, сразу за записью FORMULA появляется запись STRING. Если формула - часть массива, то STRING появляется после записи ARRAY.
BIFF5-BIFF8 | |||
Смещ. | Размер | Имя | Описание |
4 |
2 |
cch |
длина строки |
6 |
var |
rgch |
строка |
Для оптимизации доступа к ячейке (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 для определения номера строки и принятия соответствующего решения.
Код |
Запись |
---|---|
1A5h |
FILESHARING2 |
13Dh |
TABID |
EAh |
TABIDCONF |
Код |
Запись |
Изменения |
---|---|---|
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"). Естественно при этом файл увеличивается почти в два раза. Поэтому я бы не советовал пользоваться быстрой записью. По скорости она не сильно быстрее обычной. При считывании последовательно всего файла учитывается только последняя часть.