Kompira

Menu Menu

Enterprise Technical information

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

Pythonで記述された処理をKompiraから呼び出す」という記事では、KompiraジョブフローからPythonコードを呼び出す方法を解説しました。今回の記事ではExcelファイルを扱うPythonライブラリを利用して、データの読み書きを行います。 Excelファイルを扱えるPythonライブラリはいくつか存在しますが、今回はopenpyxlを利用します。 openpyxlには多くの機能が用意されているため、知識のある方はセルの範囲指定や表示フォーマット、色指定など多くの機能を利用できると思いますのでチャレンジしてみてください。(なお、本記事はPython 2.6.6、openpyxl 2.4.0のバージョンで動作確認しております。)   Excelファイルの用意 ここではKompiraサーバーの/tmpにtest.xlsx をアップロードします。 この際に’kompira’アカウントから操作できるように、ファイルのパーミッションを 0666 に設定してください。 このファイルには以下のような値が書き込まれているとします。   Excelシート   openpyxlのインストール まずKompiraサーバーでopenpyxlが利用できるようにインストールします。ここではPythonのpipコマンド(pythonのパッケージ管理ツール)を利用してインストールします。  
$ sudo pip install openpyxl
Collecting openpyxl
  Downloading openpyxl-2.4.0.tar.gz (153kB)
    100% |████████████████████████████████| 153kB 228kB/s 
Collecting jdcal (from openpyxl)
  Downloading jdcal-1.3.tar.gz
Collecting et_xmlfile (from openpyxl)
  Downloading et_xmlfile-1.0.1.tar.gz
Installing collected packages: jdcal, et-xmlfile, openpyxl
  Running setup.py install for jdcal ... done
  Running setup.py install for et-xmlfile ... done
  Running setup.py install for openpyxl ... done
Successfully installed et-xmlfile-1.0.1 jdcal-1.3 openpyxl-2.4.0
(追記) Kompira1.5以降では、以下のようにパッケージをインストールします。
$sudo /opt/kompira/bin/pip install openpyxl
続いて動作確認をしてみます。Pythonをコマンドラインで実行してみます。>>> に続いてPythonのコマンドを入力していきます。 Excelに記載されている文字列が表示されればOKです。(以下の例では’A1’に記載されている’tokyo’)
$ python
Python 2.6.6 (r266:84292, Jul 23 2015, 15:22:56) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux2
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
>>> 
(Ctrl+Dで抜ける)
(追記) Kompira1.5以降では、以下のように確認します。
$ /opt/kompira/bin/python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
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
>>> 
(Ctrl+Dで抜ける)
Kompiraライブラリの作成 上記の動作確認の際に使った関数を利用して、Kompiraのライブラリを作ってみましょう。 ここではディレクトリ”ライブラリ”を作成し、その中に”ExcelRW”というライブラリを作成します。 ここで入力するPythonコードは以下の通りです。 ライブラリ「ExcelRW」  
from openpyxl import load_workbook

def get_cell_value( filename, sheet_name, cell ): # 引数はExcelファイル名、シート名、セル番号
  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’が表示されれば成功です。
tokyo
このままですと、実行時にセル番号の変更のたびにジョブフローの編集が必要になるので、セル位置をパラメータにします。 ジョブフローを次のように変更します。 ジョブフロー「Excel読み込み」
|cell = 'A1'|
[./ライブラリ/ExcelRW.get_cell_value: '/tmp/test.xlsx', 'Sheet1', cell]
-> print($RESULT)
パラメータの利用 変数を | | で囲うとパラメータとして設定されます。(‘=’ 以降の値はデフォルト値) ジョブフローの実行時に、パラメータのcellの欄にセル番号を文字列で指定できるようになりました。指定する際には’B2’のようにセル番号を’ ‘で囲ってください。 Excelファイルへの追記 Excelファイルにデータを書き込もうとする場合には、何らかの処理結果の記録を残すようなユースケースが考えられます。続いて、指定された文字列をA列の一番最後の行に追記する方法をご紹介します。 一番最後の行の番号は指定のワークシートの”max_row”で取得できます。 まずはライブラリ”ExcelRW”に次の関数”append_cell”を追記します。 ライブラリ「ExcelRW」その2
def append_cell( file, sheet_name, word ): # 引数は、ファイル名、シート名、追記する値
    wb = load_workbook(file)
    ws = wb[sheet_name]
    row_to_append = ws.max_row+1                     # 追記する行は最終行+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)
これを実行すると以下のように出力されます。  
[5, 1, 'Fukuoka']
先に作ったジョブフロー”Excel読み込み”で、セルを”A5″(1列、5行目)にして実行すると’Fukuoka’と表示されれば成功です。(先にアップロードした’text.xlsx’のパーミッションで書き込みパーミッションが不足しているとエラーになります。666に設定されているか確認してください。)   ここではopenpyxlの機能の一部を用いて、KompiraからExcelファイルへの読み書きの方法をご紹介しました。他にも多くの機能がありますのでドキュメントなどを参考にして、必要な関数を実装してみてください。 なお、Excelファイル自体はKompiraサーバー上のものにアクセスします。ファイルサーバーのようなリモートサーバーにあるファイルを操作する場合には、必要に応じてフォルダKompiraサーバーにマウントしてください。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携