xlwingsを利用して、PythonからExcelファイルをいじってみます。下記の例はインタプリタですが、*.py
形式のファイルでも同様に利用できます。
注意点として、xlwingsはExcelがインストールされている必要があります。そのため、WindowsかmacOSでないと動作しません。一応、Linuxでなんとかしたい先行者がいるようですが、自分は試していません_( _´ω`)_ペショ
空のワークブックを作成します。
>>> 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のプロセスそのものを閉じる場合は、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
逆に指定した範囲のデータを参照することもできます。
>>> xb.sheets(1).range((1,1), (2,3)).value
[['hoge', 'fuga', 'piyo'], [1.0, 2.0, 3.0]]
>>> xb.sheets(1).range("A1:C2").value
[['hoge', 'fuga', 'piyo'], [1.0, 2.0, 3.0]]
>>> xb.sheets(1).range("A1:B3").value
[['hoge', 'fuga'], [1.0, 2.0], [None, None]]
選択した範囲にデータが存在しない場合は、上記のとおりNone
表示になります。
なお、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での「Ctrl
+End
」などの操作と同様の挙動をします。なので、下記のような場合は上手く動作しません。
>>> 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)」に値がセットされているので、本来は.end
でright
方向に最終列を調べるなら「E列」が返ってきてほしいところですが、C列とE列の間のD列は値がセットされていない列なので、「C列までデータがあるよ」としか返ってきてくれません。表形式ですべてのセルにデータの欠落のないことが保証されているなら、使ってもいいかもしれない。
>>> wb = xw.Book()
>>> wb.save()
あるいは
>>> wb.save(r'C:\\app\\new_file.xlsx')
とします。