BETA

PythonとxlwingsでExcelファイルをいじる

投稿日:2019-05-08
最終更新:2019-09-06
※この記事は外部サイト(https://idontwannawork.github.io/posts/edi...)からのクロス投稿です

概要

xlwingsを利用して、PythonからExcelファイルをいじってみる。

環境

  • Python 3.6
  • xlwings 0.15.3
  • Windows 10

新規でワークブックを作成する

空のワークブックを作成する。

>>> import xlwings as xw  
>>> xb = xw.Book()  
>>> xb.name  
'Book1'  

次の方法でも作成できる。上記の方法は明示的に「ワークブックを作成」するが、こっちの方法はアプリケーション(Excel)を起動しつつ新規ワークブックをアプリケーションに作成させる。スタートメニューなどから単純にExcelを起動した場合、空っぽのファイルを開いた状態でExcelが起動するが、あれの状態をプログラムで再現している感じ。

>>> import xlwings as xw  
>>> app = xw.App()  
>>> app.books[0].name  
'Book1'  

既存のファイルを開く

>>> xw.Book(r'C:\\app\\hoge.xlsx')  

または

>>> app = xw.App()  
>>> app.books.open(r'C:\\app\\hoge.xlsx')  

ファイルを閉じる

すでにオープンしたExcelファイルを閉じる。保存はせず、確認メッセージも出力されない。

>>> xb = xw.Book()  
>>> xb.close()  

ちなみに、このコードはワークブックを閉じるだけなので、Excelのプロセスそのものは残ることに注意。

Excelを閉じる

Excelのプロセスそのものを閉じる場合は、killを利用する。

>>> app = xw.App()  
>>> app.kill()  

セルに値を設定・参照する

.valueを用いて値を設定あるいは参照する。文字列の場合はクオーテーションで囲う。

>>> xb = xw.Book()  
>>> xw.Range((1,1)).value = "hoge"  
>>> xw.Range((1,1)).value  
'hoge'  
>>> xb.sheets(1).range(1,1).value = 1  
>>> xb.sheets(1).range(1,1).value  
1  

任意のセルを基準にして、配列形式で値を設定することもできる。

>>> xb.sheets(1).range(1,1).value = [["hoge", "fuga", "piyo"], [1, 2, 3]]  

上記を実行するとワークシートには下記の状態でデータが格納される。

行列 A列 B列 C列
1行目 hoge fuga piyo
2行目 1 2 3
>>> xb.sheets(1).range(1,1).value  
'hoge'  
>>> xb.sheets(1).range(1,2).value  
'fuga'  
>>> xb.sheets(1).range(2,3).value  
3.0  

なお、App()を使用してインスタンスを生成した場合でも、基本的な考え方は同じ。

>>> app = xw.App()  
>>> app.books[0].sheets[0].range(1,1).value = "hoge"  
>>> app.books[0].sheets[0].range(1,2).value = 1  

なお、Rangeクラスはいろんな指定の仕方があって、行と列を数字で指定する(Excel VBAのcellsみたいな)書き方もできるし、A1とかで指定する書き方も可能。ただし、Rangeクラスを利用して行と列を数字で指定する場合はカッコを2重にする必要がある。また、ぱっと見が似た要素のrange(全部小文字の方)はSheetクラスなのでsheets(1)などでシートを指定しないとエラーになる。

>>> wb = xw.Book()  
>>> xw.Range('A1').value = [[None, 1], [2, 3]]  
>>> xw.Range((1,1)).value = "fuga"  
>>> xw.sheets(1).range(1,1).value = "hoge"  
>>> xw.sheets(1).range("A1").value = "fuga"  
>>> xw.Range(1,1).value = "hoge"    <-- カッコが2重でない  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "C:\app\Continuum\anaconda3\lib\site-packages\xlwings\main.py", line 1005, in __init__  
    raise ValueError("Invalid arguments")  
ValueError: Invalid arguments  
>>> xw.range(1,1).value = "hoge"    <-- シートが指定されていない  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
AttributeError: module 'xlwings' has no attribute 'range'  

セルに計算式を設定・参照する

>>> xb.sheets(1).range(1,3).formula = "=A1+B2"  
>>> xb.sheets(1).range(1,3).formula  
'=A1+B2'  

.formulaを使用すれば計算式の設定および参照が可能。

セルの背景色を設定する

>>> xb.sheets(1).range(1,2).color = (255,0,0)  

RGBで指定する。上記のコードだと背景色が赤になる。

選択されたセルの個数を調べる

>>> xb.sheets(1).range((1,1),(3,3)).count  
9  

.countを利用する。

最終列または最終行を調べる

>>> xs = xb.sheets(1)  
>>> xs.range((1,1),(5,5)).value = "hoge"  
>>> xs.range(1,1).end("down")  
<Range [Book2]Sheet1!$A$5>  
>>> xs.range(1,1).end("right")  
<Range [Book2]Sheet1!$E$1>  

.endを利用する。引き数には'up'、'down'、'right'、'left'のうちいずれかを指定する。Excelでの「CtrlEnd」などの操作と同様の挙動をする。なので、下記のような場合は上手く動作しない。

>>> xs = xb.sheets(1)  
>>> xs.range(1,3).value = 1  
>>> xs.range(1,5).value = 1  
>>> xs.range(1,1).end("right")  
<Range [Book2]Sheet2!$C$1>  

セル「1,5(E1)」に値がセットされているので、本来は.endright方向に最終列を調べるなら「E列」が返ってきてほしいところだが、C列とE列の間のD列は値がセットされていない列なので、「C列までデータがあるよ」としか返ってきてくれない。表形式でデータの欠落がないことが保証されているなら使ってもいいかもしれない。

保存する

>>> wb = xw.Book()  
>>> wb.save()  

あるいは

>>> wb.save(r'C:\\app\\new_file.xlsx')  

とする。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@webmaster909の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!