Moxcel (версия 1.11 бета от 25.03.2004)

Данный документ доступент по следующим адрессам:
http://sourceforge.net/projects/lproject
http://1l.w4b.ru/
Авторство принадлежит:
Copyright © 2004 Дмитрий Павлюк <dmp@myrealbox.com>
Copyright © 2004 Евгений Пивнев <eugene@spb.rosgazservice.com>

Каждый имеет право воспроизводить, распространять и/или вносить изменения в настоящий документ в соответствии с условиями GNU Free Documentation License, версией 1.2 или любой более поздней версией, опубликованной Free Software Foundation;

Данный документ не содержит неизменяемых разделов, текста, помещаемого на первой странице обложки, и текста, помещаемого на последней странице обложки.

Копия GNU Free Documentation License помещена в файл под названием " GNU_FDL.html".

Содержание

Благодарности
1. Введение
2. Структура файла
3. Заголовок файла
4. Свойства ячеек (общие)
4.1. Свойства ячеек по группам (вкладкам)
4.2. Рисунки цвета
4.3. Рисунки узора
4.4. Рисунки стилей рамки
4.5. Свойства таблицы (отличия)
4.6. Свойства колонтитулов (отличия)
4.7. Свойства ячейки для колонок (отличия)
4.8. Свойства ячейки для строк (отличия)
4.9. Свойства ячейки для рисунков
4.10. Свойства рисунка - дополнение к св-вам ячейки
+Рисунок
+OLE
4.11. Свойства ячейки для диалога (формы)
5. Свойства шрифта
6. Свойства объединения
7. Свойства секции
8. Свойства имен

Благодарности

Большое спасибо:
Дмитрию Серёжину <dm88@bk.ru>, ICQ - 36513822 - начавшему разбор формата, и предоставивший, начальные данные по формату (*.mxl).
Евгению Пивневу <eugene@spb.rosgazservice.com> - активно учавствовавшему в разборе формата (*.mxl), и его тестировании.

Введение/Комментарии

  1. Файлы типа *.mxl или "moxсel" представляют собой набор последовательных блоков. Т.е. при разборе файла всегда известна структура текущего блока и какой следующий блок, после текущего. Размер блока может увеличиваться в зависимости от содержимого блока, т.к. может содержать вложенные блоки.
  2. Что такое блок? В принципе их два типа  - "логический" и "физический". Логический блок - это собрание физических блоков в логически целый объект, а физический - это данные, длина которых всегда известна и не меняется. :)
  3. Как правило физический блок устроен так: Т. е.  длина блока не постоянна, а зависит от количества данных которые в нее входят, и если в нее входят другие блоки, то и от их длины.
  4. Логический блок чаще всего устроен так: Например:
    блок номеров - [кол-во номеров] [номер 1] [номер 2] ... [номер n]
    блок свойств - [кол-во св-в] [св-во 1] [св-во 2] ... [св-во m]
    (!) Важно, как правило n = m, т.к. если сначала идут номера свойств, то их и должно быть столько же, сколько и свойств, справедливо и обратное. :-)
    И пример их физической реализации:
    данные длина комментарий
    0x0003 2 кол-во номеров = 3
    0x00000001 4 первое св-во имеет номер = 1
    0x00000005 4 второе св-во имеет номер = 5
    0x00000006 4 и т.д.
    0x0003 2 кол-во св-в = 3
    0x000000000066 6 св-во № 1
    0x000000005500 6 св-во № 5
    0x007700005500 6 и т.п.
  5. Наиболее распространенным блоком являются св-ва ячейки. Его формат с небольшими изменениями используется для следующих св-в:
  6. Что такое диалоговая таблица?
    "Диалоговая таблица" - это таблица которая работает в режиме ввода данных. Т.е. это естественно или в отчете, или в обработке в "св-вах формы" выбрана таблица "для ввода данных". После чего в св-вах ячейки появляется дополнительная вкладка "Данные".
  7. Свойства ячейки всегда состоят и пары значений флажок и значение. Если значение флажка не ноль, то сопутствующее ему значение установленно и имеет смысл, Если флажок не установлен, то сопутствующее ему значение либо ноль, либо сохраняет прошлое значение. Флажки являются битовыми. т. е. в одном байте - 8 бит - 8 флажков.
    В таблице "свойств ячеек по группам" отображены вышеупомянутые пары.
  8. Некоторые выводы:
  9. То что не сохраняется в таблице:
  10. Что необходимо еще сделать:


