xlwings はPythonからExcelを操作できるフリーライセンスのライブラリです。
一部機能はプロ版(xlwings PRO)でないと利用できませんが、データ更新やJupyter Notebookとの連携などの基本的な機能は無料で開発できます。
今回は基本的な使い方の確認です。range()
の使い方、リストやDataFrameのデータをExcelに反映する方法を解説しています。
結論
行列データのうち、1次元のリストは列方向に入力されます。
sheet.range('A1').value = [1, 2, 3, 4, 5]
2次元リストでは、各行が入れ子になったリストで表されます。
そのため、行方向にデータ入力するには、2次元リストで次のように表現します。
sheet.range('A1').value = [[1], [2], [3], [4], [5]]
実行環境
Windows 10 Pro
Office Excel 2019
$ python --version
Python 3.9.4
$ pip freeze | find "xlwings"
xlwings==0.20.5
複数データの更新(リスト)
データを更新(入力)するにはrange()
で入力範囲を選択し、value
に設定します。
横(列)方向にデータ入力するなら1次元リストを設定するだけです。
データをvalue
で取得する場合も1次元リストが返されます。
# 横(列)方向
sheet.range('A2').value = [1, 2, 3, 4, 5]
print(sheet.range('A2:E2').value)
# [1.0, 2.0, 3.0, 4.0, 5.0]
2次元リストでは、各行が入れ子になったリストに対応します。
タテ(行) 方向にデータ入力するときは、次のように2次元リストで入れ子の形にします。
ここで注意なのですが、value
でそのまま取得すると、列方向の場合と同様に1次元リストが返されます。方向の情報を維持してデータを取得する方法は後述します。
# タテ(行) 方向
sheet.range('A3').value = [[1], [2], [3], [4], [5]]
print(sheet.range('A3:A7').value)
# [1.0, 2.0, 3.0, 4.0, 5.0]
1次元リストを入れ子の形に変換するには例えばリスト内包表記で次のようにします。
l = [1, 2, 3, 4, 5]
col = [[s] for s in l]
print(col)
# [[1], [2], [3], [4], [5]]
縦と横の特定範囲を更新する場合も、次のように2次元リストを設定すればOKです。
# タテヨコ同時(2 x 2の範囲のデータ)
sheet.range('C4').value = [['foo', 'bar'], ['abc', 1999]]
print(sheet.range('C4:D5').value)
# [['foo', 'bar'], ['abc', 1999.0]]
方向の情報を維持してデータを取得する
デフォルトでは range()
で行方向を指定しても、value
でデータを取得すると1次元リストになります。
縦と横の方向の情報を維持してデータを取得するには、2次元リストとして読み込みます。range()
の option()
に ndim=2
を指定します。
# 横(列)方向
sheet.range('A2').value = [1, 2, 3, 4, 5]
c = sheet.range('A2:E2').options(ndim=2).value
print(c)
# [[1.0, 2.0, 3.0, 4.0, 5.0]]
# タテ(行) 方向
sheet.range('A3').value = [[1], [2], [3], [4], [5]]
r = sheet.range('A3:A7').options(ndim=2).value
print(r)
# [[1.0], [2.0], [3.0], [4.0], [5.0]]
今回参考にしたページ・資料