Pythonにできることは自動化しよう!【第14回 Excel応用編2】

こんにちは、unogram管理人のうのちゅ〜です。

【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って学習し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



Excel操作もPythonにやってもらおう!(応用編2)

応用編1では、openpyxlを使った柔軟なデータ入出力について解説しました。

応用編2では、Excelファイルならではの操作について踏み込んでいきます

ExcelファイルのCSVファイルとの違いは、単なるカンマで区切られた文字列ではないという点です。openpyxlでは、ふだんExcelのGUIアプリケーションで行っている「フォントスタイルの設定」や「数式の入力」、「セルの幅や高さの設定」、「グラフの作成」などを行うことができます。今回はこれらのやり方について学んでいきましょう。

フォントスタイルの設定 openpyxl.styles.Font()

セルのフォントスタイルを設定した場合は、openpyxl.stylesモジュールからFont()関数をインポートする必要があります。

from openpyxl.styles import Font

前回作成したExcelファイルを使用してみます。まずは復習ついでにopenpyxl.load_workbook(filename)でデータを読み込んで確認してみましょう。

import openpyxl
filename = 'excelautomation3_update.xlsx'
wb = openpyxl.load_workbook(filename)
sheet = wb['Sheet']
for row in sheet.iter_rows():
    for col in row:
        print(col.value)

# test
# 1
# test2
# 2
# test3
# 3
# add
# 1
# add2
# 2
# add3
# 3

それではフォントスタイルを変更してみましょう。試しにsizeを30、フォントをImpactとして、次のようにFont()関数の引数に渡します。

impact = Font(size=30, name='Impact')
for row in sheet.iter_rows():
    for col in row:
        col.font = impact
        
filename2= 'excelautomation_impact.xlsx'
wb.save(filename2)

Excelファイルを開いてみます(MacのNumbersで開いているのでExcelとは見た目が異なります)。指定した通りにフォントが設定されていることが分かります。

数式の入力

openpyxlモジュールを使うと、文字列や数値だけでなく、数式をセルに設定することも可能です。

次の例では、平均を表す関数AVERAGEや最小値MIN、最大値MAXを適用しています。

filename = 'excelautomation3_update.xlsx'
wb = openpyxl.load_workbook(filename)
sheet = wb['Sheet']

sheet['A7']='average'
sheet['B7']='=AVERAGE(B1:B6)'
sheet['A8']='min'
sheet['B8']='=MIN(B1:B6)'
sheet['A9']='max'
sheet['B9']='=MAX(B1:B6)'

wb.save('excelautomation_eq.xlsx')

正しく数式が入力され、その通りに計算できているか確認してみましょう。



セルの幅や高さの設定

openpyxlモジュールを使うと、セルごとに高さや幅を設定することができます。

セルの高さ、幅は、それぞれWorksheetオブジェクトの属性であるrow_dimensionscolumn_dimensionsで設定します。高さ・幅を設定したい行の番号、列の文字を指定して、高さheight、幅widthを設定します。

例を見てみましょう。

filename = 'excelautomation_eq.xlsx'
wb = openpyxl.load_workbook(filename)
sheet = wb['Sheet']

sheet.column_dimensions['A'].width = 30
sheet.column_dimensions['B'].width = 10
for row in range(7,10):
    print(row)
    sheet.row_dimensions[row].height = 30
wb.save('excelautomation_widthheight.xlsx')

結果は以下のようになります。

グラフの作成

最後に、Excelの大きな特徴であるグラフの作成について見ていきましょう。openpyxlモジュールを用いたグラフ作成の手順は以下の通りです。

  1. グラフに使用するデータの領域を指定し、Referenceオブジェクトを生成する
  2. 生成したReferenceオブジェクトや設定したいタイトルを渡して、Seriesオブジェクトを生成する
  3. 生成したいグラフの種類に応じたChartオブジェクトを生成する
  4. 生成したChartオブジェクトに、Seriesオブジェクトをappend()する
  5. WorksheetオブジェクトにChartオブジェクトをadd_chart()する

openpyxlモジュールを使ったExcelファイルにおけるグラフ作成は一見面倒なように見えますが、いくつものExcelファイルにグラフを作成していくような単調かつ面倒な作業においては特に威力を発揮します。

filename = 'excelautomation_eq.xlsx'
wb = openpyxl.load_workbook(filename)
sheet = wb['Sheet']

ref = openpyxl.chart.Reference(sheet, min_col=2, min_row=1, max_col=2, max_row=6)
series = openpyxl.chart.Series(ref, title = 'Test')
chart = openpyxl.chart.LineChart()
chart.append(series)
sheet.add_chart(chart)
wb.save('excelautomation_chart.xlsx')

作成されたグラフを見てみましょう。

今回は折れ線グラフの例を示しましたが、棒グラフやバブルチャート、散布図など様々な種類のグラフを生成することが可能です。(参考:OpenPyXL-Charts



まとめ

今回は、【Pythonにできることは自動化しよう!】シリーズ第14回として、openpyxlモジュールを使ったExcel操作(応用編)ついて解説しました。今回は応用編2として、ふだんExcelのGUIアプリケーションで行っている「フォントスタイルの設定」や「数式の入力」、「セルの幅や高さの設定」、「グラフの作成」について解説しました。

1つ2つのファイルに操作するのはGUIの方がラクですが、いくつものファイルに対して同じ種類のグラフを作成するような作業は非常に面倒です。このような面倒な作業に対しては、Pythonを活用するという選択肢をもっていると非常に有用なので、ぜひ使えるようにしておきましょう!

さらに追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。