Я пытаюсь скопировать несколько ячеек с цветными шрифтами с одного листа на другой, используя openpyxl. Ячейка A1 окрашена только в цвет, а ячейка A2 имеет цвет насыщенного текста (поэтому окрашена только часть ячейки)
Используя следующий код:
import openpyxl as ox
import os
import sys
path = os.path.abspath(os.path.dirname(sys.argv[0]))
fn = os.path.join(path, "test.xlsx")
wb = ox.load_workbook(fn, rich_text=True)
ws = wb["input"]
wsOut = wb["output"]
cell1 = ws["A1"]
cell1NEW = wsOut["A1"]
cell1NEW.value = cell1.value
cell1 = ws["A2"]
cell1NEW = wsOut["A2"]
cell1NEW.value = cell1.value
wb.save("test.xlsx")
Но когда я запускаю код, только ячейка A2 скопирована правильно. Для ячейки А1 копируется только текст – без раскраски/стиля.
Как я могу скопировать цвет (стиль) для обеих ячеек?






Excel хранит настройки шрифтов на двух уровнях.
Сам стиль ячейки может иметь настройки шрифта. Это применимо ко всему содержимому ячейки.
Ячейка может содержать форматированный текст, который состоит из текстовых фрагментов с настройками шрифта для каждого текстового фрагмента.
В вашем примере ячейка A1 имеет настройки шрифта стиля ячейки, который устанавливает синий цвет шрифта и специальный размер шрифта. Содержимое ячейки само по себе представляет собой не форматированный текст, а только обычный текст «col».
В ячейке A2 есть настройки шрифта стиля ячейки, который устанавливает только специальный размер шрифта. И он содержит форматированный текст, где текстовая строка «ТЕКСТ» имеет специальный цвет и размер шрифта. Настройки шрифта стиля ячейки применяются к тексту «AAA», тогда как форматированный текст отображается только как «ТЕКСТ».
Cell.value получает или устанавливает форматированный текстовый контент, если он включен.
Cell.font получает или устанавливает настройки шрифта стиля ячейки (вся ячейки).
Таким образом, вам также необходимо установить Cell.font:
...
from copy import copy
...
cell1 = ws["A1"]
cell1NEW = wsOut["A1"]
cell1NEW.value = cell1.value
cell1NEW.font = copy(cell1.font)
cell1 = ws["A2"]
cell1NEW = wsOut["A2"]
cell1NEW.value = cell1.value
cell1NEW.font = copy(cell1.font)
...
Чтобы сделать Cell.font копией шрифта другой ячейки, необходимо использовать copy (из from copy import copy), поскольку для Cell.font не существует специального установщика. Установщик по умолчанию не сможет использовать простое присваивание =.
@ Rapid1898: 1): посмотрите мои добавки; 2): Это необходимо для текстовой части «AAA», которая не является форматированным текстом. Опечатка исправлена.
спасибо за ваш ответ - 2 вопроса: 1) Почему эта копия() необходима и почему простое присвоение с = невозможно 2) Оператор копирования для ячейки A2 не нужен, потому что ее форматированный текст - правильно? (кроме того, в вашем коде есть небольшая опечатка - это ячейка1NEW, а не ячейка NEW