Структура файла

Краткое описание колонок:
3 - Обязательная длина, которая есть всегда.
4,5 - Длина первого, второго уровня, есть только тогда, когда в вышестоящем уровне указано длина больше нуля, и повторяется столько раз, сколько указано в длине.
Если в длине указан "+" значит длина зарание неизвестна, нужно смотреть свойства текущего блока.
1
2
3
4
5
6
логические
блоки
физические
блоки
дл.
обяз.
дл.
ур. 1
дл.
ур. 2
комментарии
заголовок
25
(0x19)


заголовок
таблица св-ва ячейки для все таблицы 30


св-ва ячейки для табл.
шрифты номера шрифтов 2


кол-во



4

номер шрифта

шрифты 2


кол-во = предедущ.



60
св-ва шрифта

(?) 4


(?)
колонтитулы верхний колонтитул 30


св-ва ячейки для колонт.

нижний колонтитул 30


св-ва ячейки для колонт.
колонки номера колонок 2


кол-во



4

номер колонки

колонки 2

кол-во = предедущ.



30

св-ва ячейки для кол.
строки номера строк 2

кол-во



4

номер строки

строки 2


кол-во = предедущ.



30

св-ва ячейки для стр.
ячейки номера колонок
2

кол-во




4 номер колонки

ячейки
2
кол-во = предедущ.




30+ св-ва ячейки

текст

+
текст

расшифровка

+
расшифровка
рисунки рисунки вставляемые 2


кол-во



30+

св-ва ячейки для рис.



40

св-ва рисунка



+

рисунок, OLE
объединение объединение 2


кол-во



16

св-ва объединения
секции секции вертикальные 2

кол-во



13+

св-ва секции



+

имя

секции горизонтальные 2

кол-во



13+

св-ва секции



+

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


кол-во



4

номера колонок после

переводы страниц горизонтальные 2


кол-во



4
номера строк после
имена имена 4


кол-во



1

длина имени



+

имя



28

св-ва имени


Заголовок файла

Смещение
Длина
Знач.
Комментарий
0x00
6

"MOXCEL"
0x0b
0x06
?
0x0d 4
0-
Номер максимальной колонки
0x11 4
0- Номер максимальной строки
0x15 4
0-
Количество рисунков (объектов) или последний номер объекта


Свойства ячейки (общие св-ва)

Флажки:
    - (изменение) устанавливает если хоть раз св-во изменилось и больше не сбрасывается.
    - (не авто) если значение установить в "Авто", флажок сбрасывается,
      а сопутствующие значения (цветов) остаются, т. е. флажок может быть сброшен = 0,
      но значение (цвета) быть не нулевым, ведь 0 = первый цвет (черный).
    - (длина > 0) если длина строки = 0, флажок сбрасывается.
Смещение
Длина
Знач.
Комментарий
По умолч.



Флажки
0x00 1
0x01
0x02
0x04
0x08
0x10
0x20
0x40
0x80
Шрифт - Имя (не авто)
Шрифт - Размер (не авто)
Шрифт - Жирный (изменение)
Шрифт - Наклонный (изменение)
Шрифт - Подчеркнутый (изменение)
Рамка - Лево (изменение)
Рамка - Верх (изменение)
Рамка - Право (изменение)
0
0x01 1
0x01
0x02
0x04
0x08
0x10

