Kompira

Menu Menu

Enterprise Technical information

外部との連携 Kompira Enterprise で Excel ファイルの読み書きをする

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

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

 


 

動作確認環境

ソフトウェア バージョン
Kompira Enterprise 1.5.5.post11
OS CentOS 7.8.2003
openpyxl 2.6.4

または

ソフトウェア バージョン
Kompira Enterprise 1.6.2.post4
OS CentOS 7.8.2003
openpyxl 3.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

 

※Kompira Enterprise 1.4 系では、以下のように openpyxl をインストールします。

 

$ sudo 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 1.4 系では、 以下のように Python を起動します。

 

$ python

 

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           # 指定されたセルの値を返す

 

ジョブフローの作成

先に作成した「ライブラリ」ディレクトリの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 サーバーにマウントしてください。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携