# -*- coding: windows-1252 -*-# BOF# UNCALCED# INDEX# Calculation Settings Block# PRINTHEADERS# PRINTGRIDLINES# GRIDSET# GUTS# DEFAULTROWHEIGHT# WSBOOL# Page Settings Block# Worksheet Protection Block# DEFCOLWIDTH# COLINFO# SORT# DIMENSIONS# Row Blocks# WINDOW2# SCL# PANE# SELECTION# STANDARDWIDTH# MERGEDCELLS# LABELRANGES# PHONETIC# Conditional Formatting Table# Hyperlink Table# Data Validity Table# SHEETLAYOUT (BIFF8X only)# SHEETPROTECTION (BIFF8X only)# RANGEPROTECTION (BIFF8X only)# EOFfrom.import BIFFRecords
from.import Bitmap
from.import Style
from.Row import Row
from.Column import Column
from.compat importunicode, itervalues
import tempfile
classWorksheet(object):"""
This is a class
representing the contents of a sheet in a workbook.
.. warning::
You don't normally create instances of this class yourself.
They are returned from calls to :meth:`~xlwt.Workbook.Workbook.add_sheet`.
"""# a safe default value, 3 is always valid!
active_pane =3################################################################### Constructor#################################################################def__init__(self, sheetname, parent_book, cell_overwrite_ok=False):
self.Row = Row
self.Column = Column
self.__name = sheetname
self.__parent = parent_book
self._cell_overwrite_ok = cell_overwrite_ok
self.__rows ={}
self.__cols ={}
self.__merged_ranges =[]
self.__bmp_rec =b''
self.__show_formulas =0
self.__show_grid =1
self.__show_headers =1
self.__panes_frozen =0
self.show_zero_values =1
self.__auto_colour_grid =1
self.__cols_right_to_left =0
self.__show_outline =1
self.__remove_splits =0# Multiple sheets can be selected, but only one can be active# (hold down Ctrl and click multiple tabs in the file in OOo)
self.__selected =0# "sheet_visible" should really be called "sheet_active"# and is 1 when this sheet is the sheet displayed when the file# is open. More than likely only one sheet should ever be set as# visible.# The same sheet should be specified in Workbook.active_sheet# (that way, both the WINDOW1 record in the book and the WINDOW2# records in each sheet will be in agreement)# The visibility of the sheet is found in the "visibility"# attribute obtained from the BOUNDSHEET record.
self.__sheet_visible =0
self.__page_preview =0
self.__first_visible_row =0
self.__first_visible_col =0
self.__grid_colour =0x40
self.__preview_magn =0# use default (60%)
self.__normal_magn =0# use default (100%)
self.__scl_magn =None
self.explicit_magn_setting =False
self.visibility =0# from/to BOUNDSHEET record.
self.__vert_split_pos =None
self.__horz_split_pos =None
self.__vert_split_first_visible =None
self.__horz_split_first_visible =None# This is a caller-settable flag:
self.split_position_units_are_twips =False# Default is False for backward compatibility with pyExcelerator# and previous versions of xlwt.# if panes_frozen:# vert/horz_split_pos are taken as number of rows/cols# else: # split# if split_position_units_are_twips:# vert/horz_split_pos are taken as number of twips# else:# vert/horz_split_pos are taken as# number of rows(cols) * default row(col) height (width) (i.e. 12.75 (8.43) somethings)# and converted to twips by approximate formulas# Callers who are copying an existing file should use# xlwt_worksheet.split_position_units_are_twips = True# because that's what's actually in the file.# There are 20 twips to a point. There are 72 points to an inch.
self.__row_gut_width =0
self.__col_gut_height =0
self.__show_auto_page_breaks =1
self.__dialogue_sheet =0
self.__auto_style_outline =0
self.__outline_below =0
self.__outline_right =0
self.__fit_num_pages =0
self.__show_row_outline =1
self.__show_col_outline =1
self.__alt_expr_eval =0
self.__alt_formula_entries =0
self.__row_default_height =0x00FF
self.row_default_height_mismatch =0
self.row_default_hidden =0
self.row_default_space_above =0
self.row_default_space_below =0
self.__col_default_width =0x0008
self.__calc_mode =1
self.__calc_count =0x0064
self.__RC_ref_mode =1
self.__iterations_on =0
self.__delta =0.001
self.__save_recalc =0
self.__print_headers =0
self.__print_grid =0
self.__grid_set =1
self.__vert_page_breaks =[]
self.__horz_page_breaks =[]
self.__header_str ='&P'
self.__footer_str ='&F'
self.__print_centered_vert =0
self.__print_centered_horz =1
self.__left_margin =0.3#0.5
self.__right_margin =0.3#0.5
self.__top_margin =0.61#1.0
self.__bottom_margin =0.37#1.0
self.__paper_size_code =9# A4
self.__print_scaling =100
self.__start_page_number =1
self.__fit_width_to_pages =1
self.__fit_height_to_pages =1
self.__print_in_rows =1
self.__portrait =1
self.__print_not_colour =0
self.__print_draft =0
self.__print_notes =0
self.__print_notes_at_end =0
self.__print_omit_errors =0
self.__print_hres =0x012C# 300 dpi
self.__print_vres =0x012C# 300 dpi
self.__header_margin =0.1
self.__footer_margin =0.1
self.__copies_num =1
self.__wnd_protect =0
self.__obj_protect =0
self.__protect =0
self.__scen_protect =0
self.__password =''
self.last_used_row =0
self.first_used_row =65535
self.last_used_col =0
self.first_used_col =255
self.row_tempfile =None
self.__flushed_rows ={}
self.__row_visible_levels =0################################################################### Properties, "getters", "setters"#################################################################defset_name(self, value):
self.__name = value
defget_name(self):return self.__name
name =property(get_name, set_name)#################################################################defget_parent(self):return self.__parent
parent =property(get_parent)#################################################################defget_rows(self):return self.__rows
rows =property(get_rows)#################################################################defget_cols(self):return self.__cols
cols =property(get_cols)#################################################################defget_merged_ranges(self):return self.__merged_ranges
merged_ranges =property(get_merged_ranges)#################################################################defget_bmp_rec(self):return self.__bmp_rec
bmp_rec =property(get_bmp_rec)#################################################################defset_show_formulas(self, value):
self.__show_formulas =int(value)defget_show_formulas(self):returnbool(self.__show_formulas)
show_formulas =property(get_show_formulas, set_show_formulas)#################################################################defset_show_grid(self, value):
self.__show_grid =int(value)defget_show_grid(self):returnbool(self.__show_grid)
show_grid =property(get_show_grid, set_show_grid)#################################################################defset_show_headers(self, value):
self.__show_headers =int(value)defget_show_headers(self):returnbool(self.__show_headers)
show_headers =property(get_show_headers, set_show_headers)#################################################################defset_panes_frozen(self, value):
self.__panes_frozen =int(value)defget_panes_frozen(self):returnbool(self.__panes_frozen)
panes_frozen =property(get_panes_frozen, set_panes_frozen)#################################################################### def set_show_empty_as_zero(self, value):### self.__show_empty_as_zero = int(value)### def get_show_empty_as_zero(self):### return bool(self.__show_empty_as_zero)### show_empty_as_zero = property(get_show_empty_as_zero, set_show_empty_as_zero)#################################################################defset_auto_colour_grid(self, value):
self.__auto_colour_grid =int(value)defget_auto_colour_grid(self):returnbool(self.__auto_colour_grid)
auto_colour_grid =property(get_auto_colour_grid, set_auto_colour_grid)#################################################################defset_cols_right_to_left(self, value):
self.__cols_right_to_left =int(value)defget_cols_right_to_left(self):returnbool(self.__cols_right_to_left)
cols_right_to_left =property(get_cols_right_to_left, set_cols_right_to_left)#################################################################defset_show_outline(self, value):
self.__show_outline =int(value)defget_show_outline(self):returnbool(self.__show_outline)
show_outline =property(get_show_outline, set_show_outline)#################################################################defset_remove_splits(self, value):
self.__remove_splits =int(value)defget_remove_splits(self):returnbool(self.__remove_splits)
remove_splits =property(get_remove_splits, set_remove_splits)#################################################################defset_selected(self, value):
self.__selected =int(value)defget_selected(self):returnbool(self.__selected)
selected =property(get_selected, set_selected)#################################################################defset_sheet_visible(self, value):
self.__sheet_visible =int(value)defget_sheet_visible(self):returnbool(self.__sheet_visible)
sheet_visible =property(get_sheet_visible, set_sheet_visible)#################################################################defset_page_preview(self, value):
self.__page_preview =int(value)defget_page_preview(self):returnbool(self.__page_preview)
page_preview =property(get_page_preview, set_page_preview)#################################################################defset_first_visible_row(self, value):
self.__first_visible_row = value
defget_first_visible_row(self):return self.__first_visible_row
first_visible_row =property(get_first_visible_row, set_first_visible_row)#################################################################defset_first_visible_col(self, value):
self.__first_visible_col = value
defget_first_visible_col(self):return self.__first_visible_col
first_visible_col =property(get_first_visible_col, set_first_visible_col)#################################################################defset_grid_colour(self, value):
self.__grid_colour = value
defget_grid_colour(self):return self.__grid_colour
grid_colour =property(get_grid_colour, set_grid_colour)#################################################################defset_preview_magn(self, value):
self.__preview_magn = value
defget_preview_magn(self):return self.__preview_magn
preview_magn =property(get_preview_magn, set_preview_magn)#################################################################defset_normal_magn(self, value):
self.__normal_magn = value
defget_normal_magn(self):return self.__normal_magn
normal_magn =property(get_normal_magn, set_normal_magn)#################################################################defset_scl_magn(self, value):
self.__scl_magn = value
defget_scl_magn(self):return self.__scl_magn
scl_magn =property(get_scl_magn, set_scl_magn)#################################################################defset_vert_split_pos(self, value):
self.__vert_split_pos =abs(value)defget_vert_split_pos(self):return self.__vert_split_pos
vert_split_pos =property(get_vert_split_pos, set_vert_split_pos)#################################################################defset_horz_split_pos(self, value):
self.__horz_split_pos =abs(value)defget_horz_split_pos(self):return self.__horz_split_pos
horz_split_pos =property(get_horz_split_pos, set_horz_split_pos)#################################################################defset_vert_split_first_visible(self, value):
self.__vert_split_first_visible =abs(value)defget_vert_split_first_visible(self):return self.__vert_split_first_visible
vert_split_first_visible =property(get_vert_split_first_visible, set_vert_split_first_visible)#################################################################defset_horz_split_first_visible(self, value):
self.__horz_split_first_visible =abs(value)defget_horz_split_first_visible(self):return self.__horz_split_first_visible
horz_split_first_visible =property(get_horz_split_first_visible, set_horz_split_first_visible)##################################################################def set_row_gut_width(self, value):# self.__row_gut_width = value##def get_row_gut_width(self):# return self.__row_gut_width##row_gut_width = property(get_row_gut_width, set_row_gut_width)####################################################################def set_col_gut_height(self, value):# self.__col_gut_height = value##def get_col_gut_height(self):# return self.__col_gut_height##col_gut_height = property(get_col_gut_height, set_col_gut_height)##################################################################defset_show_auto_page_breaks(self, value):
self.__show_auto_page_breaks =int(value)defget_show_auto_page_breaks(self):returnbool(self.__show_auto_page_breaks)
show_auto_page_breaks =property(get_show_auto_page_breaks, set_show_auto_page_breaks)#################################################################defset_dialogue_sheet(self, value):
self.__dialogue_sheet =int(value)defget_dialogue_sheet(self):returnbool(self.__dialogue_sheet)
dialogue_sheet =property(get_dialogue_sheet, set_dialogue_sheet)#################################################################defset_auto_style_outline(self, value):
self.__auto_style_outline =int(value)defget_auto_style_outline(self):returnbool(self.__auto_style_outline)
auto_style_outline =property(get_auto_style_outline, set_auto_style_outline)#################################################################defset_outline_below(self, value):
self.__outline_below =int(value)defget_outline_below(self):returnbool(self.__outline_below)
outline_below =property(get_outline_below, set_outline_below)#################################################################defset_outline_right(self, value):
self.__outline_right =int(value)defget_outline_right(self):returnbool(self.__outline_right)
outline_right =property(get_outline_right, set_outline_right)#################################################################defset_fit_num_pages(self, value):
self.__fit_num_pages = value
defget_fit_num_pages(self):return self.__fit_num_pages
fit_num_pages =property(get_fit_num_pages, set_fit_num_pages)#################################################################defset_show_row_outline(self, value):
self.__show_row_outline =int(value)defget_show_row_outline(self):returnbool(self.__show_row_outline)
show_row_outline =property(get_show_row_outline, set_show_row_outline)#################################################################defset_show_col_outline(self, value):
self.__show_col_outline =int(value)defget_show_col_outline(self):returnbool(self.__show_col_outline)
show_col_outline =property(get_show_col_outline, set_show_col_outline)#################################################################defset_alt_expr_eval(self, value):
self.__alt_expr_eval =int(value)defget_alt_expr_eval(self):returnbool(self.__alt_expr_eval)
alt_expr_eval =property(get_alt_expr_eval, set_alt_expr_eval)#################################################################defset_alt_formula_entries(self, value):
self.__alt_formula_entries =int(value)defget_alt_formula_entries(self):returnbool(self.__alt_formula_entries)
alt_formula_entries =property(get_alt_formula_entries, set_alt_formula_entries)#################################################################defset_row_default_height(self, value):
self.__row_default_height = value
defget_row_default_height(self):return self.__row_default_height
row_default_height =property(get_row_default_height, set_row_default_height)#################################################################defset_col_default_width(self, value):
self.__col_default_width = value
defget_col_default_width(self):return self.__col_default_width
col_default_width =property(get_col_default_width, set_col_default_width)#################################################################defset_calc_mode(self, value):
self.__calc_mode = value &0x03defget_calc_mode(self):return self.__calc_mode
calc_mode =property(get_calc_mode, set_calc_mode)#################################################################defset_calc_count(self, value):
self.__calc_count = value
defget_calc_count(self):return self.__calc_count
calc_count =property(get_calc_count, set_calc_count)#################################################################defset_RC_ref_mode(self, value):
self.__RC_ref_mode =int(value)defget_RC_ref_mode(self):returnbool(self.__RC_ref_mode)
RC_ref_mode =property(get_RC_ref_mode, set_RC_ref_mode)#################################################################defset_iterations_on(self, value):
self.__iterations_on =int(value)defget_iterations_on(self):returnbool(self.__iterations_on)
iterations_on =property(get_iterations_on, set_iterations_on)#################################################################defset_delta(self, value):
self.__delta = value
defget_delta(self):return self.__delta
delta =property(get_delta, set_delta)#################################################################defset_save_recalc(self, value):
self.__save_recalc =int(value)defget_save_recalc(self):returnbool(self.__save_recalc)
save_recalc =property(get_save_recalc, set_save_recalc)#################################################################defset_print_headers(self, value):
self.__print_headers =int(value)defget_print_headers(self):returnbool(self.__print_headers)
print_headers =property(get_print_headers, set_print_headers)#################################################################defset_print_grid(self, value):
self.__print_grid =int(value)defget_print_grid(self):returnbool(self.__print_grid)
print_grid =property(get_print_grid, set_print_grid)###################################################################def set_grid_set(self, value):# self.__grid_set = int(value)##def get_grid_set(self):# return bool(self.__grid_set)##grid_set = property(get_grid_set, set_grid_set)##################################################################defset_vert_page_breaks(self, value):
self.__vert_page_breaks = value
defget_vert_page_breaks(self):return self.__vert_page_breaks
vert_page_breaks =property(get_vert_page_breaks, set_vert_page_breaks)#################################################################defset_horz_page_breaks(self, value):
self.__horz_page_breaks = value
defget_horz_page_breaks(self):return self.__horz_page_breaks
horz_page_breaks =property(get_horz_page_breaks, set_horz_page_breaks)#################################################################defset_header_str(self, value):ifisinstance(value,str):
value =unicode(value, self.__parent.encoding)
self.__header_str = value
defget_header_str(self):return self.__header_str
header_str =property(get_header_str, set_header_str)#################################################################defset_footer_str(self, value):ifisinstance(value,str):
value =unicode(value, self.__parent.encoding)
self.__footer_str = value
defget_footer_str(self):return self.__footer_str
footer_str =property(get_footer_str, set_footer_str)#################################################################defset_print_centered_vert(self, value):
self.__print_centered_vert =int(value)defget_print_centered_vert(self):returnbool(self.__print_centered_vert)
print_centered_vert =property(get_print_centered_vert, set_print_centered_vert)#################################################################defset_print_centered_horz(self, value):
self.__print_centered_horz =int(value)defget_print_centered_horz(self):returnbool(self.__print_centered_horz)
print_centered_horz =property(get_print_centered_horz, set_print_centered_horz)#################################################################defset_left_margin(self, value):
self.__left_margin = value
defget_left_margin(self):return self.__left_margin
left_margin =property(get_left_margin, set_left_margin)#################################################################defset_right_margin(self, value):
self.__right_margin = value
defget_right_margin(self):return self.__right_margin
right_margin =property(get_right_margin, set_right_margin)#################################################################defset_top_margin(self, value):
self.__top_margin = value
defget_top_margin(self):return self.__top_margin
top_margin =property(get_top_margin, set_top_margin)#################################################################defset_bottom_margin(self, value):
self.__bottom_margin = value
defget_bottom_margin(self):return self.__bottom_margin
bottom_margin =property(get_bottom_margin, set_bottom_margin)#################################################################defset_paper_size_code(self, value):
self.__paper_size_code = value
defget_paper_size_code(self):return self.__paper_size_code
paper_size_code =property(get_paper_size_code, set_paper_size_code)#################################################################defset_print_scaling(self, value):
self.__print_scaling = value
defget_print_scaling(self):return self.__print_scaling
print_scaling =property(get_print_scaling, set_print_scaling)#################################################################defset_start_page_number(self, value):
self.__start_page_number = value
defget_start_page_number(self):return self.__start_page_number
start_page_number =property(get_start_page_number, set_start_page_number)#################################################################defset_fit_width_to_pages(self, value):
self.__fit_width_to_pages = value
defget_fit_width_to_pages(self):return self.__fit_width_to_pages
fit_width_to_pages =property(get_fit_width_to_pages, set_fit_width_to_pages)#################################################################defset_fit_height_to_pages(self, value):
self.__fit_height_to_pages = value
defget_fit_height_to_pages(self):return self.__fit_height_to_pages
fit_height_to_pages =property(get_fit_height_to_pages, set_fit_height_to_pages)#################################################################defset_print_in_rows(self, value):
self.__print_in_rows =int(value)defget_print_in_rows(self):returnbool(self.__print_in_rows)
print_in_rows =property(get_print_in_rows, set_print_in_rows)#################################################################defset_portrait(self, value):
self.__portrait =int(value)defget_portrait(self):returnbool(self.__portrait)
portrait =property(get_portrait, set_portrait)#################################################################defset_print_colour(self, value):
self.__print_not_colour =int(not value)defget_print_colour(self):returnnotbool(self.__print_not_colour)
print_colour =property(get_print_colour, set_print_colour)#################################################################defset_print_draft(self, value):
self.__print_draft =int(value)defget_print_draft(self):returnbool(self.__print_draft)
print_draft =property(get_print_draft, set_print_draft)#################################################################defset_print_notes(self, value):
self.__print_notes =int(value)defget_print_notes(self):returnbool(self.__print_notes)
print_notes =property(get_print_notes, set_print_notes)#################################################################defset_print_notes_at_end(self, value):
self.__print_notes_at_end =int(value)defget_print_notes_at_end(self):returnbool(self.__print_notes_at_end)
print_notes_at_end =property(get_print_notes_at_end, set_print_notes_at_end)#################################################################defset_print_omit_errors(self, value):
self.__print_omit_errors =int(value)defget_print_omit_errors(self):returnbool(self.__print_omit_errors)
print_omit_errors =property(get_print_omit_errors, set_print_omit_errors)#################################################################defset_print_hres(self, value):
self.__print_hres = value
defget_print_hres(self):return self.__print_hres
print_hres =property(get_print_hres, set_print_hres)#################################################################defset_print_vres(self, value):
self.__print_vres = value
defget_print_vres(self):return self.__print_vres
print_vres =property(get_print_vres, set_print_vres)#################################################################defset_header_margin(self, value):
self.__header_margin = value
defget_header_margin(self):return self.__header_margin
header_margin =property(get_header_margin, set_header_margin)#################################################################defset_footer_margin(self, value):
self.__footer_margin = value
defget_footer_margin(self):return self.__footer_margin
footer_margin =property(get_footer_margin, set_footer_margin)#################################################################defset_copies_num(self, value):
self.__copies_num = value
defget_copies_num(self):return self.__copies_num
copies_num =property(get_copies_num, set_copies_num)##################################################################defset_wnd_protect(self, value):
self.__wnd_protect =int(value)defget_wnd_protect(self):returnbool(self.__wnd_protect)
wnd_protect =property(get_wnd_protect, set_wnd_protect)#################################################################defset_obj_protect(self, value):
self.__obj_protect =int(value)defget_obj_protect(self):returnbool(self.__obj_protect)
obj_protect =property(get_obj_protect, set_obj_protect)#################################################################defset_protect(self, value):
self.__protect =int(value)defget_protect(self):returnbool(self.__protect)
protect =property(get_protect, set_protect)#################################################################defset_scen_protect(self, value):
self.__scen_protect =int(value)defget_scen_protect(self):returnbool(self.__scen_protect)
scen_protect =property(get_scen_protect, set_scen_protect)#################################################################defset_password(self, value):
self.__password = value
defget_password(self):return self.__password
password =property(get_password, set_password)#################################################################### Methods##################################################################defget_parent(self):return self.__parent
defwrite(self, r, c, label="", style=Style.default_style):"""
This method is used to write a cell to a :class:`Worksheet`.
:param r:
The zero-relative number of the row in the worksheet to which
the cell should be written.
:param c:
The zero-relative number of the column in the worksheet to which
the cell should be written.
:param label:
The data value to be written.
An :class:`int`, :class:`long`, or
:class:`~decimal.Decimal` instance is converted to :class:`float`.
A :class:`unicode` instance is written as is. A :class:`bytes`
instance is converted to :class:`unicode` using the
encoding, which defaults to ``ascii``, specified when the
:class:`Workbook` instance was created.
A :class:`~datetime.datetime`, :class:`~datetime.date` or
:class:`~datetime.time` instance is converted into Excel date format
(a float representing the number of days since (typically)
``1899-12-31T00:00:00``, under the pretence that
1900 was a leap year).
A :class:`bool` instance will show up as ``TRUE`` or ``FALSE`` in
Excel.
``None`` causes the cell to be blank: no data, only formatting.
An :class:`xlwt.Formula` instance causes an Excel formula to be
written.
:param style:
A style, also known as an XF (extended format), is an
:class:`~xlwt.Style.XFStyle` object, which encapsulates the
formatting applied to the cell and its contents.
:class:`~xlwt.Style.XFStyle` objects are best set up using the
:func:`~xlwt.Style.easyxf` function. They may also be set up by
setting attributes in :class:`Alignment`, :class:`Borders`,
:class:`Pattern`, :class:`Font` and :class:`Protection` objects then
setting those objects and a format string as attributes of an
:class:`~xlwt.Style.XFStyle` object.
"""
self.row(r).write(c, label, style)defwrite_rich_text(self, r, c, rich_text_list, style=Style.default_style):
self.row(r).set_cell_rich_text(c, rich_text_list, style)defmerge(self, r1, r2, c1, c2, style=Style.default_style):# Stand-alone merge of previously written cells.# Problems: (1) style to be used should be existing style of# the top-left cell, not an arg.# (2) should ensure that any previous data value in# non-top-left cells is nobbled.# Note: if a cell is set by a data record then later# is referenced by a [MUL]BLANK record, Excel will blank# out the cell on the screen, but OOo & Gnu will not# blank it out. Need to do something better than writing# multiple records. In the meantime, avoid this method and use# write_merge() instead.if c2 > c1:
self.row(r1).write_blanks(c1 +1, c2, style)for r inrange(r1+1, r2+1):
self.row(r).write_blanks(c1, c2, style)
self.__merged_ranges.append((r1, r2, c1, c2))defwrite_merge(self, r1, r2, c1, c2, label="", style=Style.default_style):assert0<= c1 <= c2 <=255assert0<= r1 <= r2 <=65535
self.write(r1, c1, label, style)if c2 > c1:
self.row(r1).write_blanks(c1 +1, c2, style)# skip (r1, c1)for r inrange(r1+1, r2+1):
self.row(r).write_blanks(c1, c2, style)
self.__merged_ranges.append((r1, r2, c1, c2))definsert_bitmap(self, filename, row, col, x =0, y =0, scale_x =1, scale_y =1):
bmp = Bitmap.ImDataBmpRecord(filename)
obj = Bitmap.ObjBmpRecord(row, col, self, bmp, x, y, scale_x, scale_y)
self.__bmp_rec += obj.get()+ bmp.get()definsert_bitmap_data(self, data, row, col, x =0, y =0, scale_x =1, scale_y =1):
bmp = Bitmap.ImRawDataBmpRecord(data)
obj = Bitmap.ObjBmpRecord(row, col, self, bmp, x, y, scale_x, scale_y)
self.__bmp_rec += obj.get()+ bmp.get()defcol(self, indx):if indx notin self.__cols:
self.__cols[indx]= self.Column(indx, self)return self.__cols[indx]defrow(self, indx):if indx notin self.__rows:if indx in self.__flushed_rows:raise Exception("Attempt to reuse row index %d of sheet %r after flushing"%(indx, self.__name))
self.__rows[indx]= self.Row(indx, self)if indx > self.last_used_row:
self.last_used_row = indx
if indx < self.first_used_row:
self.first_used_row = indx
return self.__rows[indx]defrow_height(self, row):# in pixelsif row in self.__rows:return self.__rows[row].get_height_in_pixels()else:return17defcol_width(self, col):# in pixelsif col in self.__cols:return self.__cols[col].width_in_pixels()else:return64#################################################################### BIFF records generation##################################################################def__bof_rec(self):return BIFFRecords.Biff8BOFRecord(BIFFRecords.Biff8BOFRecord.WORKSHEET).get()def__update_row_visible_levels(self):if self.__rows:
temp =max(self.__rows[r].level for r in self.__rows)+1
self.__row_visible_levels =max(temp, self.__row_visible_levels)def__guts_rec(self):
self.__update_row_visible_levels()
col_visible_levels =0iflen(self.__cols)!=0:
col_visible_levels =max(self.__cols[c].level for c in self.__cols)+1return BIFFRecords.GutsRecord(
self.__row_gut_width, self.__col_gut_height, self.__row_visible_levels, col_visible_levels).get()def__defaultrowheight_rec(self):
options =0x0000
options |=(self.row_default_height_mismatch &1)<<0
options |=(self.row_default_hidden &1)<<1
options |=(self.row_default_space_above &1)<<2
options |=(self.row_default_space_below &1)<<3
defht = self.__row_default_height
return BIFFRecords.DefaultRowHeightRecord(options, defht).get()def__wsbool_rec(self):
options =0x00
options |=(self.__show_auto_page_breaks &0x01)<<0
options |=(self.__dialogue_sheet &0x01)<<4
options |=(self.__auto_style_outline &0x01)<<5
options |=(self.__outline_below &0x01)<<6
options |=(self.__outline_right &0x01)<<7
options |=(self.__fit_num_pages &0x01)<<8
options |=(self.__show_row_outline &0x01)<<10
options |=(self.__show_col_outline &0x01)<<11
options |=(self.__alt_expr_eval &0x01)<<14
options |=(self.__alt_formula_entries &0x01)<<15return BIFFRecords.WSBoolRecord(options).get()def__eof_rec(self):return BIFFRecords.EOFRecord().get()def__colinfo_rec(self):
result =b''for col in self.__cols:
result += self.__cols[col].get_biff_record()return result
def__dimensions_rec(self):return BIFFRecords.DimensionsRecord(
self.first_used_row, self.last_used_row,
self.first_used_col, self.last_used_col
).get()def__window2_rec(self):# Appends SCL record.
options =0
options |=(self.__show_formulas &0x01)<<0
options |=(self.__show_grid &0x01)<<1
options |=(self.__show_headers &0x01)<<2
options |=(self.__panes_frozen &0x01)<<3
options |=(self.show_zero_values &0x01)<<4
options |=(self.__auto_colour_grid &0x01)<<5
options |=(self.__cols_right_to_left &0x01)<<6
options |=(self.__show_outline &0x01)<<7
options |=(self.__remove_splits &0x01)<<8
options |=(self.__selected &0x01)<<9
options |=(self.__sheet_visible &0x01)<<10
options |=(self.__page_preview &0x01)<<11if self.explicit_magn_setting:# Experimentation: caller can set the scl magn.# None -> no SCL record written# Otherwise 10 <= scl_magn <= 400 or scl_magn == 0# Note: value 0 means use 100 for normal view, 60 for page break preview# BREAKING NEWS: Excel interprets scl_magn = 0 very literally, your# sheet appears like a tiny dot on the screen
scl_magn = self.__scl_magn
else:if self.__page_preview:
scl_magn = self.__preview_magn
magn_default =60else:
scl_magn = self.__normal_magn
magn_default =100if scl_magn == magn_default or scl_magn ==0:# Emulate what we think MS does
scl_magn =None# don't write an SCL recordreturn BIFFRecords.Window2Record(
options, self.__first_visible_row, self.__first_visible_col,
self.__grid_colour,
self.__preview_magn, self.__normal_magn, scl_magn).get()def__panes_rec(self):if self.__vert_split_pos isNoneand self.__horz_split_pos isNone:returnb""if self.__vert_split_pos isNone:
self.__vert_split_pos =0if self.__horz_split_pos isNone:
self.__horz_split_pos =0if self.__panes_frozen:if self.__vert_split_first_visible isNone:
self.__vert_split_first_visible = self.__vert_split_pos
if self.__horz_split_first_visible isNone:
self.__horz_split_first_visible = self.__horz_split_pos
# when frozen, the active pane has to be specifically set:if self.__vert_split_pos >0and self.__horz_split_pos >0:
active_pane =0elif self.__vert_split_pos >0and self.__horz_split_pos ==0:
active_pane =1elif self.__vert_split_pos ==0and self.__horz_split_pos >0:
active_pane =2else:
active_pane =3else:if self.__vert_split_first_visible isNone:
self.__vert_split_first_visible =0if self.__horz_split_first_visible isNone:
self.__horz_split_first_visible =0ifnot self.split_position_units_are_twips:# inspired by pyXLWriterif self.__horz_split_pos >0:
self.__horz_split_pos =20* self.__horz_split_pos +255if self.__vert_split_pos >0:
self.__vert_split_pos =113.879* self.__vert_split_pos +390# when split, the active pain can be set as required:
active_pane = self.active_pane
result = BIFFRecords.PanesRecord(*map(int,(
self.__vert_split_pos,
self.__horz_split_pos,
self.__horz_split_first_visible,
self.__vert_split_first_visible,
active_pane
))).get()return result
def__row_blocks_rec(self):
result =[]for row in itervalues(self.__rows):
result.append(row.get_row_biff_data())
result.append(row.get_cells_biff_data())returnb''.join(result)def__merged_rec(self):return BIFFRecords.MergedCellsRecord(self.__merged_ranges).get()def__bitmaps_rec(self):return self.__bmp_rec
def__calc_settings_rec(self):
result =b''
result += BIFFRecords.CalcModeRecord(self.__calc_mode &0x01).get()
result += BIFFRecords.CalcCountRecord(self.__calc_count &0xFFFF).get()
result += BIFFRecords.RefModeRecord(self.__RC_ref_mode &0x01).get()
result += BIFFRecords.IterationRecord(self.__iterations_on &0x01).get()
result += BIFFRecords.DeltaRecord(self.__delta).get()
result += BIFFRecords.SaveRecalcRecord(self.__save_recalc &0x01).get()return result
def__print_settings_rec(self):
result =b''
result += BIFFRecords.PrintHeadersRecord(self.__print_headers).get()
result += BIFFRecords.PrintGridLinesRecord(self.__print_grid).get()
result += BIFFRecords.GridSetRecord(self.__grid_set).get()
result += BIFFRecords.HorizontalPageBreaksRecord(self.__horz_page_breaks).get()
result += BIFFRecords.VerticalPageBreaksRecord(self.__vert_page_breaks).get()
result += BIFFRecords.HeaderRecord(self.__header_str).get()
result += BIFFRecords.FooterRecord(self.__footer_str).get()
result += BIFFRecords.HCenterRecord(self.__print_centered_horz).get()
result += BIFFRecords.VCenterRecord(self.__print_centered_vert).get()
result += BIFFRecords.LeftMarginRecord(self.__left_margin).get()
result += BIFFRecords.RightMarginRecord(self.__right_margin).get()
result += BIFFRecords.TopMarginRecord(self.__top_margin).get()
result += BIFFRecords.BottomMarginRecord(self.__bottom_margin).get()
setup_page_options =(self.__print_in_rows &0x01)<<0
setup_page_options |=(self.__portrait &0x01)<<1
setup_page_options |=(0x00&0x01)<<2
setup_page_options |=(self.__print_not_colour &0x01)<<3
setup_page_options |=(self.__print_draft &0x01)<<4
setup_page_options |=(self.__print_notes &0x01)<<5
setup_page_options |=(0x00&0x01)<<6
setup_page_options |=(0x01&0x01)<<7
setup_page_options |=(self.__print_notes_at_end &0x01)<<9
setup_page_options |=(self.__print_omit_errors &0x03)<<10
result += BIFFRecords.SetupPageRecord(self.__paper_size_code,
self.__print_scaling,
self.__start_page_number,
self.__fit_width_to_pages,
self.__fit_height_to_pages,
setup_page_options,
self.__print_hres,
self.__print_vres,
self.__header_margin,
self.__footer_margin,
self.__copies_num).get()return result
def__protection_rec(self):
result =b''
result += BIFFRecords.ProtectRecord(self.__protect).get()
result += BIFFRecords.ScenProtectRecord(self.__scen_protect).get()
result += BIFFRecords.WindowProtectRecord(self.__wnd_protect).get()
result += BIFFRecords.ObjectProtectRecord(self.__obj_protect).get()
result += BIFFRecords.PasswordRecord(self.__password).get()return result
defget_biff_data(self):
result =[
self.__bof_rec(),
self.__calc_settings_rec(),
self.__guts_rec(),
self.__defaultrowheight_rec(),
self.__wsbool_rec(),
self.__colinfo_rec(),
self.__dimensions_rec(),
self.__print_settings_rec(),
self.__protection_rec(),]if self.row_tempfile:
self.row_tempfile.flush()
self.row_tempfile.seek(0)
result.append(self.row_tempfile.read())
self.row_tempfile.seek(0,2)# to EOF# Above seek() is necessary to avoid a spurious IOError# with Errno 0 if the caller continues on writing rows# and flushing row data after the save().# See https://bugs.python.org/issue3207
result.extend([
self.__row_blocks_rec(),
self.__merged_rec(),
self.__bitmaps_rec(),
self.__window2_rec(),
self.__panes_rec(),
self.__eof_rec(),])returnb''.join(result)defflush_row_data(self):if self.row_tempfile isNone:
self.row_tempfile = tempfile.TemporaryFile()
self.row_tempfile.write(self.__row_blocks_rec())for rowx in self.__rows:
self.__flushed_rows[rowx]=1
self.__update_row_visible_levels()
self.__rows ={}