copier.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from __future__ import absolute_import
  2. # Copyright (c) 2010-2019 openpyxl
  3. #standard lib imports
  4. from copy import copy
  5. from .worksheet import Worksheet
  6. class WorksheetCopy(object):
  7. """
  8. Copy the values, styles, dimensions, merged cells, margins, and
  9. print/page setup from one worksheet to another within the same
  10. workbook.
  11. """
  12. def __init__(self, source_worksheet, target_worksheet):
  13. self.source = source_worksheet
  14. self.target = target_worksheet
  15. self._verify_resources()
  16. def _verify_resources(self):
  17. if (not isinstance(self.source, Worksheet)
  18. and not isinstance(self.target, Worksheet)):
  19. raise TypeError("Can only copy worksheets")
  20. if self.source is self.target:
  21. raise ValueError("Cannot copy a worksheet to itself")
  22. if self.source.parent != self.target.parent:
  23. raise ValueError('Cannot copy between worksheets from different workbooks')
  24. def copy_worksheet(self):
  25. self._copy_cells()
  26. self._copy_dimensions()
  27. self.target.sheet_format = copy(self.source.sheet_format)
  28. self.target.sheet_properties = copy(self.source.sheet_properties)
  29. self.target.merged_cells = copy(self.source.merged_cells)
  30. self.target.page_margins = copy(self.source.page_margins)
  31. self.target.page_setup = copy(self.source.page_setup)
  32. self.target.print_options = copy(self.source.print_options)
  33. def _copy_cells(self):
  34. for (row, col), source_cell in self.source._cells.items():
  35. target_cell = self.target.cell(column=col, row=row)
  36. target_cell._value = source_cell._value
  37. target_cell.data_type = source_cell.data_type
  38. if source_cell.has_style:
  39. target_cell._style = copy(source_cell._style)
  40. if source_cell.hyperlink:
  41. target_cell._hyperlink = copy(source_cell.hyperlink)
  42. if source_cell.comment:
  43. target_cell.comment = copy(source_cell.comment)
  44. def _copy_dimensions(self):
  45. for attr in ('row_dimensions', 'column_dimensions'):
  46. src = getattr(self.source, attr)
  47. target = getattr(self.target, attr)
  48. for key, dim in src.items():
  49. target[key] = copy(dim)
  50. target[key].worksheet = self.target