• トップ
  • ブログ一覧
  • Python と openpyxl で Excel を簡単に自動操作してみた!
  • Python と openpyxl で Excel を簡単に自動操作してみた!

    広告メディア事業部広告メディア事業部
    2020.07.11

    IT技術

    openpyxl とは?

    「openpyxl」は、Excel を自動で操作してくれる Python のモジュールです。

    ブックの新規作成」「シートの追加」「セルへの入力」「グラフ作成」など…。

    めんどくさい Excel 操作を、Python で組み立てることができてしまいます。

    もし、あなたが Excel を利用した定型業務をしているのであれば、ぜひ openpyxl の導入を検討してみてください。

    今まで膨大な時間がかかっていた作業が、Python のプログラムを実行するだけで終わってしまうかもしれません!

    openpyxl の導入方法

    openpyxl は、Python のモジュールなので、お馴染みの pip コマンドを使ってインストールします。

    1pip install openpyxl

    上記をインストールした後は、プログラム内から以下のようにモジュールを読み込みます。

    1import openpyxl

    これで、openpyxl を利用する準備が整いました!

    openpyxl の使用上の注意

    セルへの書き込みは型を意識する

    数字を文字型としてセルへ書き込むと、Excel でも文字として扱われてしまうため、グラフ化などに影響が出ます。

    そのため、Excel のセルへ値を書き込む際には、型を意識して書き込んだ方がトラブルを回避できます。

    Excel の旧ファイル形式は扱えない

    Excel2003 まで使われていた拡張子「xls」形式のファイルは、残念ながら openpyxl では使えません。

    Excel で一度「xls」ファイルを開いてから、手動で「xlsx」へ変換する必要があります。

    今回の実装例で利用する openpyxl の関数

    今回利用する openpyxl の関数は、以下となります。

    新しい Excel ファイルのオブジェクトを作成する

    デフォルトで「Sheet」という名前のシートが作成されます。

    1excel = openpyxl.Workbook()

    操作対象のシートオブジェクトを作成する

    このシートオブジェクトで、「cell 関数」を利用していきます。

    1sheet = excel['シート名']

    Excel のセルへ値を入力する

    行と列は、数字を使って指定します。

    行・列ともに「1」から指定可能で、「1」は1行目および A 列目を意味します。

    1sheet.cell(”行", "" ,"セルへ入力したい値")

    折れ線グラフのオブジェクトを生成する

    「棒グラフ」や「円グラフ」など、他のグラフオブジェクトを生成したい場合は、LineChart 部分を変更してください。

    1chart = openpyxl.chart.LineChart()

    折れ線グラフで使用するデータ範囲のオブジェクトを生成する

    以下の場合、グラフのデータ範囲は Excel 表記で「データのあるシート!$最小列$最小行:$最大列$最大行」となります。

    1data = openpyxl.chart.Reference("データのあるシートオブジェクト", min_col="最小列", min_row="最小行", max_col="最大列", max_row=”最大行”)

    折れ線グラフのオブジェクトにデータを登録する

    上記で生成したデータ範囲をグラフオブジェクトに渡します。

    titles_from_data オプションを有効にすることで、データ範囲の内、1行目をラベルに使用します。

    1chart.add_data("データ範囲のオブジェクト", titles_from_data=True)

    グラフをシートオブジェクトへ貼り付ける

    貼り付けるセルの箇所は、「A1」など Excel のセル名で指定可能です。

    1sheet.add_chart(”貼り付けるグラフオブジェクト”, "貼り付けるセル")

    新しいシートのオブジェクトを作成する

    最初に作成した Excel ファイルオブジェクトに、新しいシートを作成します。

    1excel.create_sheet('シート名')

    Excel ファイルを保存する

    Excel ファイルに名前をつけて保存します。

    1excel.save('ファイル名')

    他にも様々な機能がありますので、詳細なマニュアルは、以下のオフィシャルドキュメントを参照ください。

    【openpyxlオフィシャルドキュメント】
    https://openpyxl.readthedocs.io/en/stable/index.html

    Python + openpyxl でサクッと自動化完成!

    今回の実装例では、Linux のリソース状況を調査するコマンド「vmstat」のログをエクセルに転記して、CPU 使用率のグラフを作成します。

    処理の流れ

    1. vmstat のデータを、カンマ区切りのデータとしてリストに取り込む
    2. リストを1つずつ Excel のセルへ転記する
    3. 新しいシートを作成する
    4. CPU 関連データの折れ線グラフを貼り付ける
    5. ファイル名をつけて Excel ブックを保存する

    コード

    上記作業を Python + openpyxl を使って自動化すると、以下のようになります。

    1import openpyxl
    2import re
    3
    4#行数を格納する変数を1で初期化
    5row = 1
    6
    7#新しいEXCELファイルのオブジェクトを作成
    8excel = openpyxl.Workbook()
    9#シートオブジェクトとして上記のEXCELファイルオブジェクト内のシート「Sheet」を選択。
    10sheet = excel['Sheet']
    11
    12#vmstatのログファイルをUTF-8として変数logへ格納
    13log = open("sample.txt", "r", encoding="utf_8")
    14
    15#logの内容を一行ずつ読み込み、以下の文字列編集を実施
    16#一番左の空白を削除
    17#空白の一回以上の連続を「,」に置換
    18#一番右の不要な「,」を削除
    19#「,」を区切り文字としてline変数にリストとして代入
    20for line in log:
    21    line = line.lstrip(" ")
    22    line = re.sub(r"\s+", ",", line)
    23    line = line.rstrip(",")
    24    line = line.split(",")
    25
    26#data変数にline内のログを1行ずつ読み込み格納
    27#colum変数にlineリストから読み込んだ回数を0から順番に格納する。
    28    for colum, data in enumerate(line):
    29        colum += 1
    30#1行目と2行目は文字列としてセルに値を入力する。
    31        if row <= 2:
    32            sheet.cell(row, colum, data)
    33#3行目以降は数値型としてセルに値を入力する。
    34        else:
    35            sheet.cell(row, colum, int(data))
    36#次の行に入力するためにrowをインクリメントする。
    37    row += 1
    38
    39#折れ線グラフのオブジェクトを作成する。
    40chart = openpyxl.chart.LineChart()
    41#折れ線グラフのタイトルを設定する。
    42chart.title = "CPU Usage"
    43#折れ線グラフのスタイルを数字で指定する。
    44chart.style = 2
    45#折れ線グラフのX軸のタイトルを指定する。
    46chart.x_axis.title = 'Time'
    47#折れ線グラフのY軸のタイトルを指定する。
    48chart.y_axis.title = 'Percentage'
    49#折れ線グラフのサイズ(縦)を指定する。
    50chart.height = 15
    51#折れ線グラフのサイズ(横)を指定する。
    52chart.width = 40
    53
    54#折れ線グラフのデータ範囲としてCPUに関連するN(13)R(17)、2行目(タイトルとして利用)~最終行を選択。
    55data = openpyxl.chart.Reference(sheet, min_col=13, min_row=2, max_col=17, max_row=sheet.max_row)
    56#上記のデータを折れ線グラフのオブジェクトに格納する。
    57#titles_from_dataを有効にすることで、データ範囲の1行目をタイトルとして利用
    58chart.add_data(data, titles_from_data=True)
    59
    60#新しいシート「Sheet1」を作成する。
    61excel.create_sheet('Sheet1')
    62#現在のシートを「Sheet1」にする。
    63sheet = excel['Sheet1']
    64#Sheet1のA1セルへ折れ線グラフを貼り付ける。
    65sheet.add_chart(chart, "A1")
    66
    67#ファイル名を「test.xlsx」としてEXCELファイルを保存する。
    68excel.save('test.xlsx')

    サンプルデータ

    上記、実装例のプログラムで使用した vmstat のサンプルデータは以下です。
    (※クリックすると、ダウンロートが実行されます)

    sample.txt

    このプログラムを実行すると、以下の Excel ファイルが保存されます。
    (※クリックすると、ダウンロートが実行されます)

    test.xlsx

    実装結果

    作成した Excel ファイルを確認すると、シート名「Sheet」には以下のようなデータが読み込まれています。

    シート名「Sheet1」には、折れ線グラフが出力されています。

    1秒毎に vmstat を取得したので、167秒目から CPU 使用率が上がったことがわかります。

    さいごに

    Python + openpyxl の使い方はご理解いただけましたか?

    Excel の操作を Python で実装できるので、様々な自動化が期待できます。

    今回のように、システムが出力したテキストファイルを Excel へ転機してグラフ化する場合、どんなにテキストファイルが大量になっても、openpyxl を使えば一瞬でグラフを作ることができます。

    その他にも、Excel ファイル同士の転記を行う業務や、スクレイピングと組み合わせて WEB の情報を Excel に転記する業務などの自動化が可能です。

    皆さんを煩わせる面倒な Excel 業務は、Python + openpyxl でサクッと自動化しちゃいましょう!

    こちらの記事もオススメ!

    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事