复制单元格样式openpyxl

Fot*_*isK 16 python openpyxl

我正在尝试将工作表复制default_sheetnew_sheet同一工作簿中的新工作表中.

我设法创建了一个新工作表并从默认工作表复制值.如何将每个单元格的样式复制到new_sheet单元格中?

new_sheet = workbook.create_sheet()
new_sheet.title = sheetName
default_sheet = workbook.get_sheet_by_name('default')
new_sheet = workbook.get_sheet_by_name(sheetName)
for row in default_sheet.rows:
    col_idx = float(default_sheet.get_highest_column())
starting_col = chr(65 + int(col_idx))
for row in default_sheet.rows:
    for cell in row:
        new_sheet[cell.get_coordinate()] = cell.value
        <copy also style of each cell>
Run Code Online (Sandbox Code Playgroud)

我目前正在使用openpyxl 1.8.2,但我想切换到1.8.5.

一个解决方案是复制:

from copy import copy, deepcopy

new_sheet._styles[cell.get_coordinate()] = copy(
        default_sheet._styles[cell.get_coordinate()])
Run Code Online (Sandbox Code Playgroud)

Cha*_*ark 21

从openpyxl 2.5.4开始,python 3.4 :(对下面的旧版本进行细微更改)

new_sheet = workbook.create_sheet(sheetName)
default_sheet = workbook['default']

from copy import copy

for row in default_sheet.rows:
    for cell in row:
        new_cell = new_sheet.cell(row=cell.row, column=cell.col_idx,
                value= cell.value)
        if cell.has_style:
            new_cell.font = copy(cell.font)
            new_cell.border = copy(cell.border)
            new_cell.fill = copy(cell.fill)
            new_cell.number_format = copy(cell.number_format)
            new_cell.protection = copy(cell.protection)
            new_cell.alignment = copy(cell.alignment)
Run Code Online (Sandbox Code Playgroud)

对于openpyxl 2.1

new_sheet = workbook.create_sheet(sheetName)
default_sheet = workbook['default']

for row in default_sheet.rows:
    for cell in row:
        new_cell = new_sheet.cell(row=cell.row_idx,
                   col=cell.col_idx, value= cell.value)
        if cell.has_style:
            new_cell.font = cell.font
            new_cell.border = cell.border
            new_cell.fill = cell.fill
            new_cell.number_format = cell.number_format
            new_cell.protection = cell.protection
            new_cell.alignment = cell.alignment
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用openpyxl 2.4.1,`cell.font`或`cell.border`是`StyleProxy`的一个实例,如果使用该类型保存工作簿,你将得到一个例外.你必须将它复制到新的单元格,如下所示:`new_cell.font = copy(cell.font)` (5认同)
  • 值得注意的是,工作簿已经有一段时间有“copy_worksheet”方法了,并且这种复制样式适合您。 (2认同)

ldr*_*drg 8

StyleableObject实现将样式存储在一个列表中_style,并且单元格上的样式属性实际上是此数组的获取器和设置器。您可以分别为每种样式实现副本,但这会很慢,特别是如果您像以前那样在繁忙的内部循环中进行复制。

如果您愿意研究私有类属性,则有一种更快的克隆样式的方法:

if cell.has_style:
    new_cell._style = copy(cell._style)
Run Code Online (Sandbox Code Playgroud)

FWIW,这是优化的WorksheetCopy类在_copy_cells方法中的实现方式。

  • 不错的代码。正是我目前所需要的。但事实上,在某些情况下“NamedStyles”可能是更好的方法 (2认同)