# -*- coding: cp1252 -*- ## # Module for formatting information. # #
Copyright © 2005-2012 Stephen John Machin, Lingfo Pty Ltd
#This module is part of the xlrd package, which is released under # a BSD-style licence.
## # No part of the content of this file was derived from the works of David Giffin. from __future__ import print_function DEBUG = 0 import re from struct import unpack from .timemachine import * from .biffh import BaseObject, unpack_unicode, unpack_string, \ upkbits, upkbitsL, fprintf, \ FUN, FDT, FNU, FGE, FTX, XL_CELL_NUMBER, XL_CELL_DATE, \ XL_FORMAT, XL_FORMAT2, \ XLRDError _cellty_from_fmtty = { FNU: XL_CELL_NUMBER, FUN: XL_CELL_NUMBER, FGE: XL_CELL_NUMBER, FDT: XL_CELL_DATE, FTX: XL_CELL_NUMBER, # Yes, a number can be formatted as text. } excel_default_palette_b5 = ( ( 0, 0, 0), (255, 255, 255), (255, 0, 0), ( 0, 255, 0), ( 0, 0, 255), (255, 255, 0), (255, 0, 255), ( 0, 255, 255), (128, 0, 0), ( 0, 128, 0), ( 0, 0, 128), (128, 128, 0), (128, 0, 128), ( 0, 128, 128), (192, 192, 192), (128, 128, 128), (153, 153, 255), (153, 51, 102), (255, 255, 204), (204, 255, 255), (102, 0, 102), (255, 128, 128), ( 0, 102, 204), (204, 204, 255), ( 0, 0, 128), (255, 0, 255), (255, 255, 0), ( 0, 255, 255), (128, 0, 128), (128, 0, 0), ( 0, 128, 128), ( 0, 0, 255), ( 0, 204, 255), (204, 255, 255), (204, 255, 204), (255, 255, 153), (153, 204, 255), (255, 153, 204), (204, 153, 255), (227, 227, 227), ( 51, 102, 255), ( 51, 204, 204), (153, 204, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), (102, 102, 153), (150, 150, 150), ( 0, 51, 102), ( 51, 153, 102), ( 0, 51, 0), ( 51, 51, 0), (153, 51, 0), (153, 51, 102), ( 51, 51, 153), ( 51, 51, 51), ) excel_default_palette_b2 = excel_default_palette_b5[:16] # Following table borrowed from Gnumeric 1.4 source. # Checked against OOo docs and MS docs. excel_default_palette_b8 = ( # (red, green, blue) ( 0, 0, 0), (255,255,255), (255, 0, 0), ( 0,255, 0), # 0 ( 0, 0,255), (255,255, 0), (255, 0,255), ( 0,255,255), # 4 (128, 0, 0), ( 0,128, 0), ( 0, 0,128), (128,128, 0), # 8 (128, 0,128), ( 0,128,128), (192,192,192), (128,128,128), # 12 (153,153,255), (153, 51,102), (255,255,204), (204,255,255), # 16 (102, 0,102), (255,128,128), ( 0,102,204), (204,204,255), # 20 ( 0, 0,128), (255, 0,255), (255,255, 0), ( 0,255,255), # 24 (128, 0,128), (128, 0, 0), ( 0,128,128), ( 0, 0,255), # 28 ( 0,204,255), (204,255,255), (204,255,204), (255,255,153), # 32 (153,204,255), (255,153,204), (204,153,255), (255,204,153), # 36 ( 51,102,255), ( 51,204,204), (153,204, 0), (255,204, 0), # 40 (255,153, 0), (255,102, 0), (102,102,153), (150,150,150), # 44 ( 0, 51,102), ( 51,153,102), ( 0, 51, 0), ( 51, 51, 0), # 48 (153, 51, 0), (153, 51,102), ( 51, 51,153), ( 51, 51, 51), # 52 ) default_palette = { 80: excel_default_palette_b8, 70: excel_default_palette_b5, 50: excel_default_palette_b5, 45: excel_default_palette_b2, 40: excel_default_palette_b2, 30: excel_default_palette_b2, 21: excel_default_palette_b2, 20: excel_default_palette_b2, } """ 00H = Normal 01H = RowLevel_lv (see next field) 02H = ColLevel_lv (see next field) 03H = Comma 04H = Currency 05H = Percent 06H = Comma [0] (BIFF4-BIFF8) 07H = Currency [0] (BIFF4-BIFF8) 08H = Hyperlink (BIFF8) 09H = Followed Hyperlink (BIFF8) """ built_in_style_names = [ "Normal", "RowLevel_", "ColLevel_", "Comma", "Currency", "Percent", "Comma [0]", "Currency [0]", "Hyperlink", "Followed Hyperlink", ] def initialise_colour_map(book): book.colour_map = {} book.colour_indexes_used = {} if not book.formatting_info: return # Add the 8 invariant colours for i in xrange(8): book.colour_map[i] = excel_default_palette_b8[i] # Add the default palette depending on the version dpal = default_palette[book.biff_version] ndpal = len(dpal) for i in xrange(ndpal): book.colour_map[i+8] = dpal[i] # Add the specials -- None means the RGB value is not known # System window text colour for border lines book.colour_map[ndpal+8] = None # System window background colour for pattern background book.colour_map[ndpal+8+1] = None # for ci in ( 0x51, # System ToolTip text colour (used in note objects) 0x7FFF, # 32767, system window text colour for fonts ): book.colour_map[ci] = None def nearest_colour_index(colour_map, rgb, debug=0): # General purpose function. Uses Euclidean distance. # So far used only for pre-BIFF8 WINDOW2 record. # Doesn't have to be fast. # Doesn't have to be fancy. best_metric = 3 * 256 * 256 best_colourx = 0 for colourx, cand_rgb in colour_map.items(): if cand_rgb is None: continue metric = 0 for v1, v2 in zip(rgb, cand_rgb): metric += (v1 - v2) * (v1 - v2) if metric < best_metric: best_metric = metric best_colourx = colourx if metric == 0: break if 0 and debug: print("nearest_colour_index for %r is %r -> %r; best_metric is %d" \ % (rgb, best_colourx, colour_map[best_colourx], best_metric)) return best_colourx ## # This mixin class exists solely so that Format, Font, and XF.... objects # can be compared by value of their attributes. class EqNeAttrs(object): def __eq__(self, other): return self.__dict__ == other.__dict__ def __ne__(self, other): return self.__dict__ != other.__dict__ ## # An Excel "font" contains the details of not only what is normally # considered a font, but also several other display attributes. # Items correspond to those in the Excel UI's Format/Cells/Font tab. #A collection of the border-related attributes of an XF record. # Items correspond to those in the Excel UI's Format/Cells/Border tab.
#An explanations of "colour index" is given in the Formatting # section at the start of this document. # There are five line style attributes; possible values and the # associated meanings are: # 0 = No line, # 1 = Thin, # 2 = Medium, # 3 = Dashed, # 4 = Dotted, # 5 = Thick, # 6 = Double, # 7 = Hair, # 8 = Medium dashed, # 9 = Thin dash-dotted, # 10 = Medium dash-dotted, # 11 = Thin dash-dot-dotted, # 12 = Medium dash-dot-dotted, # 13 = Slanted medium dash-dotted. # The line styles 8 to 13 appear in BIFF8 files (Excel 97 and later) only. # For pictures of the line styles, refer to OOo docs s3.10 (p22) # "Line Styles for Cell Borders (BIFF3-BIFF8)".
#Each of the 6 flags below describes the validity of
# a specific group of attributes.
#
# In cell XFs, flag==0 means the attributes of the parent style XF are used,
# (but only if the attributes are valid there); flag==1 means the attributes
# of this XF are used.
# In style XFs, flag==0 means the attribute setting is valid; flag==1 means
# the attribute should be ignored.
# Note that the API
# provides both "raw" XFs and "computed" XFs -- in the latter case, cell XFs
# have had the above inheritance mechanism applied.
#
# Warning: OOo docs on the XF record call this "Index to FORMAT record". # It is not an index in the Python sense. It is a key to a map. # It is true only for Excel 4.0 and earlier files # that the key into format_map from an XF instance # is the same as the index into format_list, and only # if the index is less than 164. #
format_key = 0 ## # An instance of an XFProtection object. protection = None ## # An instance of an XFBackground object. background = None ## # An instance of an XFAlignment object. alignment = None ## # An instance of an XFBorder object. border = None