Python и openpyxl - как мне скопировать стиль, когда я «добавляю» строку в новый файл? - PullRequest
1 голос
/ 20 июня 2020

под моим кодом:

import openpyxl

# file 1:
path = "C:\\Users\\Admin\\Desktop\\TEST.xlsx"
wb_1 = openpyxl.load_workbook(path, read_only=True)
ws_1 = wb_1[wb_1.sheetnames[0]]

# file 2 (it's a new file):
wb_2 = openpyxl.Workbook()
ws_2 = wb_2.active
ws_2.title = "SHEET"

# copy the rows placed in file 1 into the file 2:
def GetList(row):
    list_for_row_values = []
    for cell in row:
        list_for_row_values.append(cell.value)
    return list_for_row_values

for row in ws_1.rows:
    list_for_row_values = GetList(row)
    ws_2.append(list_for_row_values)

wb_2.save("C:\\Users\\Admin\\Desktop\\result.xlsx")

в этом примере сценарий копирует строки, помещенные в первый лист файла TEST.xlsx, в новый с именем «result.xlsx». сценарий работает, но копирует только содержимое ячеек, а не их стили. это означает, что в новых файлах будет отключен перенос текста, оригинальный шрифт и т. д. c ... как я могу скопировать стиль? Я пробовал много инструкций, но они не работали. Я не эксперт в openpyxl. Можете ли вы помочь мне изменить этот простой код для достижения моей цели?

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Почему вы должны использовать функцию append?

В вашем случае использование метода ниже может работать хорошо:

например:

import openpyxl,os
from copy import copy

path = '1.xlsx'
wb_1 = openpyxl.load_workbook(path)
ws_1 = wb_1[wb_1.sheetnames[0]]
wb_2 = openpyxl.Workbook()
ws_2 = wb_2.active
ws_2.title = "SHEET"
ws_2.sheet_format = ws_1.sheet_format

for (row, col), source_cell  in ws_1._cells.items():
    cell = ws_2.cell(column=col, row=row)
    cell.value = source_cell.value
    cell.font = copy(source_cell.font)
    cell.fill = copy(source_cell.fill)
    cell._hyperlink = source_cell._hyperlink
    cell.comment = source_cell.comment
wb_2.save('11.xlsx')
0 голосов
/ 20 июня 2020

Мое решение, представленное здесь, представляет собой адаптацию из этого сообщения , которое я неоднократно упоминал в своих комментариях по вашему вопросу, и с использованием документации openpyxl

Вот как выглядит мой входной xlsx:

enter image description here

Вот код:

import openpyxl

# file 1:
wb_1 = openpyxl.load_workbook(in_path, read_only=True)
ws_1 = wb_1[wb_1.sheetnames[0]]

# file 2 (it's a new file):
wb_2 = openpyxl.Workbook()
ws_2 = wb_2.active

for r in ws_1.rows:
    for c in r:
        ws_2.cell(row=c.row, column=c.column).value = c.value
        ws_2.cell(row=c.row, column=c.column).fill = c.fill
        ws_2.cell(row=c.row, column=c.column).font = c.font
        ws_2.cell(row=c.row, column=c.column).number_format = c.number_format
        ws_2.cell(row=c.row, column=c.column).border = c.border

wb_2.save(out_path)

Вот мой результат документ:

enter image description here

По сути, мой внутренний l oop является дубликатом кода здесь:

    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)

Итак, частичная заслуга принадлежит @CharlieClark за его сообщение (ссылка здесь снова)

Если вы хотите, чтобы люди отвечали на ваши вопросы по SO, по крайней мере, попытайтесь использовать информацию, которую они предоставьте в комментариях. Особенно, если вы новичок в python или конкретном пакете. Это не служба программирования, вам следует хотя бы попытаться найти решение, прежде чем утверждать, что ваш пост не является дубликатом или на вопрос еще не был дан ответ.

...