简体   繁体   English

复制单元格样式openpyxl

[英]copy cell style openpyxl

I am trying to copy a sheet, default_sheet , into a new sheet new_sheet in the same workbook. 我试图将工作表default_sheet复制到同一工作簿中的新工作表new_sheet

I did managed to create a new sheet and to copy the values from default sheet. 我设法创建了一个新工作表并从默认工作表复制值。 How can I also copy the style of each cell into the new_sheet cells? 如何将每个单元格的样式复制到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>

I am at the moment using openpyxl 1.8.2, but i have in mind to switch to 1.8.5. 我目前正在使用openpyxl 1.8.2,但我想切换到1.8.5。

One solution is with copy: 一个解决方案是复制:

from copy import copy, deepcopy

new_sheet._styles[cell.get_coordinate()] = copy(
        default_sheet._styles[cell.get_coordinate()])

As of openpyxl 2.5.4, python 3.4: (subtle changes over the older version below) 从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)

For openpyxl 2.1 对于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

The StyleableObject implementation stores styles in a single list, _style , and style properties on a cell are actually getters and setters to this array. StyleableObject实现将样式存储在单个列表中,单元格上的_style和样式属性实际上是此数组的getter和setter。 You can implement the copy for each style individually but this will be slow, especially if you're doing it in a busy inner loop like I was. 你可以单独为每个样式实现副本,但这会很慢,特别是如果你像我一样在繁忙的内循环中进行。

If you're willing to dig into private class attributes there is a much faster way to clone styles: 如果您愿意深入了解私有类属性,则可以更快速地克隆样式:

if cell.has_style:
    new_cell._style = copy(cell._style)

FWIW this is how the optimized WorksheetCopy class does it in the _copy_cells method. FWIW这是优化的WorksheetCopy类在_copy_cells方法中_copy_cells方式。

May be this is the convenient way for most. 可能这是大多数人的便捷方式。

    from openpyxl import load_workbook
    from openpyxl import Workbook
    read_from = load_workbook('path/to/file.xlsx')
    read_sheet = read_from.active
    write_to = Workbook()
    write_sheet = write_to.active
    write_sheet['A1'] = read_sheet['A1'].value
    write_sheet['A1'].style = read_sheet['A1'].style
    write_to.save('save/to/file.xlsx')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM