266 lines
8.3 KiB
266 lines
8.3 KiB
'''
|
|
Formatting
|
|
==========
|
|
|
|
The XF record is able to store explicit cell formatting attributes or the
|
|
attributes of a cell style. Explicit formatting includes the reference to
|
|
a cell style XF record. This allows to extend a defined cell style with
|
|
some explicit attributes. The formatting attributes are divided into
|
|
6 groups:
|
|
|
|
============= ==========================================================
|
|
Group Attributes
|
|
============= ==========================================================
|
|
Number format Number format index (index to FORMAT record)
|
|
Font Font index (index to FONT record)
|
|
Alignment Horizontal and vertical alignment, text wrap, indentation,
|
|
orientation/rotation, text direction
|
|
Border Border line styles and colours
|
|
Background Background area style and colours
|
|
Protection Cell locked, formula hidden
|
|
============= ==========================================================
|
|
|
|
For each group a flag in the cell XF record specifies whether to use the
|
|
attributes contained in that XF record or in the referenced style
|
|
XF record. In style XF records, these flags specify whether the attributes
|
|
will overwrite explicit cell formatting when the style is applied to
|
|
a cell. Changing a cell style (without applying this style to a cell) will
|
|
change all cells which already use that style and do not contain explicit
|
|
cell attributes for the changed style attributes. If a cell XF record does
|
|
not contain explicit attributes in a group (if the attribute group flag
|
|
is not set), it repeats the attributes of its style XF record.
|
|
|
|
'''
|
|
|
|
from . import BIFFRecords
|
|
|
|
class Font(object):
|
|
|
|
ESCAPEMENT_NONE = 0x00
|
|
ESCAPEMENT_SUPERSCRIPT = 0x01
|
|
ESCAPEMENT_SUBSCRIPT = 0x02
|
|
|
|
UNDERLINE_NONE = 0x00
|
|
UNDERLINE_SINGLE = 0x01
|
|
UNDERLINE_SINGLE_ACC = 0x21
|
|
UNDERLINE_DOUBLE = 0x02
|
|
UNDERLINE_DOUBLE_ACC = 0x22
|
|
|
|
FAMILY_NONE = 0x00
|
|
FAMILY_ROMAN = 0x01
|
|
FAMILY_SWISS = 0x02
|
|
FAMILY_MODERN = 0x03
|
|
FAMILY_SCRIPT = 0x04
|
|
FAMILY_DECORATIVE = 0x05
|
|
|
|
CHARSET_ANSI_LATIN = 0x00
|
|
CHARSET_SYS_DEFAULT = 0x01
|
|
CHARSET_SYMBOL = 0x02
|
|
CHARSET_APPLE_ROMAN = 0x4D
|
|
CHARSET_ANSI_JAP_SHIFT_JIS = 0x80
|
|
CHARSET_ANSI_KOR_HANGUL = 0x81
|
|
CHARSET_ANSI_KOR_JOHAB = 0x82
|
|
CHARSET_ANSI_CHINESE_GBK = 0x86
|
|
CHARSET_ANSI_CHINESE_BIG5 = 0x88
|
|
CHARSET_ANSI_GREEK = 0xA1
|
|
CHARSET_ANSI_TURKISH = 0xA2
|
|
CHARSET_ANSI_VIETNAMESE = 0xA3
|
|
CHARSET_ANSI_HEBREW = 0xB1
|
|
CHARSET_ANSI_ARABIC = 0xB2
|
|
CHARSET_ANSI_BALTIC = 0xBA
|
|
CHARSET_ANSI_CYRILLIC = 0xCC
|
|
CHARSET_ANSI_THAI = 0xDE
|
|
CHARSET_ANSI_LATIN_II = 0xEE
|
|
CHARSET_OEM_LATIN_I = 0xFF
|
|
|
|
def __init__(self):
|
|
# twip = 1/20 of a point = 1/1440 of a inch
|
|
# usually resolution == 96 pixels per 1 inch
|
|
# (rarely 120 pixels per 1 inch or another one)
|
|
|
|
self.height = 0x00C8 # 200: this is font with height 10 points
|
|
self.italic = False
|
|
self.struck_out = False
|
|
self.outline = False
|
|
self.shadow = False
|
|
self.colour_index = 0x7FFF
|
|
self.bold = False
|
|
self._weight = 0x0190 # 0x02BC gives bold font
|
|
self.escapement = self.ESCAPEMENT_NONE
|
|
self.underline = self.UNDERLINE_NONE
|
|
self.family = self.FAMILY_NONE
|
|
self.charset = self.CHARSET_SYS_DEFAULT
|
|
self.name = 'Arial'
|
|
|
|
def get_biff_record(self):
|
|
height = self.height
|
|
|
|
options = 0x00
|
|
if self.bold:
|
|
options |= 0x01
|
|
self._weight = 0x02BC
|
|
if self.italic:
|
|
options |= 0x02
|
|
if self.underline != self.UNDERLINE_NONE:
|
|
options |= 0x04
|
|
if self.struck_out:
|
|
options |= 0x08
|
|
if self.outline:
|
|
options |= 0x010
|
|
if self.shadow:
|
|
options |= 0x020
|
|
|
|
colour_index = self.colour_index
|
|
weight = self._weight
|
|
escapement = self.escapement
|
|
underline = self.underline
|
|
family = self.family
|
|
charset = self.charset
|
|
name = self.name
|
|
|
|
return BIFFRecords.FontRecord(height, options, colour_index, weight, escapement,
|
|
underline, family, charset,
|
|
name)
|
|
|
|
def _search_key(self):
|
|
return (
|
|
self.height,
|
|
self.italic,
|
|
self.struck_out,
|
|
self.outline,
|
|
self.shadow,
|
|
self.colour_index,
|
|
self.bold,
|
|
self._weight,
|
|
self.escapement,
|
|
self.underline,
|
|
self.family,
|
|
self.charset,
|
|
self.name,
|
|
)
|
|
|
|
class Alignment(object):
|
|
HORZ_GENERAL = 0x00
|
|
HORZ_LEFT = 0x01
|
|
HORZ_CENTER = 0x02
|
|
HORZ_RIGHT = 0x03
|
|
HORZ_FILLED = 0x04
|
|
HORZ_JUSTIFIED = 0x05 # BIFF4-BIFF8X
|
|
HORZ_CENTER_ACROSS_SEL = 0x06 # Centred across selection (BIFF4-BIFF8X)
|
|
HORZ_DISTRIBUTED = 0x07 # Distributed (BIFF8X)
|
|
|
|
VERT_TOP = 0x00
|
|
VERT_CENTER = 0x01
|
|
VERT_BOTTOM = 0x02
|
|
VERT_JUSTIFIED = 0x03 # Justified (BIFF5-BIFF8X)
|
|
VERT_DISTRIBUTED = 0x04 # Distributed (BIFF8X)
|
|
|
|
DIRECTION_GENERAL = 0x00 # BIFF8X
|
|
DIRECTION_LR = 0x01
|
|
DIRECTION_RL = 0x02
|
|
|
|
ORIENTATION_NOT_ROTATED = 0x00
|
|
ORIENTATION_STACKED = 0x01
|
|
ORIENTATION_90_CC = 0x02
|
|
ORIENTATION_90_CW = 0x03
|
|
|
|
ROTATION_0_ANGLE = 0x00
|
|
ROTATION_STACKED = 0xFF
|
|
|
|
WRAP_AT_RIGHT = 0x01
|
|
NOT_WRAP_AT_RIGHT = 0x00
|
|
|
|
SHRINK_TO_FIT = 0x01
|
|
NOT_SHRINK_TO_FIT = 0x00
|
|
|
|
def __init__(self):
|
|
self.horz = self.HORZ_GENERAL
|
|
self.vert = self.VERT_BOTTOM
|
|
self.dire = self.DIRECTION_GENERAL
|
|
self.orie = self.ORIENTATION_NOT_ROTATED
|
|
self.rota = self.ROTATION_0_ANGLE
|
|
self.wrap = self.NOT_WRAP_AT_RIGHT
|
|
self.shri = self.NOT_SHRINK_TO_FIT
|
|
self.inde = 0
|
|
self.merg = 0
|
|
|
|
def _search_key(self):
|
|
return (
|
|
self.horz, self.vert, self.dire, self.orie, self.rota,
|
|
self.wrap, self.shri, self.inde, self.merg,
|
|
)
|
|
|
|
class Borders(object):
|
|
NO_LINE = 0x00
|
|
THIN = 0x01
|
|
MEDIUM = 0x02
|
|
DASHED = 0x03
|
|
DOTTED = 0x04
|
|
THICK = 0x05
|
|
DOUBLE = 0x06
|
|
HAIR = 0x07
|
|
#The following for BIFF8
|
|
MEDIUM_DASHED = 0x08
|
|
THIN_DASH_DOTTED = 0x09
|
|
MEDIUM_DASH_DOTTED = 0x0A
|
|
THIN_DASH_DOT_DOTTED = 0x0B
|
|
MEDIUM_DASH_DOT_DOTTED = 0x0C
|
|
SLANTED_MEDIUM_DASH_DOTTED = 0x0D
|
|
|
|
NEED_DIAG1 = 0x01
|
|
NEED_DIAG2 = 0x01
|
|
NO_NEED_DIAG1 = 0x00
|
|
NO_NEED_DIAG2 = 0x00
|
|
|
|
def __init__(self):
|
|
self.left = self.NO_LINE
|
|
self.right = self.NO_LINE
|
|
self.top = self.NO_LINE
|
|
self.bottom = self.NO_LINE
|
|
self.diag = self.NO_LINE
|
|
|
|
self.left_colour = 0x40
|
|
self.right_colour = 0x40
|
|
self.top_colour = 0x40
|
|
self.bottom_colour = 0x40
|
|
self.diag_colour = 0x40
|
|
|
|
self.need_diag1 = self.NO_NEED_DIAG1
|
|
self.need_diag2 = self.NO_NEED_DIAG2
|
|
|
|
def _search_key(self):
|
|
return (
|
|
self.left, self.right, self.top, self.bottom, self.diag,
|
|
self.left_colour, self.right_colour, self.top_colour,
|
|
self.bottom_colour, self.diag_colour,
|
|
self.need_diag1, self.need_diag2,
|
|
)
|
|
|
|
class Pattern(object):
|
|
# patterns 0x00 - 0x12
|
|
NO_PATTERN = 0x00
|
|
SOLID_PATTERN = 0x01
|
|
|
|
def __init__(self):
|
|
self.pattern = self.NO_PATTERN
|
|
self.pattern_fore_colour = 0x40
|
|
self.pattern_back_colour = 0x41
|
|
|
|
def _search_key(self):
|
|
return (
|
|
self.pattern,
|
|
self.pattern_fore_colour,
|
|
self.pattern_back_colour,
|
|
)
|
|
|
|
class Protection(object):
|
|
def __init__(self):
|
|
self.cell_locked = 1
|
|
self.formula_hidden = 0
|
|
|
|
def _search_key(self):
|
|
return (
|
|
self.cell_locked,
|
|
self.formula_hidden,
|
|
)
|