0x20
0x40
0x80
Рамка - Низ (изменение)
Цвет рамок (не авто)
Флажок общий № 1 (исп. в других св-вах)
Флажок общий № 2 (исп. в других св-вах)
По горизонтали (изменение)
По выделенным столбцам (изменение)
По вертикали (изменение)
Цвет шрифта (не авто)
Фон (не авто)
0
0x02
1
0x01
0x02
0x04
0x08
0x10
Узор (не авто)
Цвет узора (не авто)
Контроль (изменение)
Тип (изменение)
Защита (изменение)
0
0x03 1
0x40
0x80
Расшифровка (длина > 0)
Текст (длина > 0)
0



Значения
0x04
2

Значение общие № 1 (исп. в других св-вах)
0x06 2

Значение общие № 2 (исп. в других св-вах)
0x08 2(?)
1-
Номер Имени шрифта
= Arial (задается в конфигураторе)
0x0a 2
р
Шрифт - Размер
8=-32,  9=-36,  10=-40, 11=-44
размер = -р/4
= 8 (задается в конфигураторе)
0x0c 1
4
7
Шрифт - Жирный = 0
Шрифт - Жирный = 1
0
0x0d 1
0
1
Шрифт - Наклонный = 0
Шрифт - Наклонный = 1
0
0x0e 1
0
1
Шрифт - Подчеркнутый = 0
Шрифт - Подчеркнутый = 1
0
0x0f
1
0
2
4
6
0x20
По горизонтали = Лево
По горизонтали = Право
По горизонтали = По ширине
По горизонтали = Центр
По выделенным столбцам = 1
По горизонтали = Лево,
По выделенным столбцам = 0
0x10
1
0
0x08
0x18
По вертикали = Верх
По вертикали = Низ
По вертикали = Центр
= Низ
0x11 1
0-15
Узор = Номер узора
(отсчет слева - направо, сверху - вниз)
При "Авто" сохраняет номер старого номера
= Авто
0x12 1
0-9
Рамка - Лево = Номер стиля рамки
(отсчет особый)
0
0x13 1
0-9
Рамка - Верх = Номер стиля рамки
(отсчет особый)
0
0x14 1
0-9
Рамка - Право = Номер стиля рамки
(отсчет особый)
0
0x15 1
0-9
Рамка - Низ = Номер стиля рамки
(отсчет особый)
0
0x16
1
0-55
Цвет узора = Номер цвета
(отсчет слева - направо, сверху - вниз)
= Авто
0x17
1
0-55
Цвет рамок = Номер цвета
(отсчет слева - направо, сверху - вниз)
= Авто
0x18
1
0-55
Цвет шрифта = Номер цвета
(отсчет слева - направо, сверху - вниз)
= Авто
0x19 1
0-55
Фон = Номер цвета
(отсчет слева - направо, сверху - вниз)
= Авто
0x1a
1
0
1
2
3
4
5
Контроль = Авто
Контроль = Обрезать
Контроль = Забивать
Контроль = Переносить
Контроль = Красный
Контроль = Забивать + Красный
= Авто
0x1b
1
0
1
2
3
Тип = Текст
Тип = Выражение
Тип = Шаблон
Тип = Фикс. шаблон
= Текст
0x1c
1
1
Защита = 0,
т. е. инверсия!
= 1 (0)
0x1d

?




Блок Текста

0x00
0x00+
0x01
1(*)
2(**)
дл1
дл1(1)
дл1(2)

Длина Текста (?(<255, дл, 0xff))
Длина Текста (?(>=255, дл, ""))
Текст
= "" (Нет)



Блок Расшифровки
0x00
0x00+
0x01
1(*)
2(**)
дл2
дл2(1)
дл2(2)

Длина Расшифровки (?(<255, дл, 0xff))
Длина Расшифровки (?(>=255, дл, ""))
Расшифровка
= "" (Нет)



