在 openpyxl 中,如何移动或复制带有格式、合并单元格、公式和超链接的单元格范围

2024-01-09

我正在尝试使用 Python 2.7 + openpyxl 在工作表内移动单元格范围。这似乎是一项简单而基本的任务,结果却几乎是不可能的。我希望它在 Excel 中的外观如下:

为了使任务更容易,我们假设我只需要将范围从给定单元格移动到数据末尾(到最后一行和最后一列)。我的第一个想法很简单:

for i, column in enumerate(columns):
    if i >= starting_col:
        for j, cell in enumerate(column):
            if j >= starting_row:
                copy_cell(ws, j+1, i+1, j+1, i+movement)

但是,嘿,如何高效、充分地实现copy_cell? 通过反复试验,我成功得出了 4 件需要复制的内容:

  1. Value
  2. Style
  3. 超链接
  4. 数字格式

它没有像我预期的那样工作 - 大多数单元格都被正确复制,但超链接似乎不起作用,复制 .style 属性也不起作用(因此我尝试访问有效的 _style ),并且出现了我最糟糕的问题 -合并单元格范围。怎么对付他们呢?我的copy_cell()目前看起来像这样:

def copy_cell(ws, from_row, from_col, to_row, to_col):
    # first value
    ws.cell(row=to_row, column=to_col).value = ws.cell(row=from_row, column=from_col).value
    # second formatting
    from_style = ws.cell(row=from_row, column=from_col)._style
    ws.cell(row=to_row, column=to_col)._style = from_style
    ws.cell(row=to_row, column=to_col).hyperlink = ws.cell(row=from_row, column=from_col).hyperlink
    ws.cell(row=to_row, column=to_col).number_format = ws.cell(row=from_row, column=from_col).number_format

难道没有更好的通用方法来复制整个单元格范围吗?或者至少具有其所有属性的整个细胞?如果没有,也许有一种有效的方法来移动或复制合并的单元格范围?


以下方法对我有用,您也可以指定不同的工作表:

from copy import copy

def copy_cell(source_cell, coord, tgt):
    tgt[coord].value = source_cell.value
    if source_cell.has_style:
        tgt[coord]._style = copy(source_cell._style)
    return tgt[coord]

您可以通过以下方式调用它:

copy_cell(worksheet['E6'], 'D11', worksheet)

或者,如果您需要移动单元格,您可以这样做:

def move_cell(source_cell, coord, tgt):
    tgt[coord].value = source_cell.value
    if source_cell.has_style:
        tgt[coord]._style = copy(source_cell._style)

    del source_cell.parent._cells[(source_cell.row, source_cell.col_idx)]

    return tgt[coord]

然而,请注意合并单元格必须单独完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 openpyxl 中,如何移动或复制带有格式、合并单元格、公式和超链接的单元格范围 的相关文章

随机推荐