主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

IronPython: PythonでExcelマクロ

                
 大量のExcelデータをさばきたいとき、世間でのスタンダードはVBAだ。だけど個人的にWindowsアプリはC#を使っていて、ファイルコピーや削除などの操作はPythonでやってきていて、VBAを使う必要に迫られてこなかった。だからPython書けるならPythonでExcelマクロやっちゃおうと。
参考:http://www.ironpython.info/index.php?title=Interacting_with_Excel
参考と違うところ:コンポーネントオブジェクトモデル(COM)ではなくてグローバルアセンブリキャッシュ(GAC)を使おう

環境: Windows 7(64bit), .NET Framework 4, IronPython 2.7, Office 2007, VS2010

 まずIronPythonのスクリプト上でExcelのワークシートやらセルなどをオブジェクトとして使えるようにするための準備。参考ページで説明しているCOMを使う方法は若干めんどう。
import clr
clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')

 バージョン番号が入ったりキートークンなるものも入ってるので、OSやExcelのバージョンが変わったらこの部分がエラー吐きそう。そもそもCOMのラッパーDLLも用意しなければならんはず。それがCOM。
 そこでGACを使う。GACとは?
”共通言語ランタイムがインストールされている各コンピューターには、グローバル アセンブリ キャッシュと呼ばれる、コンピューター全体にわたって使用されるコード キャッシュがあります。 グローバル アセンブリ キャッシュは、そのコンピューター上の複数のアプリケーションで共有するように指定されたアセンブリを格納します”
http://msdn.microsoft.com/ja-jp/library/yf1d93sz(v=vs.110).aspx
ラッパーDLLの用意とかいらない。ExcelのGACは以下のコードで使えるようになる。
import clr
clr.AddReference("Microsoft.Office.Interop.Excel")

色々めんどそうな名前や番号が外れて、Microsoft.Office.Interop.Excelというわりとシンプルな名前だけになった。ちなみにこれで読み込まれるDLLを調べたところ、VS2010を入れている私の環境ではVS2010のインストールディレクトリ下にあった。

 GACを使ってExcelのもろもろをオブジェクトとして使う準備ができた。あとはスクリプト書くだけ。セルにHello Absurd World!の文字を分解してつっこむスクリプトを書いてみた。ついでに保存もしている。
import System
import clr

clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as Excel

CURRENT_DIR = System.IO.Directory.GetCurrentDirectory()

ex = Excel.ApplicationClass()
ex.Visible = True
ex.DisplayAlerts = False

#workbook = ex.Workbooks.Open('foo.xls')
workbook = ex.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet)
ws = workbook.Worksheets[1]
row = 1
col = 1
for ch in "Hello Absurd World!":
ws.Cells[row, col] = ch
if ch == " ":
row += 1
col = 1
else:
col += 1

ws.SaveAs(CURRENT_DIR + r"\foo.xls")

1407151402468.png
↑をexcel.pyで保存したとして、プロンプトから"[ironpython path]\ipy.exe excel.py"で実行。
Cells[row, col]でワークシート内のセルにアクセスできるが、rowやcolの値は1から。0からではない。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。