* - Блок Текста и Расшифровки, вставляются после блока Ячейки, только в том случае, если длина  строки их текста больше нуля. И в порядке приведенном в таблице - Текст, Расшифровка.
** - если длина текста больше 254, то она записывается 3 байтами, первый - 0xff, далее идет слово - длина текста.



Свойства ячейки по группам

Группа
Название значения
Смещ.
флага
Знач.
флага
Смещ.
знач.
Текст




Тип
0x02 0x08 0x1b

Контроль
0x02 0x04 0x1a

Текст (Значение)
0x03 0x80 0x1d+

Расшифровка
0x03 0x40 0x1d+

Защита
0x02 0x10 0x1c
Положение





По горизонтали
0x01 0x10 0x0f

По выделенным столбцам
0x01 0x10 0x0f

По вертикали
0x01 0x20 0x10
Шрифт





Имя
0x00 0x01 0x08

Размер
0x00 0x02 0x0a

Жирный
0x00 0x04 0x0c

Наклонный
0x00 0x08 0x0d

Подчеркнутый
0x00 0x10 0x0e

Цвет
0x01 0x40 0x18
Рамка





Лево
0x00 0x20 0x12

Верх
0x00 0x40 0x13

Право
0x00 0x80 0x14

Низ
0x01 0x01 0x15

Обвести




Цвет
0x01 0x02 0x17
Узор





Фон
0x01 0x80 0x19

Узор
0x02 0x01 0x11

Цвет
0x02 0x02 0x16
+ Колонки





Положение на странице верт.
0x01 0x04 0x04

Ширина колонки
0x01 0x08 0x06
+ Строки





Высота строки
0x01
0x04 0x04

Положение на странице гориз.
0x01 0x08 0x06
+ Колонтитулы





Выводить с:
0x01 0x04 0x04

номер страница 0x01 0x08 0x06


Рисунки Цвета

Цвет
(отсчет слева - направо, сверху - вниз)
(вариант - сделан при помощи Gimp, достоверность не гарантируется)


Рисунки Узора

Узор
(отсчет слева - направо, сверху - вниз)


Рисунки Стилей рамки

Стили рамки
0
4
1
5
8
6
2
7
3
9
(отсчет особый - примерно сверху - вниз, слева - направо)


Изменения для свойств таблицы

Отличия от св-в ячейки
Смещение Длина Знач. Комментарий По умолч.
Флажки




0x01 1
0x08 ?
0x08
Значение




0x06 2
0x0048 ?
0x0048


Изменения для свойств колонтитулов

Отличия от св-в ячейки
Смещение Длина Знач. Комментарий По умолч.
Флажки




0x01 1

0x04 = Выводить с: (изменение)
0x08 = Номер страницы (изменение)

Значения




0x04 2

Выводить с:
1 = да (отметка галочкой)
0xffff = нет
1
0x06 2

Выводить с: номер страницы 1


Изменения для свойств колонки

Отличия от св-в ячейки
Смещение Длина Знач. Комментарий По умолч.
Флажки




0x01 1



0x04 = Положение на странице (изменение)
0x08 = Ширина колонки (не авто)
0

Авто=0
Значения




0x04 2

Положение на странице верт.
0x01 = с новой строки
0x02 =  вместе со следующим
(значения могут суммироваться)
0
0x06 2
ш Ширина колонки
30=240,  45=360
ширина = ш/8
(При авто сохр. старое знач.)
Авто=0, (ширина = 9)


Изменения для свойств строки

Отличия от св-в ячейки
Смещение Длина Знач. Комментарий По умолч.
Флажки




0x01 1


0x04 = Высота строки (изменение)
0x08 = Положение на странице (изменение)

Значения




0x04 2
в Высота строки
30=120,  60=240
высота = в/4
Авто=0, (высота=11,25)
0x06 2

Положение на странице гориз.
0x01 = с новой строки
0x02 = вместе со следующим
(значения могут суммироваться)
0


Изменения для свойств ячейки рисунка

