copier.py 2.3 KB

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