はじめに
このサイトでは、社会人なりたての私が無駄を省くための戦いをまとめています。
今回のテーマは、pythonのライブラリを用いて、Excelをいじっていきます。
ライブラリ名は、openpyxlです。
実行環境
Windows10
Python 3.10.5
openpyxlとは?
openpyxlはExcelファイル(.xlsx
)を読み書きできるツールです。
公式ドキュメント openpyxl/openpyxl-Bitbucket
詳しくはこちら!
今回はExcelファイル内のデータを読み込んで、分析するのではなく、
代入したいだけなので、pandasではなくopenpyxlを使用しています!
特殊な形の表の作成
今回作りたいのは、セルの結合と結合解除(公式)に記載されている表をopenpyxlを使用して作っていきます。
前回までの知識+セルの結合を使います。
セルの結合は、WorkSheet
オブジェクト内のmerge_cell関数を使用します。
書き方は2通りあります。
ws.merge_cells("A1:A3") #開始のセル:終了のセル
ws.merge_cells( start_row=1, #開始の行番号
start_column=1,#開始の列番号
end_row=1, #終了の行番号
end_column=3) #終了の列番号
(どちらの方法でも使えますが、Excelをx,y軸で考えられるので後者がおすすめです。)
このセルの結合の方法で、表を作っていきます。
実践
import openpyxl
from openpyxl.styles.fills import PatternFill
xlsx_path = "Excelファイルのパス"
wb = openpyxl.load_workbook(xlsx_path)
ws = wb.worksheets[0]
tableList = [["月間売上","",""],
["1月","2月","3月"],
["¥194,372.56","¥169,906.14","¥72,234.89"],
["¥200,203.73","¥175,003.33","¥73,679.59"]]
blue = PatternFill(patternType='solid',fgColor='89cff0')
for x in range(1,5):
for y in range(1,4):
ws.cell(row=x,column=y).value = tableList[x-1][y-1]
if x==2:
ws.cell(row=x,column=y).fill = blue
ws.merge_cells("A1:C1")
wb.save(xlsx_path)
上記のコードの実行結果はこちらです。
あれ?結合したのに文字が真ん中に来ていない!
セル結合する上で、文字の位置をコード指定しないといけません。
文字の位置を操作する関数はAlignment関数です。
alignment = Alignment( horizontal="center", #水平方向での位置を指定
vertical="center") #垂直方向での位置を指定
上記のAlignment関数を追記して完成させたいと思います。
※個人的感想ですが、セル結合前にAlignment関数使った方が見やすいです。
for x in range(1,5):
for y in range(1,4):
ws.cell(row=x,column=y).value = tableList[x-1][y-1]
if x==2:
ws.cell(row=x,column=y).fill = blue
ws.cell(row=1,column=1).alignment = Alignment(horizontal="center",vertical="center")
ws.merge_cells("A1:C1")
追記した上で、実行した結果がこちらです。
参考した表から大分数値の部分を削りましたが、指定の表を作成することができました。
おまけ
Alignment関数には、何個かトラップが仕掛けられているので紹介したいと思います。
Alignment関数と改行コード
Alignment関数を使っていると改行コードを代入しても改行されない問題があります。
原因としてはAlignment関数の引数の一つにwrapText
があります。
この引数で、セル内で改行するか決めており、こいつの立ち悪いことは、デフォルトがfalseになっていることです。なので、Alignment関数を使うときは、wrapText
をtrueにして使ってください。
Alignment関数とセル結合
Excelでは、セル結合したときは、セル結合を始めたセルのデータが基準になります。
openpyxlでpython使っても一緒で、セル結合を始めたセルのデータを操作しないと、反映されないので、忘れずに。なので、セル結合する前に、セルのデータの操作を終わらせときましょう。
終わりに
ここまでである程度のExcelの業務は代替できるのでは?と内心思っていますが、はたしてこれに需要があるかは不明ですね。書いてる本人が疑っているので。ということでpythonでExcelの操作する話のネタが尽きてきたのでもう少しopenpyxlの仕様の部分を書いていきたいと思います。