2019-08-11

Python3.x - openpyxlのレシピ

openpyxlの使い方をかんたんにまとめます。



openpyxlとは



openpyxlはPythonでExcelファイル(.xlsx, .xlsm)を開き編集をできるライブラリです。ノンプログラマーの方とデータのやり取りをする際に都合がよく、データの入出力がかんたんにでき重宝します。

ここで紹介するのは使い方の基礎となりますが、応用により実用的な活用ができると思います。ぜひご自身の処理に応用いただけましたら幸いです。

 

インストール




pip install openpyxl

openpyxlの読み込み



import openpyxl as exl

Workbookオブジェクトの生成



# 新規のブックの作成
wb = exl.Workbook()

# 既存のワークブックの読み込み
wb = exl.load_workbook('filePath.xlsx')


Worksheetオブジェクトの生成




# ブックオブジェクトの取得(以下省略) 
wb = exl.load_workbook('filePath.xlsx')

# アクティブなシートを取得
ws1 = wb.active

# シート名で読み込む
ws2 = wb['sheetName']


Worksheetの作成



# 右端にシートを作る
ws1 = wb.create_sheet('sheetName1')

# 右から二番目にシートを作る
ws2 = wb.create_sheet('sheetName2', -1)

# 左端にシートを作る
ws3 = wb.create_sheet('sheetName3', 0)






Sheetのタイトル




# 取得
print(ws.title)

# 変更
ws.title = "sheetName"






Sheetの一覧とシート数



sheets = ws.sheetnames
sheetCnt = len(sheets)


Cell単体への入出力



# 行(row)・列(col)の指定
row, col = 2, 3

# 入力
val = ws.cell(row, col).value
val = ws['C2'].value
print(val)

# 出力
ws.cell(row, col, "VALUE")
ws.cell(row, col).value = "VALUE"
ws['C2'].value = "VALUE"

# 入出力
val = ws.cell(row, col, "VALUE").value
print(val)


最終行・列の取得



rowCnt = ws.max_row
colCnt = ws.max_column


行・列によるセル範囲の取得



# 行・列単位でタプルを取得する
rows = ws.rows
cols = ws.cols

# レコードを読み出す
for rec in rows:
print(rec[0].value, ..., rec[n].value)


指定したセル範囲の取得



# レコード範囲の取得 (A2:J11)
minRow, maxRow, minCol, maxCol = 2, 11, 1, 10
for rowCells in ws.iter_cols(minRow, maxRow, minCol, maxCol):
print(rowCells)

# カラム範囲の取得 (A2:E6)
minCol, maxCol, minRow, maxRow = 1, 5, 2 ,6
for colCells in ws.iter_cols(minCol, maxCol, minRow, maxRow):
print(colCells)


指定したセル範囲のタプルを取得できます。行のタプルがほしい場合にはiter.cols,列のタプルが欲しい場合にはiter_colsを使います。

レコードの追加



ws.append(['title', 'URL'])
ws.append(['Yahoo', 'https://yahoo.co.jp'])
ws.append(['google', 'https://google.com'])

# 二次元配列の処理
searchList = [
['title', 'URL'],
['Yahoo', 'https://yahoo.co.jp'],
['google', 'https://google.com']
]
for rec in serchList:
ws.append(rec)

レコード単位であればまとめてレコードを追加できます。


Worksheetを順番に読み出し書き込む



wb = exl.load_workbook('filePath.xlsx')
for i, sheet in enumerate(wb):
sheet.cell(1, 1).value = i

Worksheetのコピー



# OK
wb = exl.load_workbook('filePath.xlsx')
ws = wb['sheetName']
copy = wb.copy_worksheet(ws)

# NG (他のBOOKにコピーできない)
wb1 = exl.load_workbook('filePath.xlsx')
wb2 = exl.Workbook()
ws = wb1['sheetName']
copy = wb2.copy_worksheet(ws)

データ読み込みモード



wb = exl.load_workbook('filePath.xlsx', data_only=True)

通常の場合には値ではなく数式が読み出されます。関数を多用しているシートを扱うときに心強いです。


読み込み専用モード



wb = exl.load_workbook(’filePath.xlsx’, read_only=True)

大容量のデータを読み出すときの負荷に考慮したモードのよう。

書き込み専用モード



wb  = exl. Workbook(write_only=True)


スクレイピングの結果の書き出しに便利そう。

行・列の挿入



# 1行目
ws.insert_rows()

# 4行目
ws.insert_rows(4)

# 8列目
ws.insert_cols(8)

行・列の削除



# 2列目
ws.delete_cols(2)

# 4−7行目
ws.delete_rows(4, 4)

複数の行列の処理をする場合には二番目の引数にオフセットを記入する点で注意が必要。