web-dev-qa-db-ja.com

Openpyxlでスタイルを設定する

Openpyxlでのスタイル設定に関するアドバイスが必要です。

セルのNumberFormatを設定できることがわかりましたが、フォントの色と属性(太字など)の設定も必要です。 style.pyクラスはありますが、セルのスタイル属性を設定できないようで、openpyxlソースコードをいじり始めたくありません。

誰かがこれに対する解決策を見つけましたか?

42
Nelson Shaw

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で色の名前を見つけることができます...私は時々 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'
81
Mike Pennington

Openpyxl 2.0では、セルスタイルの設定は、新しいスタイルオブジェクトを作成し、それらをセルのプロパティに割り当てることによって行われます。

いくつかのスタイルオブジェクトがあります:FontPatternFillBorder、およびAlignmentdoc を参照してください。

セルのスタイルプロパティを変更するには、まずセルから既存のスタイルオブジェクトをコピーしてプロパティの値を変更するか、目的の設定で新しいスタイルオブジェクトを作成する必要があります。次に、新しいスタイルオブジェクトをセルに割り当てます。

セル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)
12
Tomasz Nguyen

Openpyxl 2.0では、スタイルは不変です。

cellがある場合、次の方法で太字のテキストを設定できます(例)。

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

はい、これは迷惑です。

11
user3757614

Openpyxlバージョン2.4.1以降では、以下のコードを使用してフォントの色を設定します。

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

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

さまざまな色の16進コードは次の場所にあります: http://dmcritchie.mvps.org/Excel/colors.htm

7
Parth Karia

これは、数回変更された機能のようです。私は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

これでエラーが発生します。

3
Don Kirkby

Openpyxl-1.7.0の時点で、これも実行できます。

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

特定のcellにスタイルを設定するヘルパー関数がいくつかあります-ヘッダー、フッターなど。

2
Enda Farrell

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以降では、スタイルは不変です。

スタイルはオブジェクト間で共有され、一度割り当てられると変更できません。これにより、1つだけではなく多くのセルのスタイルを変更するなど、望ましくない副作用を防ぎます。

新しいスタイルオブジェクトを作成するには、それを直接割り当てるか、既存のセルのスタイルから新しい属性を使用してコピーし、例として質問に答えます(私の中国語英語はご容赦ください):

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_ ;_ * "-"??_ ;_ @_ '
2