Настройка стилей в Openpyxl

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

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

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

7 ответов


начиная с 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

FYI, вы можете найти названия цветов в openpyxl/style.py... Я иногда я патч в дополнительных цветах от названия цветов 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'

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

есть несколько объектов типа: Font, PatternFill, Border и Alignment. Вижу doc.

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

пример установки шрифта жирным шрифтом и курсивом ячейки 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)

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

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

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

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


С openpyxl-1.7.0 Вы тоже можете это сделать:

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

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


как 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

стиль ячейки содержит эти атрибуты: шрифт, заливка, граница, выравнивание, защита и number_format. Проверка openpyxl.styles.

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

некоторые заранее определенные форматы номера доступны, форматы номера можно также определить в типе строки. Проверка 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_ ;_ * "-"??_ ;_ @_ '

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

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

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

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


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

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

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

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

версии до 1.8 имели изменяемые шрифты, поэтому вы могли бы просто сделать это:

cell.font.strike=True

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