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)
試しにこのまま実行する場合は、下記準備を行って、実行してみてください!
- data.xlsxというExcelファイルを用意する
- data.xlsxに、「data」という名前のシートを作成する
- dataシートに、セルA1から始まる、中身に空データの無い表を作成する
処理の解説
このロジックの概要は
- メインでは、A列を縦に空セル発見までループ
- 横方向検索関数で、引数の行番号を横に空セル発見までループ
グローバル変数
今回は取扱いを簡素化する為に、ブックとシートの情報をグローバルにしています。
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
で行列番号で値が取れることが判明(笑)
なのでロジックを変更しました。
もはやgetRefCellValueはいらない気がしなくもない……
メインと横方向検索
メインと横方向検索は、やっていることはほぼ同じです。
- while cell != None:で空セルが見つかるまでループ
- getRefCellValueでセルの値を取得
- 行または列の番号をインクリメント
コレを順々に実行していっているだけです。
あとがき
データがまとまった表であれば、このようなロジックで一気に処理することができます。
クラス化をして更なる楽チンを密かにしておりますので、また後日ご紹介しますー。
openpyxlの初歩的な事を知りたい方は、コチラをどうぞ!