Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/xlwt/Worksheet.py: 34%
718 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1# -*- coding: windows-1252 -*-
2# BOF
3# UNCALCED
4# INDEX
5# Calculation Settings Block
6# PRINTHEADERS
7# PRINTGRIDLINES
8# GRIDSET
9# GUTS
10# DEFAULTROWHEIGHT
11# WSBOOL
12# Page Settings Block
13# Worksheet Protection Block
14# DEFCOLWIDTH
15# COLINFO
16# SORT
17# DIMENSIONS
18# Row Blocks
19# WINDOW2
20# SCL
21# PANE
22# SELECTION
23# STANDARDWIDTH
24# MERGEDCELLS
25# LABELRANGES
26# PHONETIC
27# Conditional Formatting Table
28# Hyperlink Table
29# Data Validity Table
30# SHEETLAYOUT (BIFF8X only)
31# SHEETPROTECTION (BIFF8X only)
32# RANGEPROTECTION (BIFF8X only)
33# EOF
35from . import BIFFRecords
36from . import Bitmap
37from . import Style
38from .Row import Row
39from .Column import Column
40from .compat import unicode, itervalues
41import tempfile
43class Worksheet(object):
44 """
45 This is a class
46 representing the contents of a sheet in a workbook.
48 .. warning::
50 You don't normally create instances of this class yourself.
51 They are returned from calls to :meth:`~xlwt.Workbook.Workbook.add_sheet`.
52 """
53 # a safe default value, 3 is always valid!
54 active_pane = 3
56 #################################################################
57 ## Constructor
58 #################################################################
59 def __init__(self, sheetname, parent_book, cell_overwrite_ok=False):
60 self.Row = Row
61 self.Column = Column
63 self.__name = sheetname
64 self.__parent = parent_book
65 self._cell_overwrite_ok = cell_overwrite_ok
67 self.__rows = {}
68 self.__cols = {}
69 self.__merged_ranges = []
70 self.__bmp_rec = b''
72 self.__show_formulas = 0
73 self.__show_grid = 1
74 self.__show_headers = 1
75 self.__panes_frozen = 0
76 self.show_zero_values = 1
77 self.__auto_colour_grid = 1
78 self.__cols_right_to_left = 0
79 self.__show_outline = 1
80 self.__remove_splits = 0
81 # Multiple sheets can be selected, but only one can be active
82 # (hold down Ctrl and click multiple tabs in the file in OOo)
83 self.__selected = 0
84 # "sheet_visible" should really be called "sheet_active"
85 # and is 1 when this sheet is the sheet displayed when the file
86 # is open. More than likely only one sheet should ever be set as
87 # visible.
88 # The same sheet should be specified in Workbook.active_sheet
89 # (that way, both the WINDOW1 record in the book and the WINDOW2
90 # records in each sheet will be in agreement)
91 # The visibility of the sheet is found in the "visibility"
92 # attribute obtained from the BOUNDSHEET record.
93 self.__sheet_visible = 0
94 self.__page_preview = 0
96 self.__first_visible_row = 0
97 self.__first_visible_col = 0
98 self.__grid_colour = 0x40
99 self.__preview_magn = 0 # use default (60%)
100 self.__normal_magn = 0 # use default (100%)
101 self.__scl_magn = None
102 self.explicit_magn_setting = False
104 self.visibility = 0 # from/to BOUNDSHEET record.
106 self.__vert_split_pos = None
107 self.__horz_split_pos = None
108 self.__vert_split_first_visible = None
109 self.__horz_split_first_visible = None
111 # This is a caller-settable flag:
113 self.split_position_units_are_twips = False
115 # Default is False for backward compatibility with pyExcelerator
116 # and previous versions of xlwt.
117 # if panes_frozen:
118 # vert/horz_split_pos are taken as number of rows/cols
119 # else: # split
120 # if split_position_units_are_twips:
121 # vert/horz_split_pos are taken as number of twips
122 # else:
123 # vert/horz_split_pos are taken as
124 # number of rows(cols) * default row(col) height (width) (i.e. 12.75 (8.43) somethings)
125 # and converted to twips by approximate formulas
126 # Callers who are copying an existing file should use
127 # xlwt_worksheet.split_position_units_are_twips = True
128 # because that's what's actually in the file.
130 # There are 20 twips to a point. There are 72 points to an inch.
132 self.__row_gut_width = 0
133 self.__col_gut_height = 0
135 self.__show_auto_page_breaks = 1
136 self.__dialogue_sheet = 0
137 self.__auto_style_outline = 0
138 self.__outline_below = 0
139 self.__outline_right = 0
140 self.__fit_num_pages = 0
141 self.__show_row_outline = 1
142 self.__show_col_outline = 1
143 self.__alt_expr_eval = 0
144 self.__alt_formula_entries = 0
146 self.__row_default_height = 0x00FF
147 self.row_default_height_mismatch = 0
148 self.row_default_hidden = 0
149 self.row_default_space_above = 0
150 self.row_default_space_below = 0
152 self.__col_default_width = 0x0008
154 self.__calc_mode = 1
155 self.__calc_count = 0x0064
156 self.__RC_ref_mode = 1
157 self.__iterations_on = 0
158 self.__delta = 0.001
159 self.__save_recalc = 0
161 self.__print_headers = 0
162 self.__print_grid = 0
163 self.__grid_set = 1
164 self.__vert_page_breaks = []
165 self.__horz_page_breaks = []
166 self.__header_str = '&P'
167 self.__footer_str = '&F'
168 self.__print_centered_vert = 0
169 self.__print_centered_horz = 1
170 self.__left_margin = 0.3 #0.5
171 self.__right_margin = 0.3 #0.5
172 self.__top_margin = 0.61 #1.0
173 self.__bottom_margin = 0.37 #1.0
174 self.__paper_size_code = 9 # A4
175 self.__print_scaling = 100
176 self.__start_page_number = 1
177 self.__fit_width_to_pages = 1
178 self.__fit_height_to_pages = 1
179 self.__print_in_rows = 1
180 self.__portrait = 1
181 self.__print_not_colour = 0
182 self.__print_draft = 0
183 self.__print_notes = 0
184 self.__print_notes_at_end = 0
185 self.__print_omit_errors = 0
186 self.__print_hres = 0x012C # 300 dpi
187 self.__print_vres = 0x012C # 300 dpi
188 self.__header_margin = 0.1
189 self.__footer_margin = 0.1
190 self.__copies_num = 1
192 self.__wnd_protect = 0
193 self.__obj_protect = 0
194 self.__protect = 0
195 self.__scen_protect = 0
196 self.__password = ''
198 self.last_used_row = 0
199 self.first_used_row = 65535
200 self.last_used_col = 0
201 self.first_used_col = 255
202 self.row_tempfile = None
203 self.__flushed_rows = {}
204 self.__row_visible_levels = 0
206 #################################################################
207 ## Properties, "getters", "setters"
208 #################################################################
210 def set_name(self, value):
211 self.__name = value
213 def get_name(self):
214 return self.__name
216 name = property(get_name, set_name)
218 #################################################################
220 def get_parent(self):
221 return self.__parent
223 parent = property(get_parent)
225 #################################################################
227 def get_rows(self):
228 return self.__rows
230 rows = property(get_rows)
232 #################################################################
234 def get_cols(self):
235 return self.__cols
237 cols = property(get_cols)
239 #################################################################
241 def get_merged_ranges(self):
242 return self.__merged_ranges
244 merged_ranges = property(get_merged_ranges)
246 #################################################################
248 def get_bmp_rec(self):
249 return self.__bmp_rec
251 bmp_rec = property(get_bmp_rec)
253 #################################################################
255 def set_show_formulas(self, value):
256 self.__show_formulas = int(value)
258 def get_show_formulas(self):
259 return bool(self.__show_formulas)
261 show_formulas = property(get_show_formulas, set_show_formulas)
263 #################################################################
265 def set_show_grid(self, value):
266 self.__show_grid = int(value)
268 def get_show_grid(self):
269 return bool(self.__show_grid)
271 show_grid = property(get_show_grid, set_show_grid)
273 #################################################################
275 def set_show_headers(self, value):
276 self.__show_headers = int(value)
278 def get_show_headers(self):
279 return bool(self.__show_headers)
281 show_headers = property(get_show_headers, set_show_headers)
283 #################################################################
285 def set_panes_frozen(self, value):
286 self.__panes_frozen = int(value)
288 def get_panes_frozen(self):
289 return bool(self.__panes_frozen)
291 panes_frozen = property(get_panes_frozen, set_panes_frozen)
293 #################################################################
295 ### def set_show_empty_as_zero(self, value):
296 ### self.__show_empty_as_zero = int(value)
298 ### def get_show_empty_as_zero(self):
299 ### return bool(self.__show_empty_as_zero)
301 ### show_empty_as_zero = property(get_show_empty_as_zero, set_show_empty_as_zero)
303 #################################################################
305 def set_auto_colour_grid(self, value):
306 self.__auto_colour_grid = int(value)
308 def get_auto_colour_grid(self):
309 return bool(self.__auto_colour_grid)
311 auto_colour_grid = property(get_auto_colour_grid, set_auto_colour_grid)
313 #################################################################
315 def set_cols_right_to_left(self, value):
316 self.__cols_right_to_left = int(value)
318 def get_cols_right_to_left(self):
319 return bool(self.__cols_right_to_left)
321 cols_right_to_left = property(get_cols_right_to_left, set_cols_right_to_left)
323 #################################################################
325 def set_show_outline(self, value):
326 self.__show_outline = int(value)
328 def get_show_outline(self):
329 return bool(self.__show_outline)
331 show_outline = property(get_show_outline, set_show_outline)
333 #################################################################
335 def set_remove_splits(self, value):
336 self.__remove_splits = int(value)
338 def get_remove_splits(self):
339 return bool(self.__remove_splits)
341 remove_splits = property(get_remove_splits, set_remove_splits)
343 #################################################################
345 def set_selected(self, value):
346 self.__selected = int(value)
348 def get_selected(self):
349 return bool(self.__selected)
351 selected = property(get_selected, set_selected)
353 #################################################################
355 def set_sheet_visible(self, value):
356 self.__sheet_visible = int(value)
358 def get_sheet_visible(self):
359 return bool(self.__sheet_visible)
361 sheet_visible = property(get_sheet_visible, set_sheet_visible)
363 #################################################################
365 def set_page_preview(self, value):
366 self.__page_preview = int(value)
368 def get_page_preview(self):
369 return bool(self.__page_preview)
371 page_preview = property(get_page_preview, set_page_preview)
373 #################################################################
375 def set_first_visible_row(self, value):
376 self.__first_visible_row = value
378 def get_first_visible_row(self):
379 return self.__first_visible_row
381 first_visible_row = property(get_first_visible_row, set_first_visible_row)
383 #################################################################
385 def set_first_visible_col(self, value):
386 self.__first_visible_col = value
388 def get_first_visible_col(self):
389 return self.__first_visible_col
391 first_visible_col = property(get_first_visible_col, set_first_visible_col)
393 #################################################################
395 def set_grid_colour(self, value):
396 self.__grid_colour = value
398 def get_grid_colour(self):
399 return self.__grid_colour
401 grid_colour = property(get_grid_colour, set_grid_colour)
403 #################################################################
405 def set_preview_magn(self, value):
406 self.__preview_magn = value
408 def get_preview_magn(self):
409 return self.__preview_magn
411 preview_magn = property(get_preview_magn, set_preview_magn)
413 #################################################################
415 def set_normal_magn(self, value):
416 self.__normal_magn = value
418 def get_normal_magn(self):
419 return self.__normal_magn
421 normal_magn = property(get_normal_magn, set_normal_magn)
423 #################################################################
425 def set_scl_magn(self, value):
426 self.__scl_magn = value
428 def get_scl_magn(self):
429 return self.__scl_magn
431 scl_magn = property(get_scl_magn, set_scl_magn)
434 #################################################################
436 def set_vert_split_pos(self, value):
437 self.__vert_split_pos = abs(value)
439 def get_vert_split_pos(self):
440 return self.__vert_split_pos
442 vert_split_pos = property(get_vert_split_pos, set_vert_split_pos)
444 #################################################################
446 def set_horz_split_pos(self, value):
447 self.__horz_split_pos = abs(value)
449 def get_horz_split_pos(self):
450 return self.__horz_split_pos
452 horz_split_pos = property(get_horz_split_pos, set_horz_split_pos)
454 #################################################################
456 def set_vert_split_first_visible(self, value):
457 self.__vert_split_first_visible = abs(value)
459 def get_vert_split_first_visible(self):
460 return self.__vert_split_first_visible
462 vert_split_first_visible = property(get_vert_split_first_visible, set_vert_split_first_visible)
464 #################################################################
466 def set_horz_split_first_visible(self, value):
467 self.__horz_split_first_visible = abs(value)
469 def get_horz_split_first_visible(self):
470 return self.__horz_split_first_visible
472 horz_split_first_visible = property(get_horz_split_first_visible, set_horz_split_first_visible)
474 #################################################################
476 #def set_row_gut_width(self, value):
477 # self.__row_gut_width = value
478 #
479 #def get_row_gut_width(self):
480 # return self.__row_gut_width
481 #
482 #row_gut_width = property(get_row_gut_width, set_row_gut_width)
483 #
484 #################################################################
485 #
486 #def set_col_gut_height(self, value):
487 # self.__col_gut_height = value
488 #
489 #def get_col_gut_height(self):
490 # return self.__col_gut_height
491 #
492 #col_gut_height = property(get_col_gut_height, set_col_gut_height)
493 #
494 #################################################################
496 def set_show_auto_page_breaks(self, value):
497 self.__show_auto_page_breaks = int(value)
499 def get_show_auto_page_breaks(self):
500 return bool(self.__show_auto_page_breaks)
502 show_auto_page_breaks = property(get_show_auto_page_breaks, set_show_auto_page_breaks)
504 #################################################################
506 def set_dialogue_sheet(self, value):
507 self.__dialogue_sheet = int(value)
509 def get_dialogue_sheet(self):
510 return bool(self.__dialogue_sheet)
512 dialogue_sheet = property(get_dialogue_sheet, set_dialogue_sheet)
514 #################################################################
516 def set_auto_style_outline(self, value):
517 self.__auto_style_outline = int(value)
519 def get_auto_style_outline(self):
520 return bool(self.__auto_style_outline)
522 auto_style_outline = property(get_auto_style_outline, set_auto_style_outline)
524 #################################################################
526 def set_outline_below(self, value):
527 self.__outline_below = int(value)
529 def get_outline_below(self):
530 return bool(self.__outline_below)
532 outline_below = property(get_outline_below, set_outline_below)
534 #################################################################
536 def set_outline_right(self, value):
537 self.__outline_right = int(value)
539 def get_outline_right(self):
540 return bool(self.__outline_right)
542 outline_right = property(get_outline_right, set_outline_right)
544 #################################################################
546 def set_fit_num_pages(self, value):
547 self.__fit_num_pages = value
549 def get_fit_num_pages(self):
550 return self.__fit_num_pages
552 fit_num_pages = property(get_fit_num_pages, set_fit_num_pages)
554 #################################################################
556 def set_show_row_outline(self, value):
557 self.__show_row_outline = int(value)
559 def get_show_row_outline(self):
560 return bool(self.__show_row_outline)
562 show_row_outline = property(get_show_row_outline, set_show_row_outline)
564 #################################################################
566 def set_show_col_outline(self, value):
567 self.__show_col_outline = int(value)
569 def get_show_col_outline(self):
570 return bool(self.__show_col_outline)
572 show_col_outline = property(get_show_col_outline, set_show_col_outline)
574 #################################################################
576 def set_alt_expr_eval(self, value):
577 self.__alt_expr_eval = int(value)
579 def get_alt_expr_eval(self):
580 return bool(self.__alt_expr_eval)
582 alt_expr_eval = property(get_alt_expr_eval, set_alt_expr_eval)
584 #################################################################
586 def set_alt_formula_entries(self, value):
587 self.__alt_formula_entries = int(value)
589 def get_alt_formula_entries(self):
590 return bool(self.__alt_formula_entries)
592 alt_formula_entries = property(get_alt_formula_entries, set_alt_formula_entries)
594 #################################################################
596 def set_row_default_height(self, value):
597 self.__row_default_height = value
599 def get_row_default_height(self):
600 return self.__row_default_height
602 row_default_height = property(get_row_default_height, set_row_default_height)
604 #################################################################
606 def set_col_default_width(self, value):
607 self.__col_default_width = value
609 def get_col_default_width(self):
610 return self.__col_default_width
612 col_default_width = property(get_col_default_width, set_col_default_width)
614 #################################################################
616 def set_calc_mode(self, value):
617 self.__calc_mode = value & 0x03
619 def get_calc_mode(self):
620 return self.__calc_mode
622 calc_mode = property(get_calc_mode, set_calc_mode)
624 #################################################################
626 def set_calc_count(self, value):
627 self.__calc_count = value
629 def get_calc_count(self):
630 return self.__calc_count
632 calc_count = property(get_calc_count, set_calc_count)
634 #################################################################
636 def set_RC_ref_mode(self, value):
637 self.__RC_ref_mode = int(value)
639 def get_RC_ref_mode(self):
640 return bool(self.__RC_ref_mode)
642 RC_ref_mode = property(get_RC_ref_mode, set_RC_ref_mode)
644 #################################################################
646 def set_iterations_on(self, value):
647 self.__iterations_on = int(value)
649 def get_iterations_on(self):
650 return bool(self.__iterations_on)
652 iterations_on = property(get_iterations_on, set_iterations_on)
654 #################################################################
656 def set_delta(self, value):
657 self.__delta = value
659 def get_delta(self):
660 return self.__delta
662 delta = property(get_delta, set_delta)
664 #################################################################
666 def set_save_recalc(self, value):
667 self.__save_recalc = int(value)
669 def get_save_recalc(self):
670 return bool(self.__save_recalc)
672 save_recalc = property(get_save_recalc, set_save_recalc)
674 #################################################################
676 def set_print_headers(self, value):
677 self.__print_headers = int(value)
679 def get_print_headers(self):
680 return bool(self.__print_headers)
682 print_headers = property(get_print_headers, set_print_headers)
684 #################################################################
686 def set_print_grid(self, value):
687 self.__print_grid = int(value)
689 def get_print_grid(self):
690 return bool(self.__print_grid)
692 print_grid = property(get_print_grid, set_print_grid)
694 #################################################################
695 #
696 #def set_grid_set(self, value):
697 # self.__grid_set = int(value)
698 #
699 #def get_grid_set(self):
700 # return bool(self.__grid_set)
701 #
702 #grid_set = property(get_grid_set, set_grid_set)
703 #
704 #################################################################
706 def set_vert_page_breaks(self, value):
707 self.__vert_page_breaks = value
709 def get_vert_page_breaks(self):
710 return self.__vert_page_breaks
712 vert_page_breaks = property(get_vert_page_breaks, set_vert_page_breaks)
714 #################################################################
716 def set_horz_page_breaks(self, value):
717 self.__horz_page_breaks = value
719 def get_horz_page_breaks(self):
720 return self.__horz_page_breaks
722 horz_page_breaks = property(get_horz_page_breaks, set_horz_page_breaks)
724 #################################################################
726 def set_header_str(self, value):
727 if isinstance(value, str):
728 value = unicode(value, self.__parent.encoding)
729 self.__header_str = value
731 def get_header_str(self):
732 return self.__header_str
734 header_str = property(get_header_str, set_header_str)
736 #################################################################
738 def set_footer_str(self, value):
739 if isinstance(value, str):
740 value = unicode(value, self.__parent.encoding)
741 self.__footer_str = value
743 def get_footer_str(self):
744 return self.__footer_str
746 footer_str = property(get_footer_str, set_footer_str)
748 #################################################################
750 def set_print_centered_vert(self, value):
751 self.__print_centered_vert = int(value)
753 def get_print_centered_vert(self):
754 return bool(self.__print_centered_vert)
756 print_centered_vert = property(get_print_centered_vert, set_print_centered_vert)
758 #################################################################
760 def set_print_centered_horz(self, value):
761 self.__print_centered_horz = int(value)
763 def get_print_centered_horz(self):
764 return bool(self.__print_centered_horz)
766 print_centered_horz = property(get_print_centered_horz, set_print_centered_horz)
768 #################################################################
770 def set_left_margin(self, value):
771 self.__left_margin = value
773 def get_left_margin(self):
774 return self.__left_margin
776 left_margin = property(get_left_margin, set_left_margin)
778 #################################################################
780 def set_right_margin(self, value):
781 self.__right_margin = value
783 def get_right_margin(self):
784 return self.__right_margin
786 right_margin = property(get_right_margin, set_right_margin)
788 #################################################################
790 def set_top_margin(self, value):
791 self.__top_margin = value
793 def get_top_margin(self):
794 return self.__top_margin
796 top_margin = property(get_top_margin, set_top_margin)
798 #################################################################
800 def set_bottom_margin(self, value):
801 self.__bottom_margin = value
803 def get_bottom_margin(self):
804 return self.__bottom_margin
806 bottom_margin = property(get_bottom_margin, set_bottom_margin)
808 #################################################################
810 def set_paper_size_code(self, value):
811 self.__paper_size_code = value
813 def get_paper_size_code(self):
814 return self.__paper_size_code
816 paper_size_code = property(get_paper_size_code, set_paper_size_code)
818 #################################################################
820 def set_print_scaling(self, value):
821 self.__print_scaling = value
823 def get_print_scaling(self):
824 return self.__print_scaling
826 print_scaling = property(get_print_scaling, set_print_scaling)
828 #################################################################
830 def set_start_page_number(self, value):
831 self.__start_page_number = value
833 def get_start_page_number(self):
834 return self.__start_page_number
836 start_page_number = property(get_start_page_number, set_start_page_number)
838 #################################################################
840 def set_fit_width_to_pages(self, value):
841 self.__fit_width_to_pages = value
843 def get_fit_width_to_pages(self):
844 return self.__fit_width_to_pages
846 fit_width_to_pages = property(get_fit_width_to_pages, set_fit_width_to_pages)
848 #################################################################
850 def set_fit_height_to_pages(self, value):
851 self.__fit_height_to_pages = value
853 def get_fit_height_to_pages(self):
854 return self.__fit_height_to_pages
856 fit_height_to_pages = property(get_fit_height_to_pages, set_fit_height_to_pages)
858 #################################################################
860 def set_print_in_rows(self, value):
861 self.__print_in_rows = int(value)
863 def get_print_in_rows(self):
864 return bool(self.__print_in_rows)
866 print_in_rows = property(get_print_in_rows, set_print_in_rows)
868 #################################################################
870 def set_portrait(self, value):
871 self.__portrait = int(value)
873 def get_portrait(self):
874 return bool(self.__portrait)
876 portrait = property(get_portrait, set_portrait)
878 #################################################################
880 def set_print_colour(self, value):
881 self.__print_not_colour = int(not value)
883 def get_print_colour(self):
884 return not bool(self.__print_not_colour)
886 print_colour = property(get_print_colour, set_print_colour)
888 #################################################################
890 def set_print_draft(self, value):
891 self.__print_draft = int(value)
893 def get_print_draft(self):
894 return bool(self.__print_draft)
896 print_draft = property(get_print_draft, set_print_draft)
898 #################################################################
900 def set_print_notes(self, value):
901 self.__print_notes = int(value)
903 def get_print_notes(self):
904 return bool(self.__print_notes)
906 print_notes = property(get_print_notes, set_print_notes)
908 #################################################################
910 def set_print_notes_at_end(self, value):
911 self.__print_notes_at_end = int(value)
913 def get_print_notes_at_end(self):
914 return bool(self.__print_notes_at_end)
916 print_notes_at_end = property(get_print_notes_at_end, set_print_notes_at_end)
918 #################################################################
920 def set_print_omit_errors(self, value):
921 self.__print_omit_errors = int(value)
923 def get_print_omit_errors(self):
924 return bool(self.__print_omit_errors)
926 print_omit_errors = property(get_print_omit_errors, set_print_omit_errors)
928 #################################################################
930 def set_print_hres(self, value):
931 self.__print_hres = value
933 def get_print_hres(self):
934 return self.__print_hres
936 print_hres = property(get_print_hres, set_print_hres)
938 #################################################################
940 def set_print_vres(self, value):
941 self.__print_vres = value
943 def get_print_vres(self):
944 return self.__print_vres
946 print_vres = property(get_print_vres, set_print_vres)
948 #################################################################
950 def set_header_margin(self, value):
951 self.__header_margin = value
953 def get_header_margin(self):
954 return self.__header_margin
956 header_margin = property(get_header_margin, set_header_margin)
958 #################################################################
960 def set_footer_margin(self, value):
961 self.__footer_margin = value
963 def get_footer_margin(self):
964 return self.__footer_margin
966 footer_margin = property(get_footer_margin, set_footer_margin)
968 #################################################################
970 def set_copies_num(self, value):
971 self.__copies_num = value
973 def get_copies_num(self):
974 return self.__copies_num
976 copies_num = property(get_copies_num, set_copies_num)
978 ##################################################################
980 def set_wnd_protect(self, value):
981 self.__wnd_protect = int(value)
983 def get_wnd_protect(self):
984 return bool(self.__wnd_protect)
986 wnd_protect = property(get_wnd_protect, set_wnd_protect)
988 #################################################################
990 def set_obj_protect(self, value):
991 self.__obj_protect = int(value)
993 def get_obj_protect(self):
994 return bool(self.__obj_protect)
996 obj_protect = property(get_obj_protect, set_obj_protect)
998 #################################################################
1000 def set_protect(self, value):
1001 self.__protect = int(value)
1003 def get_protect(self):
1004 return bool(self.__protect)
1006 protect = property(get_protect, set_protect)
1008 #################################################################
1010 def set_scen_protect(self, value):
1011 self.__scen_protect = int(value)
1013 def get_scen_protect(self):
1014 return bool(self.__scen_protect)
1016 scen_protect = property(get_scen_protect, set_scen_protect)
1018 #################################################################
1020 def set_password(self, value):
1021 self.__password = value
1023 def get_password(self):
1024 return self.__password
1026 password = property(get_password, set_password)
1028 ##################################################################
1029 ## Methods
1030 ##################################################################
1032 def get_parent(self):
1033 return self.__parent
1035 def write(self, r, c, label="", style=Style.default_style):
1036 """
1037 This method is used to write a cell to a :class:`Worksheet`.
1039 :param r:
1041 The zero-relative number of the row in the worksheet to which
1042 the cell should be written.
1044 :param c:
1046 The zero-relative number of the column in the worksheet to which
1047 the cell should be written.
1049 :param label:
1051 The data value to be written.
1053 An :class:`int`, :class:`long`, or
1054 :class:`~decimal.Decimal` instance is converted to :class:`float`.
1056 A :class:`unicode` instance is written as is. A :class:`bytes`
1057 instance is converted to :class:`unicode` using the
1058 encoding, which defaults to ``ascii``, specified when the
1059 :class:`Workbook` instance was created.
1061 A :class:`~datetime.datetime`, :class:`~datetime.date` or
1062 :class:`~datetime.time` instance is converted into Excel date format
1063 (a float representing the number of days since (typically)
1064 ``1899-12-31T00:00:00``, under the pretence that
1065 1900 was a leap year).
1067 A :class:`bool` instance will show up as ``TRUE`` or ``FALSE`` in
1068 Excel.
1070 ``None`` causes the cell to be blank: no data, only formatting.
1072 An :class:`xlwt.Formula` instance causes an Excel formula to be
1073 written.
1075 :param style:
1077 A style, also known as an XF (extended format), is an
1078 :class:`~xlwt.Style.XFStyle` object, which encapsulates the
1079 formatting applied to the cell and its contents.
1081 :class:`~xlwt.Style.XFStyle` objects are best set up using the
1082 :func:`~xlwt.Style.easyxf` function. They may also be set up by
1083 setting attributes in :class:`Alignment`, :class:`Borders`,
1084 :class:`Pattern`, :class:`Font` and :class:`Protection` objects then
1085 setting those objects and a format string as attributes of an
1086 :class:`~xlwt.Style.XFStyle` object.
1087 """
1088 self.row(r).write(c, label, style)
1090 def write_rich_text(self, r, c, rich_text_list, style=Style.default_style):
1091 self.row(r).set_cell_rich_text(c, rich_text_list, style)
1093 def merge(self, r1, r2, c1, c2, style=Style.default_style):
1094 # Stand-alone merge of previously written cells.
1095 # Problems: (1) style to be used should be existing style of
1096 # the top-left cell, not an arg.
1097 # (2) should ensure that any previous data value in
1098 # non-top-left cells is nobbled.
1099 # Note: if a cell is set by a data record then later
1100 # is referenced by a [MUL]BLANK record, Excel will blank
1101 # out the cell on the screen, but OOo & Gnu will not
1102 # blank it out. Need to do something better than writing
1103 # multiple records. In the meantime, avoid this method and use
1104 # write_merge() instead.
1105 if c2 > c1:
1106 self.row(r1).write_blanks(c1 + 1, c2, style)
1107 for r in range(r1+1, r2+1):
1108 self.row(r).write_blanks(c1, c2, style)
1109 self.__merged_ranges.append((r1, r2, c1, c2))
1111 def write_merge(self, r1, r2, c1, c2, label="", style=Style.default_style):
1112 assert 0 <= c1 <= c2 <= 255
1113 assert 0 <= r1 <= r2 <= 65535
1114 self.write(r1, c1, label, style)
1115 if c2 > c1:
1116 self.row(r1).write_blanks(c1 + 1, c2, style) # skip (r1, c1)
1117 for r in range(r1+1, r2+1):
1118 self.row(r).write_blanks(c1, c2, style)
1119 self.__merged_ranges.append((r1, r2, c1, c2))
1121 def insert_bitmap(self, filename, row, col, x = 0, y = 0, scale_x = 1, scale_y = 1):
1122 bmp = Bitmap.ImDataBmpRecord(filename)
1123 obj = Bitmap.ObjBmpRecord(row, col, self, bmp, x, y, scale_x, scale_y)
1125 self.__bmp_rec += obj.get() + bmp.get()
1127 def insert_bitmap_data(self, data, row, col, x = 0, y = 0, scale_x = 1, scale_y = 1):
1128 bmp = Bitmap.ImRawDataBmpRecord(data)
1129 obj = Bitmap.ObjBmpRecord(row, col, self, bmp, x, y, scale_x, scale_y)
1131 self.__bmp_rec += obj.get() + bmp.get()
1133 def col(self, indx):
1134 if indx not in self.__cols:
1135 self.__cols[indx] = self.Column(indx, self)
1136 return self.__cols[indx]
1138 def row(self, indx):
1139 if indx not in self.__rows:
1140 if indx in self.__flushed_rows:
1141 raise Exception("Attempt to reuse row index %d of sheet %r after flushing" % (indx, self.__name))
1142 self.__rows[indx] = self.Row(indx, self)
1143 if indx > self.last_used_row:
1144 self.last_used_row = indx
1145 if indx < self.first_used_row:
1146 self.first_used_row = indx
1147 return self.__rows[indx]
1149 def row_height(self, row): # in pixels
1150 if row in self.__rows:
1151 return self.__rows[row].get_height_in_pixels()
1152 else:
1153 return 17
1155 def col_width(self, col): # in pixels
1156 if col in self.__cols:
1157 return self.__cols[col].width_in_pixels()
1158 else:
1159 return 64
1162 ##################################################################
1163 ## BIFF records generation
1164 ##################################################################
1166 def __bof_rec(self):
1167 return BIFFRecords.Biff8BOFRecord(BIFFRecords.Biff8BOFRecord.WORKSHEET).get()
1169 def __update_row_visible_levels(self):
1170 if self.__rows:
1171 temp = max(self.__rows[r].level for r in self.__rows) + 1
1172 self.__row_visible_levels = max(temp, self.__row_visible_levels)
1174 def __guts_rec(self):
1175 self.__update_row_visible_levels()
1176 col_visible_levels = 0
1177 if len(self.__cols) != 0:
1178 col_visible_levels = max(self.__cols[c].level for c in self.__cols) + 1
1179 return BIFFRecords.GutsRecord(
1180 self.__row_gut_width, self.__col_gut_height, self.__row_visible_levels, col_visible_levels).get()
1182 def __defaultrowheight_rec(self):
1183 options = 0x0000
1184 options |= (self.row_default_height_mismatch & 1) << 0
1185 options |= (self.row_default_hidden & 1) << 1
1186 options |= (self.row_default_space_above & 1) << 2
1187 options |= (self.row_default_space_below & 1) << 3
1188 defht = self.__row_default_height
1189 return BIFFRecords.DefaultRowHeightRecord(options, defht).get()
1191 def __wsbool_rec(self):
1192 options = 0x00
1193 options |= (self.__show_auto_page_breaks & 0x01) << 0
1194 options |= (self.__dialogue_sheet & 0x01) << 4
1195 options |= (self.__auto_style_outline & 0x01) << 5
1196 options |= (self.__outline_below & 0x01) << 6
1197 options |= (self.__outline_right & 0x01) << 7
1198 options |= (self.__fit_num_pages & 0x01) << 8
1199 options |= (self.__show_row_outline & 0x01) << 10
1200 options |= (self.__show_col_outline & 0x01) << 11
1201 options |= (self.__alt_expr_eval & 0x01) << 14
1202 options |= (self.__alt_formula_entries & 0x01) << 15
1204 return BIFFRecords.WSBoolRecord(options).get()
1206 def __eof_rec(self):
1207 return BIFFRecords.EOFRecord().get()
1209 def __colinfo_rec(self):
1210 result = b''
1211 for col in self.__cols:
1212 result += self.__cols[col].get_biff_record()
1213 return result
1215 def __dimensions_rec(self):
1216 return BIFFRecords.DimensionsRecord(
1217 self.first_used_row, self.last_used_row,
1218 self.first_used_col, self.last_used_col
1219 ).get()
1221 def __window2_rec(self):
1222 # Appends SCL record.
1223 options = 0
1224 options |= (self.__show_formulas & 0x01) << 0
1225 options |= (self.__show_grid & 0x01) << 1
1226 options |= (self.__show_headers & 0x01) << 2
1227 options |= (self.__panes_frozen & 0x01) << 3
1228 options |= (self.show_zero_values & 0x01) << 4
1229 options |= (self.__auto_colour_grid & 0x01) << 5
1230 options |= (self.__cols_right_to_left & 0x01) << 6
1231 options |= (self.__show_outline & 0x01) << 7
1232 options |= (self.__remove_splits & 0x01) << 8
1233 options |= (self.__selected & 0x01) << 9
1234 options |= (self.__sheet_visible & 0x01) << 10
1235 options |= (self.__page_preview & 0x01) << 11
1236 if self.explicit_magn_setting:
1237 # Experimentation: caller can set the scl magn.
1238 # None -> no SCL record written
1239 # Otherwise 10 <= scl_magn <= 400 or scl_magn == 0
1240 # Note: value 0 means use 100 for normal view, 60 for page break preview
1241 # BREAKING NEWS: Excel interprets scl_magn = 0 very literally, your
1242 # sheet appears like a tiny dot on the screen
1243 scl_magn = self.__scl_magn
1244 else:
1245 if self.__page_preview:
1246 scl_magn = self.__preview_magn
1247 magn_default = 60
1248 else:
1249 scl_magn = self.__normal_magn
1250 magn_default = 100
1251 if scl_magn == magn_default or scl_magn == 0:
1252 # Emulate what we think MS does
1253 scl_magn = None # don't write an SCL record
1254 return BIFFRecords.Window2Record(
1255 options, self.__first_visible_row, self.__first_visible_col,
1256 self.__grid_colour,
1257 self.__preview_magn, self.__normal_magn, scl_magn).get()
1259 def __panes_rec(self):
1260 if self.__vert_split_pos is None and self.__horz_split_pos is None:
1261 return b""
1263 if self.__vert_split_pos is None:
1264 self.__vert_split_pos = 0
1265 if self.__horz_split_pos is None:
1266 self.__horz_split_pos = 0
1268 if self.__panes_frozen:
1269 if self.__vert_split_first_visible is None:
1270 self.__vert_split_first_visible = self.__vert_split_pos
1271 if self.__horz_split_first_visible is None:
1272 self.__horz_split_first_visible = self.__horz_split_pos
1274 # when frozen, the active pane has to be specifically set:
1275 if self.__vert_split_pos > 0 and self.__horz_split_pos > 0:
1276 active_pane = 0
1277 elif self.__vert_split_pos > 0 and self.__horz_split_pos == 0:
1278 active_pane = 1
1279 elif self.__vert_split_pos == 0 and self.__horz_split_pos > 0:
1280 active_pane = 2
1281 else:
1282 active_pane = 3
1283 else:
1284 if self.__vert_split_first_visible is None:
1285 self.__vert_split_first_visible = 0
1286 if self.__horz_split_first_visible is None:
1287 self.__horz_split_first_visible = 0
1288 if not self.split_position_units_are_twips:
1289 # inspired by pyXLWriter
1290 if self.__horz_split_pos > 0:
1291 self.__horz_split_pos = 20 * self.__horz_split_pos + 255
1292 if self.__vert_split_pos > 0:
1293 self.__vert_split_pos = 113.879 * self.__vert_split_pos + 390
1295 # when split, the active pain can be set as required:
1296 active_pane = self.active_pane
1298 result = BIFFRecords.PanesRecord(*map(int, (
1299 self.__vert_split_pos,
1300 self.__horz_split_pos,
1301 self.__horz_split_first_visible,
1302 self.__vert_split_first_visible,
1303 active_pane
1304 ))).get()
1306 return result
1308 def __row_blocks_rec(self):
1309 result = []
1310 for row in itervalues(self.__rows):
1311 result.append(row.get_row_biff_data())
1312 result.append(row.get_cells_biff_data())
1313 return b''.join(result)
1315 def __merged_rec(self):
1316 return BIFFRecords.MergedCellsRecord(self.__merged_ranges).get()
1318 def __bitmaps_rec(self):
1319 return self.__bmp_rec
1321 def __calc_settings_rec(self):
1322 result = b''
1323 result += BIFFRecords.CalcModeRecord(self.__calc_mode & 0x01).get()
1324 result += BIFFRecords.CalcCountRecord(self.__calc_count & 0xFFFF).get()
1325 result += BIFFRecords.RefModeRecord(self.__RC_ref_mode & 0x01).get()
1326 result += BIFFRecords.IterationRecord(self.__iterations_on & 0x01).get()
1327 result += BIFFRecords.DeltaRecord(self.__delta).get()
1328 result += BIFFRecords.SaveRecalcRecord(self.__save_recalc & 0x01).get()
1329 return result
1331 def __print_settings_rec(self):
1332 result = b''
1333 result += BIFFRecords.PrintHeadersRecord(self.__print_headers).get()
1334 result += BIFFRecords.PrintGridLinesRecord(self.__print_grid).get()
1335 result += BIFFRecords.GridSetRecord(self.__grid_set).get()
1336 result += BIFFRecords.HorizontalPageBreaksRecord(self.__horz_page_breaks).get()
1337 result += BIFFRecords.VerticalPageBreaksRecord(self.__vert_page_breaks).get()
1338 result += BIFFRecords.HeaderRecord(self.__header_str).get()
1339 result += BIFFRecords.FooterRecord(self.__footer_str).get()
1340 result += BIFFRecords.HCenterRecord(self.__print_centered_horz).get()
1341 result += BIFFRecords.VCenterRecord(self.__print_centered_vert).get()
1342 result += BIFFRecords.LeftMarginRecord(self.__left_margin).get()
1343 result += BIFFRecords.RightMarginRecord(self.__right_margin).get()
1344 result += BIFFRecords.TopMarginRecord(self.__top_margin).get()
1345 result += BIFFRecords.BottomMarginRecord(self.__bottom_margin).get()
1347 setup_page_options = (self.__print_in_rows & 0x01) << 0
1348 setup_page_options |= (self.__portrait & 0x01) << 1
1349 setup_page_options |= (0x00 & 0x01) << 2
1350 setup_page_options |= (self.__print_not_colour & 0x01) << 3
1351 setup_page_options |= (self.__print_draft & 0x01) << 4
1352 setup_page_options |= (self.__print_notes & 0x01) << 5
1353 setup_page_options |= (0x00 & 0x01) << 6
1354 setup_page_options |= (0x01 & 0x01) << 7
1355 setup_page_options |= (self.__print_notes_at_end & 0x01) << 9
1356 setup_page_options |= (self.__print_omit_errors & 0x03) << 10
1358 result += BIFFRecords.SetupPageRecord(self.__paper_size_code,
1359 self.__print_scaling,
1360 self.__start_page_number,
1361 self.__fit_width_to_pages,
1362 self.__fit_height_to_pages,
1363 setup_page_options,
1364 self.__print_hres,
1365 self.__print_vres,
1366 self.__header_margin,
1367 self.__footer_margin,
1368 self.__copies_num).get()
1369 return result
1371 def __protection_rec(self):
1372 result = b''
1373 result += BIFFRecords.ProtectRecord(self.__protect).get()
1374 result += BIFFRecords.ScenProtectRecord(self.__scen_protect).get()
1375 result += BIFFRecords.WindowProtectRecord(self.__wnd_protect).get()
1376 result += BIFFRecords.ObjectProtectRecord(self.__obj_protect).get()
1377 result += BIFFRecords.PasswordRecord(self.__password).get()
1378 return result
1380 def get_biff_data(self):
1381 result = [
1382 self.__bof_rec(),
1383 self.__calc_settings_rec(),
1384 self.__guts_rec(),
1385 self.__defaultrowheight_rec(),
1386 self.__wsbool_rec(),
1387 self.__colinfo_rec(),
1388 self.__dimensions_rec(),
1389 self.__print_settings_rec(),
1390 self.__protection_rec(),
1391 ]
1392 if self.row_tempfile:
1393 self.row_tempfile.flush()
1394 self.row_tempfile.seek(0)
1395 result.append(self.row_tempfile.read())
1396 self.row_tempfile.seek(0, 2) # to EOF
1397 # Above seek() is necessary to avoid a spurious IOError
1398 # with Errno 0 if the caller continues on writing rows
1399 # and flushing row data after the save().
1400 # See https://bugs.python.org/issue3207
1401 result.extend([
1402 self.__row_blocks_rec(),
1403 self.__merged_rec(),
1404 self.__bitmaps_rec(),
1405 self.__window2_rec(),
1406 self.__panes_rec(),
1407 self.__eof_rec(),
1408 ])
1409 return b''.join(result)
1411 def flush_row_data(self):
1412 if self.row_tempfile is None:
1413 self.row_tempfile = tempfile.TemporaryFile()
1414 self.row_tempfile.write(self.__row_blocks_rec())
1415 for rowx in self.__rows:
1416 self.__flushed_rows[rowx] = 1
1417 self.__update_row_visible_levels()
1418 self.__rows = {}