lisz-works

プログラミングと興味を貴方に

Excel表をpythonで処理! - openpyxlで表を全セル処理する

【スポンサーリンク】

Python ロゴ

PythonでExcelを操作できるライブラリ openpyxl

これで表を全セル処理するロジックを組んでみました。

なにしてくれるのか?

表を全セル処理してくれます。

制約事項

空欄セルが途中で含まれる表は、うまく処理してくれません。

このロジックは、データが空のセルで列端・行端をチェックしているので。

ソース

ソースはコチラです。
基本的にコピペでいけます!

# -*- coding: utf-8 -*-
# author lis
# http://www.lisz-works.com

import openpyxl as xls

FILE_NAME = "data.xlsx"
# Excelの開いているもの情報
book = xls.load_workbook(FILE_NAME, data_only = True)
sheet = None

#-Excel用処理-------------------------------------------
# セル位置の値を取得
def getRefCellValue(ref):
    return sheet[ref].value
def getCellValue(_row=0, _col=0):
    if _row <= 0 or _col <= 0
        return ""
    return sheet.cell(row=_row,column=_col).value

#-実際の処理--------------------------------------------
# 横方向検索
def searchHolizontal(_row=0):
    if _row <= 0:
        return
    # 引数行をA列からサーチ
    col = 1
    cell = getCellValue(_row, col)
    line = ""
    while cell != None:
        line += str(cell) + " "
        # 次の列のセル取得
        col += 1
        cell = getCellValue(_row, col)
    print(line)

# メイン
if __name__ == '__main__':
    sheet = book.get_sheet_by_name("data")
    # A1からA列が空セルになるまで縦にサーチ
    cell = getRefCellValue('A1')
    row = 1
    while cell != None:
        searchHolizontal(row)
        # 次の行のセル取得
        row += 1
        cell = getCellValue(row, 1)

試しにこのまま実行する場合は、下記準備を行って、実行してみてください!

  1. data.xlsxというExcelファイルを用意する
  2. data.xlsxに、「data」という名前のシートを作成する
  3. dataシートに、セルA1から始まる、中身に空データの無い表を作成する

処理の解説

このロジックの概要は

  1. メインでは、A列を縦に空セル発見までループ
  2. 横方向検索関数で、引数の行番号を横に空セル発見までループ

グローバル変数

今回は取扱いを簡素化する為に、ブックとシートの情報をグローバルにしています。

FILE_NAME = "data.xlsx"
# Excelの開いているもの情報
book = xls.load_workbook(FILE_NAME, data_only = True)
sheet = None

セルの値取得関数

getRefCellValueで、引数に渡された参照番号からセルの値を取得して返します。

参照番号は、Excelでセル指定に使う「A1」とかの文字列ですね。
そのまま文字列で渡してあげてください。

def getRefCellValue(ref):
    return sheet[ref].value

行と列を番号で指定したい場合は、getCellValueを使います。

セルA1を、「row = 1, col = 1」として、対象のセルの行列番号を引数で渡してください。

例えば(2,3)と渡した場合、「セルC2」の値を返します。

def getCellValue(_row=0, _col=0):
    if _row <= 0 or _col <= 0
        return ""
    return sheet.cell(row=_row,column=_col).value

始めは変換テーブルを使って、列番号から列のアルファベットを求めていました。
で、それを使ってgetRefCellValueで値を取得……

としていましたが、調べてみたら

sheet.cell(row=_row,column=_col).value

で行列番号で値が取れることが判明(笑)

qiita.com

なのでロジックを変更しました。

もはやgetRefCellValueはいらない気がしなくもない……

メインと横方向検索

メインと横方向検索は、やっていることはほぼ同じです。

  1. while cell != None:で空セルが見つかるまでループ
  2. getRefCellValueでセルの値を取得
  3. 行または列の番号をインクリメント

コレを順々に実行していっているだけです。

あとがき

データがまとまった表であれば、このようなロジックで一気に処理することができます。

クラス化をして更なる楽チンを密かにしておりますので、また後日ご紹介しますー。

openpyxlの初歩的な事を知りたい方は、コチラをどうぞ!

www.lisz-works.com