web-dev-qa-db-ja.com

セルスタイルopenpyxlをコピー

シートをコピーしようとしていますdefault_sheet、新しいシートにnew_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>

現時点ではopenpyxl 1.8.2を使用していますが、1.8.5に切り替えることを考えています。

1つの解決策はコピーです。

from copy import copy, deepcopy

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

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)

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
22
Charlie Clark

StyleableObject実装はスタイルを単一のリスト_styleに格納し、セルのスタイルプロパティは実際にはこの配列のゲッターおよびセッターです。各スタイルのコピーを個別に実装できますが、特に私がそうであったようにビジーな内部ループでそれを実行している場合は、これは遅くなります。

プライベートクラスの属性を掘り下げたい場合は、スタイルを複製するはるかに高速な方法があります。

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

FWIWこれは、最適化されたWorksheetCopyクラスが_copy_cellsメソッドでそれを行う方法です。

8
ldrg

これはほとんどの人にとって便利な方法かもしれません。

    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')
3
Avik Samaddar