はじめに
openpyxl と xlwings のどちらかを採用する時の判断とか、一方に慣れている人がもう片方主体のスクリプトを読む手助けとなる為や事務手作りファイルを読み込む処理でよく使う API を纏めました。 自身の書いたスクリプトのメンテナンスは将来のメンテナーに対し後はよろしくって形に持っていく資料で御座います。 にゃーん
使ったのは openpylx 2.5.0, xlwings 0.11.7 辺り
ライブラリの特徴
openpyxl https://openpyxl.readthedocs.io/
|
xlwings https://www.xlwings.org/
|
Excel 不要 |
必要 |
早い |
遅い |
Excel のバグを踏まない |
バグも互換 |
同名ブック処理に問題なし |
片側は読み込み専用 |
自己書き換えマクロ化が不能 |
可能 |
xlsx/xlsm が扱える |
Excel が扱えるもの全て |
ブックを超えたシートのコピーが出来ない |
制限は Excel に準じる |
セル式計算は簡易的 |
完全 |
結合セルの罫線が崩れる 1
|
完全 |
API が VBA と遠い |
近い(実質同じ) |
Range が無い、セルのタプルで扱う |
有る |
PythonからのVBAの実行が不能 |
可能 |
略称の凡例
略称 |
名称 |
内容 |
|
|
|
px |
openpyxl |
|
xw |
xlwings |
|
|
|
|
apps |
Applications |
アプリケーションコレクション |
app |
Application |
アプリケーション |
wbs |
Workbooks |
ワークブックコレクション |
wb |
Workbook |
ワークブック |
wss |
Worksheets |
ワークシートコレクション |
ws |
Worksheet |
ワークシート |
rng |
Range |
範囲 |
c |
Range |
単一セル |
API
Workbook
Worksheets
Worksheet
Range
openpyxl |
xlwings |
内容 |
|
|
|
px.cell.cell.Cell |
xw.main.Range |
単一セルの型 |
2次元タプル |
xw.main.Range |
矩形範囲の型 Range 型相当 |
|
|
|
c.value |
rng.value |
値 |
c.value |
rng.formula |
式 |
c.coordinate |
|
相対アドレス |
|
rng.address |
絶対アドレス |
c.row_idx |
rng.row |
行 |
c.col_idx |
rng.column |
列 |
c2 = c.offset(行, 列) |
rng2 = rng.offset(行, 列) |
相対位置の新インスタンスを返す |
- xlwings は範囲を一度に処理可能であるが openpyxl ではタプルを手繰りセルを操作する必要がある。
Names Name
名前付き範囲は こちら を参照
型
表示形式 |
文字列 |
数値 |
通貨 |
会計 |
値 |
1 |
1~ |
1~ |
1~ |
openpyxl |
str |
int/float |
int/float |
int/float |
xlwings |
str |
float |
decimal.Decimal |
decimal.Decimal |
表示形式 |
日付 |
日時 |
時刻 |
値 |
2001/1/1 |
2001/1/1 10:00:00 |
10:00:00 |
openpyxl |
datetime.datetime |
datetime.datetime |
datetime.time |
xlwings |
datetime.datetime |
datetime.datetime |
datetime.datetime |
サンプル
openpyxlサンプル
# ブックを開く
wb = px.load_workbook('book.xlsx', data_only=True) # cell.value が値になる
ws = wb['Sheet1']
# 使用範囲の値(tuple)を取得して出力
print(tuple(ws.values))
# セルを行毎に得て値を出力
for row in ws.rows:
print([c.value for c in row])
# テーブル情報
tbl = [t for t in ws._tables if t.name == 'テーブル'][0]
cells = ws[tbl.ref]
# テーブルタイトルを取得して出力
print([c.value for c in cells[0]])
# テーブル内容を取得して出力
print([[c.value for c in row] for row in cells[1:]])
# ブックを閉じる
wb.close()
xlwingsサンプル
# 新規Excelインスタンスでブックを開く
app = xw.App()
wb = app.books.open('book.xlsx')
# シートを得る
wss = wb.sheets
ws = wss['Sheet1']
# 使用範囲
u = ws.api.UsedRange
r = u.Row + u.Rows.Count - 1
c = u.Column + u.Columns.Count - 1
rng = ws.range((1, 1), (r, c))
# 使用範囲の値(list)を取得して出力
print(rng.value)
# 行毎の範囲を得て値を出力 (値のみなら rng.value が速い)
for row in rng.rows:
print([c.value for c in row])
# テーブル内容の範囲
rng = ws['テーブル']
# テーブルタイトルを取得して出力
print(rng.rows[0].offset(-1, 0).value)
# テーブル内容を取得して出力
print(rng.value)
# ブックを閉じる
wb.close()
# Excelインスタンスを閉じる
app.quit()
注釈