はじめに
なんやかんや言ってもエクセルを使う場面って多い。
そして、見せる資料としても、チェックする資料としても活躍の場が多い。
なので、エクセルに書き込んで、体裁を整えるためのチートとして活用していただければ!
と思ったけど、なかなか深い。うん、深い。
なので、うす〜く、さらっとopenpyxlを理解したいと思います。
ざっぱに、今回の内容はこんな感じ
- ファイルの読み込みから保存
- openpyxlでエクセルを操作するための準備
- セルの値の取得
- 行番号とカラムの取得
- いったん、ここいらで中締め
まずはここまで。
環境
MacBookAir 2020 M1
python=3.10.8
openpyxl=3.1.2
インストールはpip install openpyxl
で!
あんまり関係ないわな。
openpyxl
言わずと知れたopenpyxlのドキュメントがこちら。正直、よくわからん。マジでわからん。
なので僕なりに整理した順に追っていく。
ファイルの読み込みから保存
面倒なんで、シートの読み取りもしくはシートの作成、保存までやちゃいましょう。
- 既存のエクセルファイルを読み取って、既存のシートの読み込み
import openpyxl
workbook = openpyxl.load_file('ファイル名')
worksheet = workbook['Sheet1']
workbook.save('ファイルパス')
- 新しくopenpyxlのインスタンスを作って、新しいシートの作成
from openpyxl import Workbook
workbook = Workbook()
worksheet = workbook.create_sheet('created_sheet', 0)
workbook.save('ファイルパス')
create_sheet
の引数の0は0番目の順番の位置にシートを作る。だからなくてもOK。
この辺はチュートリアルに書いてある
https://openpyxl.readthedocs.io/en/stable/tutorial.html
openpyxlでエクセルを操作するための準備
こんなエクセルを作りました。ファイル名は`test.xlsx`、シート名は`Sheet1`
こいつを操作というか、読み取ることから確認していきましょうね。
まずは読み込み
import openpyxl
workbook = openpyxl.load_file('./test.xlsx')
worksheet = workbook['Sheet1']
シートのの行列数の取得方法
- 行数の取得
max_row = worksheet.max_row
print(max_row)
出力は4
worksheetにmax_rowを渡してあげると入力されたセル数が取れる。こうなるとcolumn側もわかるよね。
- 列数の取得
max_col = worksheet.max_column
print(max_col)
出力は4
はい、想像つきましたね。はい。
あ、縦横で入力セル数を変えればよかった。
ではどんどんいきます。
セルの値の取得
エクセル座標とindex座標
エクセルの座標で指示する方法と、リストのようにインデックスで指定する方法があります。
- エクセル座標の指定方法
print(worksheet['A1'])
print(worksheet['A1'].value)
出力は
<Cell 'Sheet1'.A1>
1-1
わかりますねー。
worksheet['A1']
でセルのインスタンスが取れて、それにvalue
を渡すと中の値が取れます。
- インデックスで指定する方法
print(worksheet.cell(row=1, column=1))
print(worksheet.cell(row=1, column=1).value)
出力は全く同じ。つまり、どっちの方法でもOK。
<Cell 'Sheet1'.A1>
1-1
じゃ、行ごと、列ごとの取得は?
- 列の取得
print(worksheet['A'])
出力
(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>)
タブルで全てのセルが帰ってきます。for文で回してあげれば値も取得できますね。
ですが、worksheet['A'].value
はだめ。タプルにvalue
は使えませんよとエラーが返ってきます。
ちなみにworksheet.cell(column=1)
をしてもrowの値がないぞとエラーが出ます。
- 行の取得
print(worksheet[1])
出力
(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>, <Cell 'Sheet1'.D1>)
はい、行ごと取れましたね。
これも列ごとと同じパターンの模様。
じゃ、ここからセルに入力していこう
値を入力
値の入力はこのあたりに書いてある。一括でデータを入れるなら便利。一個ずつ入れる方法もある。
https://openpyxl.readthedocs.io/en/stable/worksheet_tables.html
ここで、理解しておきたい内容だけを公式から抜粋して解説。シンプルにいきましょう。
# ライブラリのインポート
from openpyxl import Workbook
# openpyxlのインスタンスを作って、シートを作って
wb = Workbook()
ws = wb.active
# データをリストで作る
data = [
['Apples', 10000, 5000, 8000, 6000],
['Pears', 2000, 3000, 4000, 5000],
['Bananas', 6000, 6000, 6500, 6000],
['Oranges', 500, 300, 200, 700],
]
# シートにアペンドしていけば上から順に入力されていくので、最初にカラム名を挿入して
ws.append(["Fruit", "2011", "2012", "2013", "2014"])
# リストで作ったデータを1行ずつアペンドして入力していく
for row in data:
ws.append(row)
# 保存
wb.save("table.xlsx")
データを作って、行ごとアペンドしてあげれば入力可能。
特定のセルへの値の入力
もう、大丈夫ですよね。こんな感じ。
worksheet.cell(row=1, column=2) = 5
worksheet['A2'] = 5
入力文字のタイプの判別
worksheet.cell(row=1, column=2).data_type
s
stringの意味かな?
worksheet.cell(row=2, column=2).data_type
n
numberの意味かな?Pythonなんだからintのiとかfloatのfで出てくれればいいのに。
あ、一文字じゃなくてもいいよね。
そして気になるTRUE/FALSE
worksheet.cell(row=2, column=4).data_type
b
boolen
のb
かな
行番号とカラムの取得
カラムのアルファベットの取得(B1のBを取得)
worksheet.cell(row=2, column=2).column_letter
B
2列目はB
カラムのインデックスの取得(B2のセル)
worksheet.cell(row=2, column=2).col_idx
2
2番目のカラム
この書き方もできますね。
worksheet['B'][0].col_idex
2
出力は同じ。
いったん、ここいらで中締め
長くなりそうなんで、ここでいったんシメます。
ここまでできれば値は自由に入れ替えできそうです。
次回は見やすくするために色をつけていきましょうかね。