PythonからExcelの自動操作をしたりExcelからPythonを呼び出したりしています。
VBAだとシートの情報を呼び出してもそこまで重いと感じることはありません。
xlwingsさんはとても優秀なのですが、VBAのように都度API経由でセル情報をやりとりするのはかなり重たくなってしまいます。
そこでリストのリスト(俗に言う多次元リスト)にして操作するということをよくしてます。
例
こんなExcelシートがあったとします。
第1引数に該当シートオブジェクトをしていただくことでリストにする関数
列を基準にリストにした多次元リストになります。
all_col(sheet)
[['A1', 'A2', 'A3', 'A4'],
['B1', 'B2', 'B3', 'B4'],
['C1', 'C2', 'C3', 'C4']]
行を基準にリストにした多次元リストになります。
all_row(sheet)
[['A1', 'B1', 'C1'],
['A2', 'B2', 'C2'],
['A3', 'B3', 'C3'],
['A4', 'B4', 'C4']]
第2引数、第3引数を入れていただくことで範囲を絞ることも可能です。
コード
import xlwings as xw
# 数値をアルファベットに変換する
def num2A(num):
if num <= 26:
return chr(64 + num)
elif num % 26 == 0:
return num2A(num // 26 - 1) + chr(90)
else:
return num2A(num // 26) + chr(64 + num % 26)
# 1行目の最大列を取得して、1行目の最大列とその全ての列から最大行を返す
def last(sheet):
last_col = sheet.range(1, sheet.cells.last_cell.column).end('left').column
last_row = 1
for i in range(last_col + 1)[1:]:
max_row = sheet.range(sheet.cells.last_cell.row, i).end('up').row
if max_row > last_row:
last_row = max_row
return last_col,last_row
# 最大行と最大列、列基準のリストを返す(縦向きのリスト)
def all_col(sheet, colstart : int = 0, colend : int = 0):
last_col, last_row= last(sheet)
if colend == 0:
colend = last_col
list_all : list = []
for col in range(int(last_col))[colstart:colend]:
strcol = num2A(col + 1)
list_all.append(sheet.range(strcol +'1:'+ strcol + str(last_row)).value)
return last_col, last_row, list_all
# 最大行と最大列、行基準のリストを返す(横向きのリスト)
def all_row(sheet, rowstart : int = 0, rowend : int = 0):
last_col, last_row= last(sheet)
if rowend == 0:
rowend = last_row
strlastcol = num2A(last_col)
list_all : list = []
for row in range(int(last_row))[rowstart:rowend]:
list_all.append(sheet.range('A'+ str(row + 1) + ':' + str(strlastcol) + str(row + 1)).value)
return last_col, last_row, list_all
もっと楽にセルの値をごにょごにょできる方法があったら教えてください_(┐「ε:)_
Dataframeにした方が楽なことも多いので適材適所でお願いします_(┐「ε:)_
数値をアルファベットに変換するところはこちらの記事を参考にさせていただきました、ありがとうございます!
PythonでのExcel自動操作やブラウザ自動化についてツイートしていますので
よかったらTwitterもフォローお願いします\(^o^)/
https://twitter.com/tbshiki