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

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 

34 

35from . import BIFFRecords 

36from . import Bitmap 

37from . import Style 

38from .Row import Row 

39from .Column import Column 

40from .compat import unicode, itervalues 

41import tempfile 

42 

43class Worksheet(object): 

44 """ 

45 This is a class 

46 representing the contents of a sheet in a workbook. 

47 

48 .. warning:: 

49 

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 

55 

56 ################################################################# 

57 ## Constructor 

58 ################################################################# 

59 def __init__(self, sheetname, parent_book, cell_overwrite_ok=False): 

60 self.Row = Row 

61 self.Column = Column 

62 

63 self.__name = sheetname 

64 self.__parent = parent_book 

65 self._cell_overwrite_ok = cell_overwrite_ok 

66 

67 self.__rows = {} 

68 self.__cols = {} 

69 self.__merged_ranges = [] 

70 self.__bmp_rec = b'' 

71 

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 

95 

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 

103 

104 self.visibility = 0 # from/to BOUNDSHEET record. 

105 

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 

110 

111 # This is a caller-settable flag: 

112 

113 self.split_position_units_are_twips = False 

114 

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. 

129 

130 # There are 20 twips to a point. There are 72 points to an inch. 

131 

132 self.__row_gut_width = 0 

133 self.__col_gut_height = 0 

134 

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 

145 

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 

151 

152 self.__col_default_width = 0x0008 

153 

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 

160 

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 

191 

192 self.__wnd_protect = 0 

193 self.__obj_protect = 0 

194 self.__protect = 0 

195 self.__scen_protect = 0 

196 self.__password = '' 

197 

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 

205 

206 ################################################################# 

207 ## Properties, "getters", "setters" 

208 ################################################################# 

209 

210 def set_name(self, value): 

211 self.__name = value 

212 

213 def get_name(self): 

214 return self.__name 

215 

216 name = property(get_name, set_name) 

217 

218 ################################################################# 

219 

220 def get_parent(self): 

221 return self.__parent 

222 

223 parent = property(get_parent) 

224 

225 ################################################################# 

226 

227 def get_rows(self): 

228 return self.__rows 

229 

230 rows = property(get_rows) 

231 

232 ################################################################# 

233 

234 def get_cols(self): 

235 return self.__cols 

236 

237 cols = property(get_cols) 

238 

239 ################################################################# 

240 

241 def get_merged_ranges(self): 

242 return self.__merged_ranges 

243 

244 merged_ranges = property(get_merged_ranges) 

245 

246 ################################################################# 

247 

248 def get_bmp_rec(self): 

249 return self.__bmp_rec 

250 

251 bmp_rec = property(get_bmp_rec) 

252 

253 ################################################################# 

254 

255 def set_show_formulas(self, value): 

256 self.__show_formulas = int(value) 

257 

258 def get_show_formulas(self): 

259 return bool(self.__show_formulas) 

260 

261 show_formulas = property(get_show_formulas, set_show_formulas) 

262 

263 ################################################################# 

264 

265 def set_show_grid(self, value): 

266 self.__show_grid = int(value) 

267 

268 def get_show_grid(self): 

269 return bool(self.__show_grid) 

270 

271 show_grid = property(get_show_grid, set_show_grid) 

272 

273 ################################################################# 

274 

275 def set_show_headers(self, value): 

276 self.__show_headers = int(value) 

277 

278 def get_show_headers(self): 

279 return bool(self.__show_headers) 

280 

281 show_headers = property(get_show_headers, set_show_headers) 

282 

283 ################################################################# 

284 

285 def set_panes_frozen(self, value): 

286 self.__panes_frozen = int(value) 

287 

288 def get_panes_frozen(self): 

289 return bool(self.__panes_frozen) 

290 

291 panes_frozen = property(get_panes_frozen, set_panes_frozen) 

292 

293 ################################################################# 

294 

295 ### def set_show_empty_as_zero(self, value): 

296 ### self.__show_empty_as_zero = int(value) 

297 

298 ### def get_show_empty_as_zero(self): 

299 ### return bool(self.__show_empty_as_zero) 

300 

301 ### show_empty_as_zero = property(get_show_empty_as_zero, set_show_empty_as_zero) 

302 

303 ################################################################# 

304 

305 def set_auto_colour_grid(self, value): 

306 self.__auto_colour_grid = int(value) 

307 

308 def get_auto_colour_grid(self): 

309 return bool(self.__auto_colour_grid) 

310 

311 auto_colour_grid = property(get_auto_colour_grid, set_auto_colour_grid) 

312 

313 ################################################################# 

314 

315 def set_cols_right_to_left(self, value): 

316 self.__cols_right_to_left = int(value) 

317 

318 def get_cols_right_to_left(self): 

319 return bool(self.__cols_right_to_left) 

320 

321 cols_right_to_left = property(get_cols_right_to_left, set_cols_right_to_left) 

322 

323 ################################################################# 

324 

325 def set_show_outline(self, value): 

326 self.__show_outline = int(value) 

327 

328 def get_show_outline(self): 

329 return bool(self.__show_outline) 

330 

331 show_outline = property(get_show_outline, set_show_outline) 

332 

333 ################################################################# 

334 

335 def set_remove_splits(self, value): 

336 self.__remove_splits = int(value) 

337 

338 def get_remove_splits(self): 

339 return bool(self.__remove_splits) 

340 

341 remove_splits = property(get_remove_splits, set_remove_splits) 

342 

343 ################################################################# 

344 

345 def set_selected(self, value): 

346 self.__selected = int(value) 

347 

348 def get_selected(self): 

349 return bool(self.__selected) 

350 

351 selected = property(get_selected, set_selected) 

352 

353 ################################################################# 

354 

355 def set_sheet_visible(self, value): 

356 self.__sheet_visible = int(value) 

357 

358 def get_sheet_visible(self): 

359 return bool(self.__sheet_visible) 

360 

361 sheet_visible = property(get_sheet_visible, set_sheet_visible) 

362 

363 ################################################################# 

364 

365 def set_page_preview(self, value): 

366 self.__page_preview = int(value) 

367 

368 def get_page_preview(self): 

369 return bool(self.__page_preview) 

370 

371 page_preview = property(get_page_preview, set_page_preview) 

372 

373 ################################################################# 

374 

375 def set_first_visible_row(self, value): 

376 self.__first_visible_row = value 

377 

378 def get_first_visible_row(self): 

379 return self.__first_visible_row 

380 

381 first_visible_row = property(get_first_visible_row, set_first_visible_row) 

382 

383 ################################################################# 

384 

385 def set_first_visible_col(self, value): 

386 self.__first_visible_col = value 

387 

388 def get_first_visible_col(self): 

389 return self.__first_visible_col 

390 

391 first_visible_col = property(get_first_visible_col, set_first_visible_col) 

392 

393 ################################################################# 

394 

395 def set_grid_colour(self, value): 

396 self.__grid_colour = value 

397 

398 def get_grid_colour(self): 

399 return self.__grid_colour 

400 

401 grid_colour = property(get_grid_colour, set_grid_colour) 

402 

403 ################################################################# 

404 

405 def set_preview_magn(self, value): 

406 self.__preview_magn = value 

407 

408 def get_preview_magn(self): 

409 return self.__preview_magn 

410 

411 preview_magn = property(get_preview_magn, set_preview_magn) 

412 

413 ################################################################# 

414 

415 def set_normal_magn(self, value): 

416 self.__normal_magn = value 

417 

418 def get_normal_magn(self): 

419 return self.__normal_magn 

420 

421 normal_magn = property(get_normal_magn, set_normal_magn) 

422 

423 ################################################################# 

424 

425 def set_scl_magn(self, value): 

426 self.__scl_magn = value 

427 

428 def get_scl_magn(self): 

429 return self.__scl_magn 

430 

431 scl_magn = property(get_scl_magn, set_scl_magn) 

432 

433 

434 ################################################################# 

435 

436 def set_vert_split_pos(self, value): 

437 self.__vert_split_pos = abs(value) 

438 

439 def get_vert_split_pos(self): 

440 return self.__vert_split_pos 

441 

442 vert_split_pos = property(get_vert_split_pos, set_vert_split_pos) 

443 

444 ################################################################# 

445 

446 def set_horz_split_pos(self, value): 

447 self.__horz_split_pos = abs(value) 

448 

449 def get_horz_split_pos(self): 

450 return self.__horz_split_pos 

451 

452 horz_split_pos = property(get_horz_split_pos, set_horz_split_pos) 

453 

454 ################################################################# 

455 

456 def set_vert_split_first_visible(self, value): 

457 self.__vert_split_first_visible = abs(value) 

458 

459 def get_vert_split_first_visible(self): 

460 return self.__vert_split_first_visible 

461 

462 vert_split_first_visible = property(get_vert_split_first_visible, set_vert_split_first_visible) 

463 

464 ################################################################# 

465 

466 def set_horz_split_first_visible(self, value): 

467 self.__horz_split_first_visible = abs(value) 

468 

469 def get_horz_split_first_visible(self): 

470 return self.__horz_split_first_visible 

471 

472 horz_split_first_visible = property(get_horz_split_first_visible, set_horz_split_first_visible) 

473 

474 ################################################################# 

475 

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 ################################################################# 

495 

496 def set_show_auto_page_breaks(self, value): 

497 self.__show_auto_page_breaks = int(value) 

498 

499 def get_show_auto_page_breaks(self): 

500 return bool(self.__show_auto_page_breaks) 

501 

502 show_auto_page_breaks = property(get_show_auto_page_breaks, set_show_auto_page_breaks) 

503 

504 ################################################################# 

505 

506 def set_dialogue_sheet(self, value): 

507 self.__dialogue_sheet = int(value) 

508 

509 def get_dialogue_sheet(self): 

510 return bool(self.__dialogue_sheet) 

511 

512 dialogue_sheet = property(get_dialogue_sheet, set_dialogue_sheet) 

513 

514 ################################################################# 

515 

516 def set_auto_style_outline(self, value): 

517 self.__auto_style_outline = int(value) 

518 

519 def get_auto_style_outline(self): 

520 return bool(self.__auto_style_outline) 

521 

522 auto_style_outline = property(get_auto_style_outline, set_auto_style_outline) 

523 

524 ################################################################# 

525 

526 def set_outline_below(self, value): 

527 self.__outline_below = int(value) 

528 

529 def get_outline_below(self): 

530 return bool(self.__outline_below) 

531 

532 outline_below = property(get_outline_below, set_outline_below) 

533 

534 ################################################################# 

535 

536 def set_outline_right(self, value): 

537 self.__outline_right = int(value) 

538 

539 def get_outline_right(self): 

540 return bool(self.__outline_right) 

541 

542 outline_right = property(get_outline_right, set_outline_right) 

543 

544 ################################################################# 

545 

546 def set_fit_num_pages(self, value): 

547 self.__fit_num_pages = value 

548 

549 def get_fit_num_pages(self): 

550 return self.__fit_num_pages 

551 

552 fit_num_pages = property(get_fit_num_pages, set_fit_num_pages) 

553 

554 ################################################################# 

555 

556 def set_show_row_outline(self, value): 

557 self.__show_row_outline = int(value) 

558 

559 def get_show_row_outline(self): 

560 return bool(self.__show_row_outline) 

561 

562 show_row_outline = property(get_show_row_outline, set_show_row_outline) 

563 

564 ################################################################# 

565 

566 def set_show_col_outline(self, value): 

567 self.__show_col_outline = int(value) 

568 

569 def get_show_col_outline(self): 

570 return bool(self.__show_col_outline) 

571 

572 show_col_outline = property(get_show_col_outline, set_show_col_outline) 

573 

574 ################################################################# 

575 

576 def set_alt_expr_eval(self, value): 

577 self.__alt_expr_eval = int(value) 

578 

579 def get_alt_expr_eval(self): 

580 return bool(self.__alt_expr_eval) 

581 

582 alt_expr_eval = property(get_alt_expr_eval, set_alt_expr_eval) 

583 

584 ################################################################# 

585 

586 def set_alt_formula_entries(self, value): 

587 self.__alt_formula_entries = int(value) 

588 

589 def get_alt_formula_entries(self): 

590 return bool(self.__alt_formula_entries) 

591 

592 alt_formula_entries = property(get_alt_formula_entries, set_alt_formula_entries) 

593 

594 ################################################################# 

595 

596 def set_row_default_height(self, value): 

597 self.__row_default_height = value 

598 

599 def get_row_default_height(self): 

600 return self.__row_default_height 

601 

602 row_default_height = property(get_row_default_height, set_row_default_height) 

603 

604 ################################################################# 

605 

606 def set_col_default_width(self, value): 

607 self.__col_default_width = value 

608 

609 def get_col_default_width(self): 

610 return self.__col_default_width 

611 

612 col_default_width = property(get_col_default_width, set_col_default_width) 

613 

614 ################################################################# 

615 

616 def set_calc_mode(self, value): 

617 self.__calc_mode = value & 0x03 

618 

619 def get_calc_mode(self): 

620 return self.__calc_mode 

621 

622 calc_mode = property(get_calc_mode, set_calc_mode) 

623 

624 ################################################################# 

625 

626 def set_calc_count(self, value): 

627 self.__calc_count = value 

628 

629 def get_calc_count(self): 

630 return self.__calc_count 

631 

632 calc_count = property(get_calc_count, set_calc_count) 

633 

634 ################################################################# 

635 

636 def set_RC_ref_mode(self, value): 

637 self.__RC_ref_mode = int(value) 

638 

639 def get_RC_ref_mode(self): 

640 return bool(self.__RC_ref_mode) 

641 

642 RC_ref_mode = property(get_RC_ref_mode, set_RC_ref_mode) 

643 

644 ################################################################# 

645 

646 def set_iterations_on(self, value): 

647 self.__iterations_on = int(value) 

648 

649 def get_iterations_on(self): 

650 return bool(self.__iterations_on) 

651 

652 iterations_on = property(get_iterations_on, set_iterations_on) 

653 

654 ################################################################# 

655 

656 def set_delta(self, value): 

657 self.__delta = value 

658 

659 def get_delta(self): 

660 return self.__delta 

661 

662 delta = property(get_delta, set_delta) 

663 

664 ################################################################# 

665 

666 def set_save_recalc(self, value): 

667 self.__save_recalc = int(value) 

668 

669 def get_save_recalc(self): 

670 return bool(self.__save_recalc) 

671 

672 save_recalc = property(get_save_recalc, set_save_recalc) 

673 

674 ################################################################# 

675 

676 def set_print_headers(self, value): 

677 self.__print_headers = int(value) 

678 

679 def get_print_headers(self): 

680 return bool(self.__print_headers) 

681 

682 print_headers = property(get_print_headers, set_print_headers) 

683 

684 ################################################################# 

685 

686 def set_print_grid(self, value): 

687 self.__print_grid = int(value) 

688 

689 def get_print_grid(self): 

690 return bool(self.__print_grid) 

691 

692 print_grid = property(get_print_grid, set_print_grid) 

693 

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 ################################################################# 

705 

706 def set_vert_page_breaks(self, value): 

707 self.__vert_page_breaks = value 

708 

709 def get_vert_page_breaks(self): 

710 return self.__vert_page_breaks 

711 

712 vert_page_breaks = property(get_vert_page_breaks, set_vert_page_breaks) 

713 

714 ################################################################# 

715 

716 def set_horz_page_breaks(self, value): 

717 self.__horz_page_breaks = value 

718 

719 def get_horz_page_breaks(self): 

720 return self.__horz_page_breaks 

721 

722 horz_page_breaks = property(get_horz_page_breaks, set_horz_page_breaks) 

723 

724 ################################################################# 

725 

726 def set_header_str(self, value): 

727 if isinstance(value, str): 

728 value = unicode(value, self.__parent.encoding) 

729 self.__header_str = value 

730 

731 def get_header_str(self): 

732 return self.__header_str 

733 

734 header_str = property(get_header_str, set_header_str) 

735 

736 ################################################################# 

737 

738 def set_footer_str(self, value): 

739 if isinstance(value, str): 

740 value = unicode(value, self.__parent.encoding) 

741 self.__footer_str = value 

742 

743 def get_footer_str(self): 

744 return self.__footer_str 

745 

746 footer_str = property(get_footer_str, set_footer_str) 

747 

748 ################################################################# 

749 

750 def set_print_centered_vert(self, value): 

751 self.__print_centered_vert = int(value) 

752 

753 def get_print_centered_vert(self): 

754 return bool(self.__print_centered_vert) 

755 

756 print_centered_vert = property(get_print_centered_vert, set_print_centered_vert) 

757 

758 ################################################################# 

759 

760 def set_print_centered_horz(self, value): 

761 self.__print_centered_horz = int(value) 

762 

763 def get_print_centered_horz(self): 

764 return bool(self.__print_centered_horz) 

765 

766 print_centered_horz = property(get_print_centered_horz, set_print_centered_horz) 

767 

768 ################################################################# 

769 

770 def set_left_margin(self, value): 

771 self.__left_margin = value 

772 

773 def get_left_margin(self): 

774 return self.__left_margin 

775 

776 left_margin = property(get_left_margin, set_left_margin) 

777 

778 ################################################################# 

779 

780 def set_right_margin(self, value): 

781 self.__right_margin = value 

782 

783 def get_right_margin(self): 

784 return self.__right_margin 

785 

786 right_margin = property(get_right_margin, set_right_margin) 

787 

788 ################################################################# 

789 

790 def set_top_margin(self, value): 

791 self.__top_margin = value 

792 

793 def get_top_margin(self): 

794 return self.__top_margin 

795 

796 top_margin = property(get_top_margin, set_top_margin) 

797 

798 ################################################################# 

799 

800 def set_bottom_margin(self, value): 

801 self.__bottom_margin = value 

802 

803 def get_bottom_margin(self): 

804 return self.__bottom_margin 

805 

806 bottom_margin = property(get_bottom_margin, set_bottom_margin) 

807 

808 ################################################################# 

809 

810 def set_paper_size_code(self, value): 

811 self.__paper_size_code = value 

812 

813 def get_paper_size_code(self): 

814 return self.__paper_size_code 

815 

816 paper_size_code = property(get_paper_size_code, set_paper_size_code) 

817 

818 ################################################################# 

819 

820 def set_print_scaling(self, value): 

821 self.__print_scaling = value 

822 

823 def get_print_scaling(self): 

824 return self.__print_scaling 

825 

826 print_scaling = property(get_print_scaling, set_print_scaling) 

827 

828 ################################################################# 

829 

830 def set_start_page_number(self, value): 

831 self.__start_page_number = value 

832 

833 def get_start_page_number(self): 

834 return self.__start_page_number 

835 

836 start_page_number = property(get_start_page_number, set_start_page_number) 

837 

838 ################################################################# 

839 

840 def set_fit_width_to_pages(self, value): 

841 self.__fit_width_to_pages = value 

842 

843 def get_fit_width_to_pages(self): 

844 return self.__fit_width_to_pages 

845 

846 fit_width_to_pages = property(get_fit_width_to_pages, set_fit_width_to_pages) 

847 

848 ################################################################# 

849 

850 def set_fit_height_to_pages(self, value): 

851 self.__fit_height_to_pages = value 

852 

853 def get_fit_height_to_pages(self): 

854 return self.__fit_height_to_pages 

855 

856 fit_height_to_pages = property(get_fit_height_to_pages, set_fit_height_to_pages) 

857 

858 ################################################################# 

859 

860 def set_print_in_rows(self, value): 

861 self.__print_in_rows = int(value) 

862 

863 def get_print_in_rows(self): 

864 return bool(self.__print_in_rows) 

865 

866 print_in_rows = property(get_print_in_rows, set_print_in_rows) 

867 

868 ################################################################# 

869 

870 def set_portrait(self, value): 

871 self.__portrait = int(value) 

872 

873 def get_portrait(self): 

874 return bool(self.__portrait) 

875 

876 portrait = property(get_portrait, set_portrait) 

877 

878 ################################################################# 

879 

880 def set_print_colour(self, value): 

881 self.__print_not_colour = int(not value) 

882 

883 def get_print_colour(self): 

884 return not bool(self.__print_not_colour) 

885 

886 print_colour = property(get_print_colour, set_print_colour) 

887 

888 ################################################################# 

889 

890 def set_print_draft(self, value): 

891 self.__print_draft = int(value) 

892 

893 def get_print_draft(self): 

894 return bool(self.__print_draft) 

895 

896 print_draft = property(get_print_draft, set_print_draft) 

897 

898 ################################################################# 

899 

900 def set_print_notes(self, value): 

901 self.__print_notes = int(value) 

902 

903 def get_print_notes(self): 

904 return bool(self.__print_notes) 

905 

906 print_notes = property(get_print_notes, set_print_notes) 

907 

908 ################################################################# 

909 

910 def set_print_notes_at_end(self, value): 

911 self.__print_notes_at_end = int(value) 

912 

913 def get_print_notes_at_end(self): 

914 return bool(self.__print_notes_at_end) 

915 

916 print_notes_at_end = property(get_print_notes_at_end, set_print_notes_at_end) 

917 

918 ################################################################# 

919 

920 def set_print_omit_errors(self, value): 

921 self.__print_omit_errors = int(value) 

922 

923 def get_print_omit_errors(self): 

924 return bool(self.__print_omit_errors) 

925 

926 print_omit_errors = property(get_print_omit_errors, set_print_omit_errors) 

927 

928 ################################################################# 

929 

930 def set_print_hres(self, value): 

931 self.__print_hres = value 

932 

933 def get_print_hres(self): 

934 return self.__print_hres 

935 

936 print_hres = property(get_print_hres, set_print_hres) 

937 

938 ################################################################# 

939 

940 def set_print_vres(self, value): 

941 self.__print_vres = value 

942 

943 def get_print_vres(self): 

944 return self.__print_vres 

945 

946 print_vres = property(get_print_vres, set_print_vres) 

947 

948 ################################################################# 

949 

950 def set_header_margin(self, value): 

951 self.__header_margin = value 

952 

953 def get_header_margin(self): 

954 return self.__header_margin 

955 

956 header_margin = property(get_header_margin, set_header_margin) 

957 

958 ################################################################# 

959 

960 def set_footer_margin(self, value): 

961 self.__footer_margin = value 

962 

963 def get_footer_margin(self): 

964 return self.__footer_margin 

965 

966 footer_margin = property(get_footer_margin, set_footer_margin) 

967 

968 ################################################################# 

969 

970 def set_copies_num(self, value): 

971 self.__copies_num = value 

972 

973 def get_copies_num(self): 

974 return self.__copies_num 

975 

976 copies_num = property(get_copies_num, set_copies_num) 

977 

978 ################################################################## 

979 

980 def set_wnd_protect(self, value): 

981 self.__wnd_protect = int(value) 

982 

983 def get_wnd_protect(self): 

984 return bool(self.__wnd_protect) 

985 

986 wnd_protect = property(get_wnd_protect, set_wnd_protect) 

987 

988 ################################################################# 

989 

990 def set_obj_protect(self, value): 

991 self.__obj_protect = int(value) 

992 

993 def get_obj_protect(self): 

994 return bool(self.__obj_protect) 

995 

996 obj_protect = property(get_obj_protect, set_obj_protect) 

997 

998 ################################################################# 

999 

1000 def set_protect(self, value): 

1001 self.__protect = int(value) 

1002 

1003 def get_protect(self): 

1004 return bool(self.__protect) 

1005 

1006 protect = property(get_protect, set_protect) 

1007 

1008 ################################################################# 

1009 

1010 def set_scen_protect(self, value): 

1011 self.__scen_protect = int(value) 

1012 

1013 def get_scen_protect(self): 

1014 return bool(self.__scen_protect) 

1015 

1016 scen_protect = property(get_scen_protect, set_scen_protect) 

1017 

1018 ################################################################# 

1019 

1020 def set_password(self, value): 

1021 self.__password = value 

1022 

1023 def get_password(self): 

1024 return self.__password 

1025 

1026 password = property(get_password, set_password) 

1027 

1028 ################################################################## 

1029 ## Methods 

1030 ################################################################## 

1031 

1032 def get_parent(self): 

1033 return self.__parent 

1034 

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`. 

1038 

1039 :param r: 

1040 

1041 The zero-relative number of the row in the worksheet to which 

1042 the cell should be written. 

1043 

1044 :param c: 

1045 

1046 The zero-relative number of the column in the worksheet to which 

1047 the cell should be written. 

1048 

1049 :param label: 

1050 

1051 The data value to be written. 

1052 

1053 An :class:`int`, :class:`long`, or 

1054 :class:`~decimal.Decimal` instance is converted to :class:`float`. 

1055 

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. 

1060 

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). 

1066 

1067 A :class:`bool` instance will show up as ``TRUE`` or ``FALSE`` in 

1068 Excel. 

1069 

1070 ``None`` causes the cell to be blank: no data, only formatting. 

1071 

1072 An :class:`xlwt.Formula` instance causes an Excel formula to be 

1073 written. 

1074 

1075 :param style: 

1076 

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. 

1080 

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) 

1089 

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) 

1092 

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)) 

1110 

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)) 

1120 

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) 

1124 

1125 self.__bmp_rec += obj.get() + bmp.get() 

1126 

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) 

1130 

1131 self.__bmp_rec += obj.get() + bmp.get() 

1132 

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] 

1137 

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] 

1148 

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 

1154 

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 

1160 

1161 

1162 ################################################################## 

1163 ## BIFF records generation 

1164 ################################################################## 

1165 

1166 def __bof_rec(self): 

1167 return BIFFRecords.Biff8BOFRecord(BIFFRecords.Biff8BOFRecord.WORKSHEET).get() 

1168 

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) 

1173 

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() 

1181 

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() 

1190 

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 

1203 

1204 return BIFFRecords.WSBoolRecord(options).get() 

1205 

1206 def __eof_rec(self): 

1207 return BIFFRecords.EOFRecord().get() 

1208 

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 

1214 

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() 

1220 

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() 

1258 

1259 def __panes_rec(self): 

1260 if self.__vert_split_pos is None and self.__horz_split_pos is None: 

1261 return b"" 

1262 

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 

1267 

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 

1273 

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 

1294 

1295 # when split, the active pain can be set as required: 

1296 active_pane = self.active_pane 

1297 

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() 

1305 

1306 return result 

1307 

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) 

1314 

1315 def __merged_rec(self): 

1316 return BIFFRecords.MergedCellsRecord(self.__merged_ranges).get() 

1317 

1318 def __bitmaps_rec(self): 

1319 return self.__bmp_rec 

1320 

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 

1330 

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() 

1346 

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 

1357 

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 

1370 

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 

1379 

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) 

1410 

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 = {} 

1419 

1420