openpyxl で EXCEL を作成できるのはとても便利ですが、見た目も揃えたいことが多いです。
毎回書式を設定する操作を記述するのが面倒なので、利用頻度が高い操作を staticメソッドにまとめてみました。
import openpyxl
from openpyxl import Workbook
from openpyxl.worksheet.worksheet import Worksheet
from openpyxl.styles import Font, Alignment, PatternFill
from openpyxl.styles.borders import Side, Border
class MyOpenPyXlLib:
"""
openpyxlでよく使う操作をまとめたメソッド
"""
@staticmethod
def remove_allsheets(workbook: Workbook):
"""
既存のシートを削除する
"""
for worksheet in workbook.worksheets:
workbook.remove(worksheet)
@staticmethod
def convert_cell_letter(col: int, row: int):
"""
「A1」などの文字を作成する
row 行番号(1~)
col 列番号(1~)
"""
return '{}{}'.format(openpyxl.utils.get_column_letter(col), row)
@staticmethod
def set_font_allcells(worksheet: Worksheet, name: str='メイリオ', fontsize: int=10):
"""
フォントを設定する
"""
# set font
font = Font(name=name, size=fontsize)
MyOpenPyXlLib.set_allcells(worksheet=worksheet, font=font)
@staticmethod
def set_alignment_allcells(worksheet: Worksheet, wrapText: bool=True, horizontal: str='center', vertical: str='center'):
"""
すべてのセルに配置を設定する
"""
alignment = Alignment(wrapText=wrapText, horizontal=horizontal, vertical=vertical)
MyOpenPyXlLib.set_allcells(worksheet=worksheet, alignment=alignment)
@staticmethod
def set_boder_allcells(worksheet: Worksheet):
"""
すべてのセルに枠線を付ける
"""
side = Side(style='thin', color='000000')
border = Border(left=side, right=side, top=side, bottom=side)
MyOpenPyXlLib.set_allcells(worksheet=worksheet, border=border)
@staticmethod
def set_auto_filter(worksheet: Worksheet, s_col: int, s_row: int, e_col: int, e_row: int):
"""
フィルターを設定する
s_col 開始位置のcol
s_row 開始位置のrow
e_col 終了位置のcol
e_row 終了位置のrow
"""
worksheet.auto_filter.ref = '{}:{}'.format(
MyOpenPyXlLib.convert_cell_letter(row=s_row, col=s_col),
MyOpenPyXlLib.convert_cell_letter(row=e_row, col=e_col))
@staticmethod
def set_column_width(worksheet: Worksheet, col: int, width: int = 80):
"""
列幅を設定する
worksheet ワークシート
col 列番号
width 列幅
"""
letter = openpyxl.utils.get_column_letter(col)
worksheet.column_dimensions[letter].width = width
@staticmethod
def set_allcells(worksheet: Worksheet, font: Font=None, border: Border=None, alignment: Alignment=None, fill: PatternFill=None):
"""
すべてのセルに適用する
"""
# 文字が入っている範囲を選択する
range_letter = '{}:{}'.format(
MyOpenPyXlLib.convert_cell_letter(row=worksheet.min_row, col=worksheet.min_column),
MyOpenPyXlLib.convert_cell_letter(row=worksheet.max_row, col=worksheet.max_column))
MyOpenPyXlLib.set_cells(worksheet=worksheet, range_letter=range_letter, font=font, border=border, alignment=alignment, fill=fill)
@staticmethod
def set_cells(worksheet: Worksheet, range_letter, font: Font=None, border: Border=None, alignment: Alignment=None, fill: PatternFill=None):
"""
指定したセルに適用する
"""
for row in worksheet[range_letter]:
for cell in row:
if border is not None:
cell.border = border
if font is not None:
cell.font = font
if alignment is not None:
cell.alignment = alignment
if fill is not None:
cell.fill = fill