1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

xlwingsでシートを丸ごとリストのリストにする関数作ってみた

Last updated at Posted at 2022-03-03

PythonからExcelの自動操作をしたりExcelからPythonを呼び出したりしています。

VBAだとシートの情報を呼び出してもそこまで重いと感じることはありません。
xlwingsさんはとても優秀なのですが、VBAのように都度API経由でセル情報をやりとりするのはかなり重たくなってしまいます。

そこでリストのリスト(俗に言う多次元リスト)にして操作するということをよくしてます。

image.png

こんな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引数を入れていただくことで範囲を絞ることも可能です。

コード

test.py

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

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?