Openpyxlでのスタイルの設定に関するアドバイスが必要です。
セルのNumberFormatを設定できるようですが、フォントの色と属性(太字など)も設定する必要があります。style.pyクラスがありますが、セルのstyle属性を設定できないようで、openpyxlソースコードをいじり始めたくありません。
誰かがこれに対する解決策を見つけましたか?
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
参考までに、色の名前は次の場所にあります... X11の色名openpyxl/style.py
から余分な色をパッチすることがあります
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'
As of openpyxl 2.0, styles are immutable.
If you have a cell
, you can (e.g.) set bold text by:
cell.style = cell.style.copy(font=cell.style.font.copy(bold=True))
Yes, this is annoying.
openpyxl 2.0 以降、セル スタイルの設定は、新しいスタイル オブジェクトを作成し、それらをセルのプロパティに割り当てることによって行われます。
Font
、PatternFill
、Border
、 などのいくつかのスタイル オブジェクトがありますAlignment
。ドキュメントを参照してください。
セルのスタイル プロパティを変更するには、まずセルから既存のスタイル オブジェクトをコピーしてプロパティの値を変更するか、必要な設定で新しいスタイル オブジェクトを作成する必要があります。次に、新しいスタイル オブジェクトをセルに割り当てます。
セル 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.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
これでエラーが発生します。
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
セルのスタイルには、font、fill、border、alignment、protection、および number_format の属性が含まれます。確認してください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_ ;_ * "-"??_ ;_ @_ '