web-dev-qa-db-ja.com

行全体にフォーマットを適用するOpenpyxl

フォーマットしたいExcelファイルがあります。最初の行(Headers so row2を除く)は赤で、italicizedである必要があります。

Openpyxlドキュメントの状態

行と列全体にスタイルを適用する場合は、各セルにスタイルを自分で適用する必要があります

私は個人的にこれが悪臭を放つと思います...これが私の回避策です:

_import openpyxl
from openpyxl.styles import NamedStyle
from openpyxl import load_workbook
from openpyxl.styles.colors import RED
from openpyxl.styles import Font
# I normally import a lot of stuff... I'll also take suggestions here.

file = 'MY_PATH'
wb = load_workbook(filename=file)
sheet = wb.get_sheet_by_name('Output')

for row in sheet.iter_rows():
    for cell in row:
        if '2' in cell.coordinate:
            # using str() on cell.coordinate to use it in sheet['Cell_here']
            sheet[str(cell.coordinate)].font = Font(color='00FF0000', italic=True)

 wb.save(filename=file)
_

最初の欠点は、_A24_などのセルが他にある場合、ループがそれにフォーマットを適用することです。これは正規表現で修正できます。それは正しいアプローチでしょうか?

究極的には、行全体にフォーマットを適用するより良い方法はありますか?また。誰かが私にいくつかのgoodOpenpyxlドキュメントを正しい方向に向けることができますか? Stackのsheet.iter_rows()と_cell.coordinates_についてのみ知りました。

7
MattR

2番目の行の色を変更するだけの場合は、すべての行を繰り返す必要はありません。次のように1つの行を繰り返すだけです。

import openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font

file = 'input.xlsx'
wb = load_workbook(filename=file)
ws = wb['Output']
red_font = Font(color='00FF0000', italic=True)

# Enumerate the cells in the second row
for cell in ws["2:2"]:
    cell.font = red_font

wb.save(filename=file)

あなたに次のようなものを与える:

Excel screen shot

複数のセルへのアクセスについては、openpyxlのドキュメントで説明されています: Accessing many cells


または、NamedStyleを使用するには:

import openpyxl
from openpyxl import load_workbook
from openpyxl.styles import Font, NamedStyle

file = 'input.xlsx'
wb = load_workbook(filename=file)
ws = wb.get_sheet_by_name('Output')

# Create a NamedStyle (if not already defined)
if 'red_italic' not in wb.named_styles:
    red_italic = NamedStyle(name="red_italic")
    red_italic.font = Font(color='00FF0000', italic=True)
    wb.add_named_style(red_italic)

# Enumerate the cells in the second row
for cell in ws["2:2"]:
    cell.style = 'red_italic'

wb.save(filename=file)
26
Martin Evans