はじめに
追記:この記事を作ってから気づいたのですが処理が遅いです…。あとスクリプトが走っている途中でExcelを触ると処理が止まります。0(:3 )〜 ('、3」 ∠ )
xlwingsの紹介程度で
会社の評価業務で大量のデータをグラフ化しなければならいことは良くあると思います。どんな形式のグラフでも良い場合は問題ないと思いますが、Excelで作らなければならない場面もあると思います。前まではグラフを事前に作ったExcelのテンプレートに評価データをテキストエディタで開いてCtrl+C、Ctrl+Vしまくっていたのですが、限界が来たのでスクリプトを組みました。下の方で自分が作った環境とスクリプトの説明を載せます。きっと改造したいと思う人がいると思うので参考にしてください。
環境
今回はPythonで組んでいます(私がVBを知らないだけです)。PythonでExcelを操作出来るライブラリは色々ありますが、殆どのライブラリはOpenするとグラフ情報が消失してしまいます。今回使っているxlwingsはグラフ情報が消えないので採用しました。
今回使用した環境は以下の通りです。
- Windows10
- Python 3.5.1
- xlwings 0.11.4
- pywin32 221
Pythonが3.6以上ではないのはwin32api関係のエラーを自分が解決出来なかったからです。3.5ならエラーが出なかったので今回はこれで作成しました。xlwingsの導入はpipで問題ないのでpipで入れます。
参考:xlwings公式の解説ページ
pip install xlwings
これだけ良いと思っていたのですがこれだけではエラーが出るのでpywin32を入れます。自分はここから取ってきました。ここの221のpywin32-221.win-amd64-py3.5.exeを落とします(各自Pythonのバージョンのものを落とす)。落としたら以下のコマンドで入れます。
easy_install pywin32-221.win-amd64-py3.5.exe
環境は以上で整います。この方法を3.6で実行するとなぜかうまく出来ませんでした。
実行コード
上記の環境でこれが動くようになると思います。
import xlwings as xw
import sys
args = sys.argv
xls_file = args[1]
out_file = args[2]
file_list = args[3]
#Write Excel
wb = xw.Book(xls_file)
for line_data in open(file_list, "r"):
if line_data[0] == "#":
continue
split_line_data = line_data.split()
sheets = split_line_data[1]
offset_x = int(split_line_data[2]) + 1
offset_y = int(split_line_data[3]) + 1
y = 0
for text_data in open(split_line_data[0], "r"):
data = text_data.split()
wb.sheets[sheets].range(offset_y + y, offset_x).value = data
y += 1
#Save Excel
wb.save(out_file)
コード変だぞって声が聞こえて来そうですが許してください。あと自分仕様になっています。このコードでは実行するのに引数が3つあり、Excelテンプレートと出力Excel名とファイルリストが必要になっています。
##Excelテンプレート
下の画像のようにグラフのエリアを設定しデータを空にしたExcelテンプレートを作成します(空じゃなくても上書きされるだけです)。評価項目が事前に決まっていれば、グラフの書式が決まっていると思うのでそれで作っておきます。ここで業務で指定されているグラフ書式を使いまわすことが出来ます。グラフだけではなくExcelの関数とかも事前に入れることが出来るのでSUMとかAVERAGEとかSTDEVとか評価に必要なものも組んでおくと捗ります。
template.xls
ファイルリストの書式
#data path sheet-name offsetX offsetY
./data/data1.txt Sheet1 0 0
./data/data2.txt Sheet2 0 0
./data/data1.txt Sheet3 0 0
./data/data2.txt Sheet3 7 0
- data path
- 貼り付けたいデータの相対パスか絶対パス
- sheet name
- Excelのテンプレートシート名
- offsetX
- 貼り付けたいデータのX始点
- offsetY
- 貼り付けたいデータのY始点
テキストデータ
テキストデータは、空白かカンマ区切りなどで認識すると思います。
* 10 20 30 40 50
A 1 2 3 4 5
B 6 7 8 9 10
C 11 12 13 14 15
D 16 17 18 19 20
E 21 22 23 24 25
実行例
上で説明したデータを用意して以下のコマンドを入力すると
python xls-paste.py template.xls out.xls file_list.txt
こんな感じでデータが貼り付けられグラフが出来ていると思います。入力テキストデータのファイル名前が変わらなければデータを差し替えて実行すれば一瞬でグラフが完成します。さらにこのコマンドをbatで組んで複数のテンプレートとファイルリストを用意して…って感じで全部自動でやってしまいましょう。
おわりに
これのスクリプトを作るのにだいたい4時間くらいかかっています(ほぼ環境を作っている時間)。業務でCtrl+C、Ctrl+Vしていた時間は16時間くらい(データ処理しながら)ですので機能としてしょぼくても大体スクリプト化した方が良かったりします。それにこれ以降にも同じ業務が来る可能性もあります…なので色々なスクリプト術を習得して損はないと思います。**GitHub**にも公開しておきますので参考になれば幸いです。