Kompira Enterprise で Excelファイルの読み書きをする

Python で記述された処理を Kompira Enterprise から呼び出す」では、Kompira Enterprise ジョブフローから Python コードを呼び出す方法を解説しました。今回の記事では Excel ファイルを扱う Python ライブラリを利用して、データの読み書きを行います。

Excel ファイルを扱える Python ライブラリはいくつか存在しますが、今回は openpyxl を利用します。
openpyxl には多くの機能が用意されているため、本稿で紹介する機能の他にも、セルの範囲指定や表示フォーマット、色指定など多くの機能を利用できます。知識のある方はチャレンジしてみてください。


動作確認環境

ソフトウェアバージョン
Kompira Enterprise1.5.5.post11
OSCentOS 7.8.2003
openpyxl2.6.4

または

ソフトウェアバージョン
Kompira Enterprise1.6.2.post4
OSCentOS 7.8.2003
openpyxl3.0.7

※ Kompira Enterprise 1.5系のライブラリオブジェクトとして記述できるのは、バージョン2系の Python スクリプトのみでしたが、Kompira Enterprise 1.6系ではバージョン3系の Python スクリプトのみとなりました。本稿の Python スクリプトはどちらのバージョンでも実行可能です。


Excel ファイルの用意

ここでは Kompira Enterprise サーバーの /tmp に test.xlsx をアップロードします。
この際にアカウント名「kompira」から操作できるように、ファイルのパーミッションを666に設定してください。

このファイルには以下のような値が書き込まれているとします。

openpyxl のインストール

まず Kompira Enterprise サーバーで openpyxl が利用できるようにインストールします。ここでは pip コマンド (Python のパッケージ管理ツール) を利用してインストールします。

$ sudo /opt/kompira/bin/pip install openpyxl

続いて動作確認をします。Python をコマンドラインで起動し、>>> に続いて Python のコマンドを入力していきます。

Excel に記載されている文字列が表示されれば OK です。(以下の例では A1 に記載されている tokyo)

$ /opt/kompira/bin/python
Python 3.6.8 (default, Nov 16 2020, 16:55:22)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from openpyxl import load_workbook
>>> wb = load_workbook('/tmp/test.xlsx')
>>> ws = wb['Sheet1']
>>> print(ws['A1'].value)
tokyo

Kompira Enterprise ライブラリの作成

上記の動作確認の際に使った関数を利用して、Kompira Enterprise のライブラリ型オブジェクトを作ってみましょう。
ここでは「ライブラリ」ディレクトリを作成し、その中に「ExcelRW」というライブラリ型オブジェクトを作成します。

ここで入力する Python コードは以下の通りです。

ライブラリ「ExcelRW」

from openpyxl import load_workbook

# 引数はExcelファイル名、シート名、セル番号
def get_cell_value(filename, sheet_name, cell): 
    wb = load_workbook(filename)    # ファイルの読み込み
    ws = wb[sheet_name]             # シートの指定
    return ws[cell].value           # 指定されたセルの値を返す

※ ここでは、単に特定の Excel シートの特定のセルに書き込まれた内容を返す関数として作成しています。Excel の関数の結果をデータとして取得したい場合は、「wb = load_workbook(filename)」を「wb = load_workbook(filename, data_only=True)」と書き換えてください。

ジョブフローの作成

先に作成した「ライブラリ」ディレクトリの1つ上の階層に、ジョブフロー「Excel読み込み」を作成します。

ジョブフロー「Excel読み込み」

[./ライブラリ/ExcelRW.get_cell_value:
    '/tmp/test.xlsx',
    'Sheet1', 
    'A1'
] ->
print($RESULT)

さて、ここまで出来たら実行してみましょう。セル番号が A1 なので tokyo が表示されるはずです。

ただ、このままだとセル番号を変更するたびにジョブフローの編集が必要になるので、セル位置をパラメータにします。

ジョブフローを以下のように変更します。

ジョブフロー「Excel読み込み」

| cell = 'A1' |

[./ライブラリ/ExcelRW.get_cell_value:
    '/tmp/test.xlsx',
    'Sheet1',
    cell
] ->
print($RESULT)

変数を | | で囲うとパラメータとして設定されます。右辺の値はデフォルト値です。

以下のようにジョブフローの実行時に、パラメータの cell の欄にセル番号を文字列で指定できるようになりました。指定する際には ‘B2’ のようにセル番号を ‘ ‘ で囲ってください。

Excel ファイルへの追記

Excel ファイルにデータを書き込もうとする場合には、何らかの処理結果の記録を残すような場合が考えられます。

そのため、指定された文字列を A 列の一番最後の行に追記する方法をご紹介します。

まずはライブラリ「ExcelRW」に次の関数「append_cell」を追記します。

ライブラリ「ExcelRW」

# 引数は、ファイル名、シート名、追記する値
def append_cell(file, sheet_name, word): 
    wb = load_workbook(file)
    ws = wb[sheet_name]

    # 追記する行は最終行 + 1
    row_to_append = ws.max_row + 1

    # 指定セルに値を記載                    
    ws.cell(row=row_to_append, column=1, value=word)

    # ファイルを保存
    wb.save(filename=file)

    # 書き込んだ行番号、列番号、追記した値を返す                           
    return (row_to_append, 1, word)

ここで column=1 とは列番号が1番目、すなわち A 列を意味します。

次に、ディレクトリ「ライブラリ」の1つ上の階層に、ジョブフロー「Excel追記」を作成します。

ジョブフロー「Excel追記」

[./ライブラリ/ExcelRW.append_cell:
    '/tmp/test.xlsx',
    'Sheet1',
    'Fukuoka'
] ->
print($RESULT)

これを実行すると以下のように出力されます。

次に先ほど作ったジョブフロー「Excel読み込み」で、cell を ‘A5’ (1列目、5行目) にして実行し、Fukuoka と表示されれば成功です。

アップロードした「test.xlsx」の書き込みパーミッションが不足しているとエラーになるため、エラーになった場合はパーミッションが666に設定されているか確認してください。

ここでは openpyxl の機能の一部を用いて、Kompira Enterprise から Excel ファイルへの読み書きを行う方法をご紹介しました。他にも多くの機能がありますので、ドキュメントなどを参考にして必要なジョブフローを実装してみてください。

なお、Excel ファイル自体は Kompira Enterprise サーバー上のものにアクセスします。リモートサーバーにあるファイルを操作する場合には、必要に応じてファイルを Kompira Enterprise サーバーにマウントしてください。

TOP