lisz-works

技術系だけど関係ないこと多い系ブログ

Python Excel操作用クラスを作ってみた@openpyxl

【スポンサーリンク】

Python ロゴ

PythonでExcelを操作するライブラリ、「openpyxl」。

コレを取扱いを楽にする為のクラスを作ってみました。

コード

コードはgithubにアップしました!

github.com

クラスメンバとメソッドの概要は、readmeに記載しました。

ざっくりとした構成

ざっくりと解説すると、下記のようなメソッドを用意してみました。

  • 初期化
  • ブック/シートを開く
  • シートの作成
  • シートの存在チェック
  • ブック/シート開いているか判定
  • 空セル判定
  • 全データ読込(テーブル読込)
  • 横方向への書き込み
  • 保存

デバッグプリントのコメントアウトや「あれ?これないの?」みたいな機能が多々あるかもしれません。

自分用に作っていたというのが大きいので……

でもコレを作って割と便利になりました。

何が便利なの?

ではこんなことして具体的に何が便利なのか?

オブジェクト管理がいらない

まず「オブジェクト管理がいらない」という点です。

実直に使用すると

import openpyxl as xl

# ブックを開く
bookName = "data.xlsx"
book = xl.load_workbook(bookName, data_only=True)
# シートを開く
sheet = self.book.get_sheet_by_name(sheetName)
# セルを読み込む
val = sheet.cell(row=1, column=1).value
# セルに書き込む
sheet.cell(row=2, column=1).value = val
# ブックを保存
book.save(self.bookName)

のようにbook/sheetのオブジェクトを絡めた記述を、都度書かないといけません。

が、コレを使えばコールするだけ。

やってることは違うけどこんな感じ。

from Xls import Xls

# ブックとシートを開く
xl = Xls("data.xlsx", "data")
# セルを表ごと読み込む
xl.loadAllData(1, 1)
# 読み込んだデータを取得
data = xl.data

インスタンス生成時に、引数でファイル名・シート名を渡してあげれば準備完了となります。

大したことないかもしれないけど、それがなんだか面倒くさくて。

表を読込むメソッド

表を読込むメソッド。

loadAllData(行番号, 列番号)

こんな感じで使います。

xl = Xls("data.xlsx", "data")
xl.loadAllData(1, 1)
data = xl.data  # [['A1', 'B1', 'C1', 'D1'], ['A2', 'B2', 'C2', 'D2'], ['A3', 'B3', 'C3', 'D3']]

A1からズラッとデータが並んでいるとします。

読み込む表

この関数で読み込むと、2次元配列で、各行ごとに配列化されたデータを取得できます。

[
  ['A1', 'B1', 'C1', 'D1'],
  ['A2', 'B2', 'C2', 'D2'],
  ['A3', 'B3', 'C3', 'D3']
]

取得を開始するセルは、引数で(行, 列)を指定できます。

横方向に一気に書込む

横方向に配列のデータを、一気に書込むメソッド。

writeHorizontal(データ配列, 行番号, 列番号)

こんな感じで使います。

x = Xls("data.xlsx", "data")

vals = ["A", "B", "C", "D"]
x.writeHorizontal(vals, 5, 1)
x.save()

すると、5行目のA列目から横に"A"~"D"が書かれていますね。

書き込み結果

配列につっこんだ大量のデータを、ループで1行ずつ一気に書込むことができます!

ちなみに、最終的に「saveメソッド」は忘れずにコールしてくださいね。
変更が反映されない状態で終わってしまうので……(笑)

値の読込

単純に1セルの値を読込たい時は「getCellValue」をコールします。

getCellValue(行番号, 列番号)

あとがき

自分にとっての便利を求めた感があるので、人が使いやすいかはわかりませんが、いいなと思ったらご活用くださいませ。