経緯
Excelあまり好きじゃないですが、現場で色んなExcelの成果物がほしいなので、できるだけ自動化するために、Openpyxlを学習。
以下のソースの一部はソースからコピーしたので、クラス内部の部分もあって、selfなどがそのまま残っていますが、読み替えてください。
workbook, worksheet, cellに関する基本操作
import openpyxl
...
# 新規Excelを作成して保存
wb=openpyxl.Workbook()
wb.save(self.fileName)
...
# Excelを開いて新規シートを作成
wb=openpyxl.load_workbook(self.fileName)
wb.create_sheet(self.currentSheetName)
wb.save(self.fileName)
...
# Excelを開いて特定のシートを指定
wb=openpyxl.load_workbook(self.fileName)
ws=wb[self.currentSheetName]
...
# 特定セルの中身と枠(後で説明)のスタイルを指定
ws.cell(row=1, column=1).value='hello'
ws.cell(row=1, column=1).border=self.border
...
# Excelを開いて特定シートの最大行数を取得
wb=openpyxl.load_workbook(self.fileName)
ws=wb[self.currentSheetName]
lastRowIndex=ws.max_row
...
# 列の番号から列のアルファベットを取得(例:1からAを取得)、列のサイズを自動に変更
colName=openpyxl.utils.cell.get_column_letter(idx)
ws.column_dimensions[colName].auto_size = True
...
# 特定のシートが存在すれば、削除
if 'Sheet' in wb.sheetnames:
wb.remove(wb['Sheet'])
wb.save(self.fileName)
...
border設定例
from openpyxl.styles.borders import Border, Side
...
# 黒の細目の実線
self.border=Border(top=Side(style='thin', color='000000'),
bottom=Side(style='thin', color='000000'),
left=Side(style='thin', color='000000'),
right=Side(style='thin', color='000000'))
...
# 特定セルのborderを設定
ws.cell(row=excelCurrentRowNum, column=colIdx+1).border=self.border
fill(背景色)設定例
from openpyxl.styles import PatternFill
...
# 単色で黄色
self.fill=PatternFill(fill_type='solid', bgColor='00FFFF00')
...
# 書式付きフォーマットで式を指定して色を適用(例、A7とA4が一致しないと黄色に変更)
rule=FormulaRule(formula=['A7<>A4'], fill=self.fill)
fomular rule(書式付きフォーマット)設定例
from openpyxl.formatting.rule import FormulaRule
...
# 式と色を指定してルールを作成して、セルの適用範囲を指定
rule=FormulaRule(formula=['A7<>A4'], fill=self.fill)
ws.conditional_formatting.add('A7:Z10', rule)
...
性能について
①セルを1個1個で書き込みをするよりは、ws.append(data)のほうが速い。
※dataは['1', '2', '3', '4']のようなリストであれば自動的に複数のセルに書き込み。
②wb.save(filename)はできるだけ避けること。
※保存操作は1回だけでも数秒ぐらいかかる。