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

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

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

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

Ответы

Ответ 1

Как и в 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'

Ответ 2

Как и в openpyxl 2.0, стили неизменяемы.

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

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

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

Ответ 3

Как и в 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)

Ответ 4

Как и openpyxl-1.7.0, вы также можете сделать это:

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

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

Ответ 5

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

Стиль ячейки содержит следующие атрибуты: font, fill, border, alignment, protection и 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_ ;_ * "-"??_ ;_ @_ '

Ответ 6

Для 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