Отличия от св-в ячейки. Изменилась вкладка "Рамка" на "Линия".
Смещение
Длина
Знач.
Комментарий
По умолч.
Флажки




0x00 1
0x20
0x40
0x80
Стиль (изменения)
Толщина (изменения)
Рамки (изменения)

0x01
1
0xa0
0x01
По умолчанию (Цвет шрифта=0, фон=1)
Выводить на печать (изменения)
0xa0
0x02 1
0x08
Тип текста
(по умолчанию для рисунка, OLE, диаграммы)
0x08
Значения




0x12
1
0-5
Стиль
Стиль=1
0x13 1
0-2 Толщина Толщина=0
0x14 1

0x01
0x02
0x04
0x08
Рамки
Слева
Сверху
Справа
Снизу
=0x0f
0x15 1
0-1
0 - Выводить на печать
1 - Не выводить на печать (инверсия)
Выводить на печать = 0
0x1b
1
0x04
Тип текста = ? (комментарий)
(по умолчанию для рисунка, OLE, диаграммы)
0x04


Свойства рисунка (дополнительные)

Общие для всех рисунков
Смещение
Длина
Знач.
Комментарий
По умолч.
0x00
4(?)
1
2
3
4
5
Объект:
Линия
Прямоугольник
Текст
OLE, Диаграмма
Рисунок

0x04
4
0- Номер колонки начальной ячейки
0x08 4
0- Номер строки начальной ячейки
0x0с 4
0- Смещение X относительно верхнего левого угла
начальной ячейки в ?

0x10 4
0- Смещение Y относительно верхнего левого угла
начальной ячейки в ?

0x14
4
0-
Номер колонки конечной ячейки

0x18 4
0-
Номер строки конечной ячейки
0x1с 4
0-
Смещение X относительно верхнего левого угла
конечной ячейки в ?

0x20 4
0-
Смещение Y относительно верхнего левого угла
конечной ячейки в ?

0x24
4(?)
1-
Уровень плана (?), связано с командами
на передний, задний план



Свойства рисунка (рисунок)

Добавляется после дополнительных св-в (только для рисунка)
Длина 8 байт + рисунок
Смещение
Длина
Знач.
Комментарий
По умолч.
0x00
4
0x746с
? = "lt\x00\x00"
0x0000746c
0x04 4
дл


0x04+ дл

Рисунок




Свойства рисунка (OLE)

Добавляется после дополнительных св-в (только OLE, диаграммы)
Длина 42(для прервого)/24(для остальных) байта + OLE
Смещение
Длина
Знач.
Комментарий
По умолч.



начало (длина = 2)
0x00
2
0xffff
0x8001
- Есть "строка имени OLE" (?)
- Нет




строка имени OLE (длина = 4*+14*)
встречается только в первом OLE

0x00+2 2(*) 0
(?)
* - Есть, только при 0x00 = 0xffff
0x00
0x00+4
2(*)
дл_об
Длина строки OLE (всегда 0x0e)
* - Есть, только при 0x00 = 0xffff
0x0e
0x00+6
дл_об(*)

Строка OLE (всегда "CSheetCntrItem")
* - Есть, только при 0x00 = 0xffff
"CSheetCntrItem"



продолжение (длина = 22)
0x00 4
0x100
? = 256
0x00000100
0x02
4

Порядковый номер рисунка (?),
от рис. к рис. увеличивается на 2 или 3

0x06
4

1 - для OLE
0x0012f150 - для "Диаграммы"

0x0a
2
0
0
0x0000
0x0e 4
1
1 0x00000001
0x12 4
длOLE
Длина OLE объекта

0x12+1 длOLE
OLE


Свойства ячейки (модифицированные для диалога)

Отличия от св-в ячейки. Добавилась вкладка "Данные".
Смещение Длина Знач. Комментарий По умолч.



Флажки
0x02 1
0x20
Тип (изменения)

0x03
1

0x40 = Формула (длина > 0)
0x80 = Текст (длина > 0)




Значения

