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