はじめに
Python と言えば業務自動化/効率化、業務自動化/効率化といえばターゲットは Microsoft Excel、Microsoft Excel と言えば xlwings。というわけで、Python で Excel をごにょごにょしようとすると必ず出てくる xlwings。
オブジェクト構造は VBA と酷似しているので、xlwings だから…ということはほぼ何もないです。困ったら 公式のAPIリファレンス にいけばなんとかなるのですが、いちいち調べてられないというせっかちな人や、ハマりポイントを(自分のために)逆引きメモとして残しておきます。
@m5knt さんが下記の記事でまとめて下さっているのでそちらもどうぞ(記事はちょっと古くなってますが、今でもだいたい使えます)
ニーズがありそうであれば、記事育てていきますが、Qiita 内には xlwings ネタそれほどないですね。
value で取得した値が float だったりとか None だったりとか、初見殺しいっぱいあると思うのだけど。
ハマりポイント
Excel が 2 つ立ちあがってしまう
単にこれのメモを残しておきたかっただけという説。add_book=False
がポイントです。これさえ書いておけば visible は True でも False でも大丈夫。
多分ですが、
アプリ非表示状態にするためには xw.App(visible=False)
と書けば大丈夫と推奨している記事・ブログが多いため、思考停止してこれをコピペしてハマるのではないかと思われる。
上記フレーズを書いただけで空っぽの Excel アプリが立ち上がるので、その後に open
したファイルとあわせて 2 つ立ちあがる事になってしまいます。
import xlwings as xw
app = xw.App(visible=False, add_book=False)
wb = app.books.open("spreadsheet.xlsx"))
ws = wb.sheets[0]
rg = ws.range(1, 1)
rg.value = "TEST VALUE"
下記のスレッドがそのままなのでご参考まで(見ても特に何も収穫はない)。
基本的なオブジェクト構造教えてくれ。3行で。
オブジェクトの基本階層構造は、App -> Book(s) -> Sheet(s) -> Range
です。必ずこの階層構造にならってオブジェクトを生成すべし。
xw.range("A1")
といったどこの Range
なんだか分からなくなる書き方はしない(たいせつ)
import xlwings as xw
# app > wb > ws > rg
app = xw.App(visible=False, add_book=False)
wb = app.books.open("spreadsheet.xlsx"))
ws = wb.sheets[0]
rg = ws.range(1, 1)
rg.value = "TEST VALUE"