0x1d+
0+1+дл

текст = значение (см. св-ва ячейки)

0x1d+
0+1+дл
формула (см. св-ва ячейки)


(длина=16+) доп. св-ва
0x00
1
дл_с
Длина всех доп. св-в

0x04
1
0x03
? исп. в строке, число

0x06
1

Тип =
0x41 = Вид расчета
0x42 = Справочник
0x43 = Календарь
0x44 = Дата
0x45 = Перечисление
0x4b = Вид субконто
0x4e = Число
0x4f = Документ
0x50 = План счетов
0x53 = Строка
0x53 = Счет
0x55 = Неопределенный

0x07 1
0-
Длина (строки, числа и т. п.)

0x0b 1
0-
Точность (число)

0x0f 2
0-
? Номер вида
справочника, документа, перечисления, и т.п.

0x13
1
0x01 Не отрицательный=1 (число)

0x14 1
0x01 Разделять триады=1 (число)
0x15 1(*)
дл_вз
? Длина внутреннего значения.
*Есть у числа, даты, справочника, документа, перечисления и т.п.

0x15+ дл_вз
? Внутренее значение



(длина=1+)

0x00
1
дл_ф

0
0x00+ дл_ф
Формат


(длина=7+)

0x00
0x01 ? (установленно у неопр. значения)

0x01



0x02 1
0x01
Кнопка выбора=1
0
0x03



0x04 1
0x01 Сделать недоступным=1
0
0x05 1
0x01 Запретить редактирование=1
0
0x06 1
дл_м
Длина маски

0x06+ дл_м
Маска



Свойства шрифта

(см. MFC CFont)
Смещение Длина Знач. Комментарий
По умолч.
0x00
4

Высота:
0 - По умолчанию
>0 - Размер шрифта
<0 - Абсолютный размер шрифта
0
0x04 4

Ширина
0
0x08 4

Escapement 0
0x0с 4

Ориентация
0
0x10 4

Weight:
0x700 - bold
0x400 - regular
0
0x14 1

Italic 0
0x15 1

Underline 0
0x16 1

StrikeOut 0
0x17
1

Кодировка:
0xcc (204) - кирилица

0x18 1
3
OutPrecision:
OUT_STROKE_PRECIS = 3

0x19 1
2
ClipPrecision:
CLIP_STROKE_PRECIS = 2

0x1a 1
1
Quality:
DRAFT_QUALITY = 1

0x1b 1


PitchAndFamily:
DEFAULT_PITCH = 0
FIXED_PITCH = 1
VARIABLE_PITCH = 2
MONO_FONT = 8
и:
FF_DONTCARE = 0x00
FF_ROMAN = 0x10
FF_SWISS = 0x20
FF_MODERN = 0x30
FF_SCRIPT = 0x40
FF_DECORATIVE = 0x50

0x1c 32

Имя шрифта
(заканчивается на 0)



Свойства объединения

Смещение Длина Знач. Комментарий По умолч.
0x00 4
Номер начальной колонки
0x04 4

Номер конечной строки
0x08 4
Номер конечной колонки
0x0с
4

Номер конечной строки


Свойства секции

Смещение
Длина
Знач.
Комментарий
По умолч.
0x00 4

Номер начальной строки/колонки

0x04 4

Номер конечной строки/колонки
0x08 4(?)
Входимость в другую группу =
номер верхней группы
0
0x0c 1
дл Длина имени секции
+ дл
Имя секции


Свойства имен

Смещение Длина Знач. Комментарий По умолч.
0x00 1
дл_и
Длина имени

0x00+ дл_и
Имя
0x00 4(?) 1
?

0x04
4(?)
0x0012f9e8 (?)
0x08 4(?)
3
?

0x0c 4

номер начальной колонки

0x10
4

номер начальной строки
0x14 4
номер конечной колонки
0x18 4
номер конечной строки

(c) Дмитрий Павлюк
(с) Евгений Пивнев