bBox 調査編 2
みなさま、おやっとさーです。FileMaker エンジニアの丸山です。
前回、FileMaker の「bBox」プラグインを動作させるための環境構築するところまで書きました。
「bBox」プラグインの中で、エクセルの出力に使えるPythonのライブラリ「XlsxWriter」の確認をしたかったのですが
動かす事が出来ませんでした。
思ったように動かない事は、よくある事です。そんなときは余計にあせってしまいがちです。
あせる気持ちを押させて、そっとグーグル検索をしてみましたが、思うような情報がえられませんでした。
グーグル検索に頼るなんて探偵失格です。
スクリプトの中身でPythonのライブラリ「fm」がインポート出来ていないような感じがするのですが。。
何か情報をお持ちの方がいらっしゃれば、ぜひ教えてください。
今回のブログでは「bBox」プラグインの代わりに、Pythonライブラリ「XlsxWriter」を使ってエクセルにグラフを作れたので、
そちらを簡単にご報告したいと思います。
目次
「XlsxWriter」ってなに?
XlsxWriterは、エクセルファイルへの書き込みが出来るPythonのモジュールです。
エクセルファイル内の複数のワークシートへのテキスト、数値、数式、およびハイパーリンクを書き込むことができます。
代表的な機能です
・数式の操作
・日付と時刻の操作
・色の操作
・チャートの操作
・オブジェクトポジショニングの操作
・オートフィルターの操作
・条件付き書式の操作
・ワークシートテーブルの操作
・テキストボックスの操作
・セルコメントの操作
・VBAマクロの操作
FileMaker を使用してエクセルにエクスポートしたとき書式設定、数式、グラフなどを制御する事はできません。
このライブラリを使用する事で制御する事が可能になります。
「Python」をインストールする
①Pythonをダウンロードします。https://www.python.org/downloads/
②中央の「Download」ボタンを押します。
③ダウンロードしたPythonのインストーラのアイコンをダブルクリックします。
④インストーラの画面に表示される手順に沿ってインストールします。
※「Add Python 3.10 to PATH」にチェックが入っている事を確認します。
XlsxWriterのインストール
① Windowsのコマンドプロンプトから以下を入力しEnterキーを押します。
pip install XlsxWriter
FileMakerからXlsxWriterを実行する方法
Pythonのソースはテキストフィールドに入力しています。
テキストフィールドに入力されたプログラムソースを書き出して、スクリプトステップの「eventを送信」で
実行させているもので、いたってシンプルです。
ただ、オブジェクトフィールドを使って文字コード、改行コードを変換しないとエラーになります。
テキストからオブジェクトフィールドに入れるときにTextEncode ( ソースコード; “utf-8” ; 3 ) で変換すればOKです。
実際のスクリプトステップはこんな感じです。
プログラムソースの説明
#エクセル出力用のモジュールを読み込んでいます。
import xlsxwriter
#データ用配列にデータを指定しています。日付、気温、売上の記録が積み重なっています。
data = [
["日付","最高気温","売上金額"],
["2022/05/01","20","12000000"],
["2022/05/02","23","14000000"],
["2022/05/03","25","15000000"],
["2022/05/04","23","16000000"],
["2022/05/05","24","15000000"],
["2022/05/06","18","11000000"],
["2022/05/07","19","11000000"],
["2022/05/08","22","13000000"],
["2022/05/09","21","12000000"],
["2022/05/10","20","11000000"]
]
#配列の長さを取得しています。
len_row = len(data)
len_col = len(data[0])
#エクセルのワークブックを作成しています。
workbook = xlsxwriter.Workbook("C:\PythonWork/グラフサンプル.xlsx")
#項目用見出しスタイルの設定です。境界線の太さ、背景色、文字の横位置を指定しています。
fmt_head = workbook.add_format({'border': 2})
fmt_head.set_bg_color('#CCCCFF')
fmt_head.set_align('center')
#データの表示設定です。境界線の太さ、文字の横位置を指定しています。
fmt_body = workbook.add_format({'border': 1})
fmt_body.set_align('center')
#数字データの表示設定です。境界線の太さ、文字の横位置、位取りを指定しています。
fmt_kingaku = workbook.add_format({'border': 1})
fmt_kingaku.set_align('center')
fmt_kingaku.set_num_format('#,##0')
#ワークシートを作成しています。
worksheet = workbook.add_worksheet("グラフ")
#繰り返し文を使用して、データをセルに入力しています。
#if分により、設定するフォーマットをかえています。
for row_i in range(len_row):
for col_i in range(len_col):
if row_i == 0:
worksheet.write(row_i+2, col_i+2, data[row_i][col_i], fmt_head)
elif col_i == 1:
worksheet.write_number(row_i+2, col_i+2, int(data[row_i][col_i]), fmt_kingaku)
elif col_i == 2:
worksheet.write_number(row_i+2, col_i+2, int(data[row_i][col_i]), fmt_kingaku)
else:
worksheet.write(row_i+2, col_i+2, data[row_i][col_i], fmt_body)
#列幅の設定を指定しています。
worksheet.set_column(0,0, 5)
worksheet.set_column(1,1, 5)
for col_i in range(len_col):
worksheet.set_column(col_i+2, col_i+2, 15)
#Excel関数の埋め込みをしています。平均と合計を設定しています。
worksheet.write(13,3, '=AVERAGE(D4:D13)',fmt_body)
worksheet.write(13,4, '=SUM(E4:E13)',fmt_kingaku)
#折れ線グラフを作成しています
chart = workbook.add_chart({'type': 'line'})
#グラフの項目とデータの位置を指定しています。
chart.add_series({
'name': '=グラフ!$D$3',
'values': '=グラフ!$D$4:$D$13',
'y2_axis': 1,
})
#二個目のグラフの項目とデータの位置を指定しています。
chart.add_series({
'name': '=グラフ!$E$3',
'values': '=グラフ!$E$4:$E$13',
})
#グラフをシートに展開しています。
worksheet.insert_chart('G3', chart)
#ワークブックを閉じています。
workbook.close()
こんな感じでエクセルが作成されます。
まとめ
FileMaker からPythonのプログラムが実行できるのがわかりました。
今回検証したXlsxWriterモジュールは出力しか対応していないので出力されたエクセルを編集する事は出来ませんが、
プログラムソースを工夫する事により、色んな出力に対応する事ができると思います。
また、編集に対応しているモジュールもあるので、用途に合ったモジュールを試してみてはどうでしょうか。
参考
1. Pythonインストーラ
https://www.python.org/downloads/
■環境情報
Windows 10 Pro