Установка стилей в Openpyxl - PullRequest
42 голосов
/ 09 декабря 2011

Мне нужен совет по настройке стилей в Openpyxl.

Я вижу, что NumberFormat ячейки можно установить, но мне также требуется настройка цветов и атрибутов шрифта (полужирный и т. Д.).Существует класс style.py, но, похоже, я не могу установить атрибут style для ячейки, и я действительно не хочу начинать возиться с исходным кодом openpyxl.

Кто-нибудь нашел решение дляэто?

Ответы [ 7 ]

81 голосов
/ 09 декабря 2011

Начиная с openpyxl версии 1.5.7, я успешно применил следующие параметры стиля листа ...

from openpyxl.reader.excel import load_workbook
from openpyxl.workbook import Workbook
from openpyxl.styles import Color, Fill
from openpyxl.cell import Cell

# Load the workbook...
book = load_workbook('foo.xlsx')

# define ws here, in this case I pick the first worksheet in the workbook...
#    NOTE: openpyxl has other ways to select a specific worksheet (i.e. by name
#    via book.get_sheet_by_name('someWorksheetName'))
ws = book.worksheets[0]

## ws is a openpypxl worksheet object
_cell = ws.cell('C1')

# Font properties
_cell.style.font.color.index = Color.GREEN
_cell.style.font.name = 'Arial'
_cell.style.font.size = 8
_cell.style.font.bold = True
_cell.style.alignment.wrap_text = True

# Cell background color
_cell.style.fill.fill_type = Fill.FILL_SOLID
_cell.style.fill.start_color.index = Color.DARKRED

# You should only modify column dimensions after you have written a cell in 
#     the column. Perfect world: write column dimensions once per column
# 
ws.column_dimensions["C"].width = 60.0

К вашему сведению, вы можете найти названия цветов в openpyxl/style.py ... Iиногда я добавляю дополнительные цвета из имен цветов X11

class Color(HashableObject):
    """Named colors for use in styles."""
    BLACK = 'FF000000'
    WHITE = 'FFFFFFFF'
    RED = 'FFFF0000'
    DARKRED = 'FF800000'
    BLUE = 'FF0000FF'
    DARKBLUE = 'FF000080'
    GREEN = 'FF00FF00'
    DARKGREEN = 'FF008000'
    YELLOW = 'FFFFFF00'
    DARKYELLOW = 'FF808000'
12 голосов
/ 08 сентября 2015

Начиная с openpyxl 2.0, установка стилей ячеек выполняется путем создания новых объектов стиля и назначения их свойствам ячейки.

Существует несколько объектов стиля: Font, PatternFill, Border и Alignment.См. doc .

Чтобы изменить свойство стиля ячейки, сначала вам нужно либо скопировать существующий объект стиля из ячейки и изменить значение свойства, либо создатьновый стиль объекта с желаемыми настройками.Затем присвойте ячейке новый объект стиля.

Пример установки шрифта для жирного шрифта и курсива для ячейки A1:

from openpyxl import Workbook
from openpyxl.styles import Font
# Create workbook
wb = Workbook()
# Select active sheet
ws = wb.active()
# Select cell A1
cell = ws['A1']
# Make the text of the cell bold and italic
cell.font = cell.font.copy(bold=True, italic=True)
11 голосов
/ 28 августа 2014

Начиная с openpyxl 2.0, стили неизменны.

Если у вас есть cell, вы можете (например) установить жирный текст с помощью:

cell.style = cell.style.copy(font=cell.style.font.copy(bold=True))

Да, это раздражает.

6 голосов
/ 31 марта 2017

Для openpyxl версии 2.4.1 и выше используйте код ниже, чтобы установить цвет шрифта:

from openpyxl.styles import Font
from openpyxl.styles.colors import Color

ws1['A1'].font = Font(color = "FF0000")

шестнадцатеричные коды для различных цветов можно найти по адресу: http://dmcritchie.mvps.org/excel/colors.htm

2 голосов
/ 16 мая 2018

Это похоже на функцию, которая изменилась несколько раз. Я использую openpyxl 2.5.0, и я смог установить опцию зачеркивания следующим образом:

new_font = copy(cell.font)
new_font.strike = True
cell.font = new_font

Похоже, что в более ранних версиях (1.9 до 2.4?) Для шрифта использовался метод copy, который теперь устарел и выдает предупреждение:

cell.font = cell.font.copy(strike=True)

Версии до 1.8 имели изменяемые шрифты, так что вы можете просто сделать это:

cell.font.strike=True

Теперь возникает ошибка.

2 голосов
/ 01 сентября 2016

Как openpyxl doc сказал:

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

Я проверил исходный код openpyxl, обнаружил, что:

До openpyxl 1.8.x стили изменчивы. Их атрибут может быть назначен непосредственно так:

from openpyxl.workbook import Workbook
from openpyxl.style import Color

wb = Workbook()
ws = wb.active
ws['A1'].style.font.color.index = Color.RED

Однако из openpyxl 1.9 стили неизменны.

Стили являются общими для объектов, и после назначения они не могут быть изменены. Это останавливает нежелательные побочные эффекты, такие как изменение стиля для множества ячеек, когда вместо одной.

Чтобы создать новый объект стиля, вы можете назначить его напрямую или скопировать его из существующего стиля ячейки с новыми атрибутами, ответьте на вопрос в качестве примера (простите мой китайский английский):

from openpyxl.styles import colors
from openpyxl.styles import Font, Color
from openpyxl import Workbook
wb = Workbook()
ws = wb.active

a1 = ws['A1']
d4 = ws['D4']

# create a new style with required attributes
ft_red = Font(color=colors.RED) 
a1.font = ft_red

# you can also do it with function copy
ft_red_bold = ft_red.copy(bold=True)

# you can copy from a cell's style with required attributes
ft_red_sigle_underline = a1.font.copy(underline="single")

d4.font = ft_red_bold

# apply style to column E
col_e = ws.column_dimensions['E']
col_e.font = ft_red_sigle_underline

Стиль ячейки содержит следующие атрибуты: шрифт, заливка, граница, выравнивание, защита и число_формат. Чек openpyxl.styles.

Они похожи и должны быть созданы как объект, кроме number_format, его значение string type.

Доступны некоторые предварительно определенные числовые форматы, числовые форматы также могут быть определены в строковом типе. Чек openpyxl.styles.numbers.

from openpyxl.styles import numbers

# use pre-defined values
ws.cell['T49'].number_format = numbers.FORMAT_GENERAL
ws.cell(row=2, column=4).number_format = numbers.FORMAT_DATE_XLSX15

# use strings
ws.cell['T57'].number_format = 'General'
ws.cell(row=3, column=5).number_format = 'd-mmm-yy'
ws.cell['E5'].number_format = '0.00'
ws.cell['E50'].number_format = '0.00%'
ws.cell['E100'].number_format = '_ * #,##0_ ;_ * -#,##0_ ;_ * "-"??_ ;_ @_ '
2 голосов
/ 16 апреля 2014

Начиная с openpyxl-1.7.0 вы можете сделать это тоже:

cell.style.fill.start_color.index = "FF124191"

У меня есть несколько вспомогательных функций, которые устанавливают стиль для данного cell - такие вещи, как верхние и нижние колонтитулы и т. Д.

...