ExcelをPython(openpyxl)で操作する - セルの読み書き
前回の ExcelをPython(openpyxl)で操作する - シートの作成、シート属性値変更 では openpyxl を使って Excelシートの作成 と Excelシートの属性値変更 を行いました。
今回は、シート内の セルの値の読み書き をしましょう。
セルに値を入力する
Worksheet
オブジェクトに対して 列+行 のプロパティでセルにアクセスすることができます。
例えば、以下のようなコードの場合、2つのセルへ入力を行います。
1from openpyxl import Workbook
2from openpyxl.compat import range
3from openpyxl.utils import get_column_letter
4
5wb = Workbook()
6ws = wb.active
7
8# `B` 列の `2` 行目に `hogehogehoge` を入力
9ws['B2'] = 'hogehogehoge'
10# `F` 列の `5` 行目に `fugafugaufga` を入力
11ws['F5'] = 'fugafugaufga'
12
13wb.save(filename = 'sample_book.xlsx')
または、 cell
関数を使っても入力できます。
cell
関数の場合は列はアルファベットではなく、数字で入力する必要があります。
1ws.cell(row=2, column=2, value='hogehogehoge')
2ws.cell(row=5, column=6, value='fugafugaufga')
セルの値を読み込む
セルの値を読み込むには、入力時と同様に 列+行 のプロパティでセルにアクセスした後に value
プロパティで取得できます。
例えば、以下のように書くと、変数 b2
に文字列 hogehogehoge
が格納されます。
1b2 = ws['B2'].value
入力のときと同様に、読み込みについても cell
関数で代用できます。
1b2 = ws.cell(column=2, row=2).value
行を処理する
iter_rows
関数で行単位でデータを取得できます。
iter_rows
関数では min_row
max_row
min_col
max_col
を引数に与えることができ、
ループ処理の対象とするシート内の行や列の範囲 を設定することができます。
実際にファイルを取り扱う場面では、1行目のA列目からデータがびっしり入っていることはあまりないので、読み込み範囲指定は重宝します。
なお、max_row
max_col
を入力しない場合には、データの入っている最大の位置までが操作対象になります。
試しに、先程の sample_book.xlsx
に対して、各行のすべてのセルの値を表示してみます。
1# 2行目を開始行として、1行単位で処理をする
2for row in ws.iter_rows(min_row=2):
3 # 行からセルを1個ずつ取得し、処理をする
4 for cell in row:
5 print(f"{cell.col_idx}列目:{cell.value}")
6 print('------------------------------------------')
結果は以下のようになります。
11列目:None
22列目:hogehogehoge
33列目:None
44列目:None
55列目:None
66列目:None
7------------------------------------------
81列目:None
92列目:None
103列目:None
114列目:None
125列目:None
136列目:None
14------------------------------------------
151列目:None
162列目:None
173列目:None
184列目:None
195列目:None
206列目:None
21------------------------------------------
221列目:None
232列目:None
243列目:None
254列目:None
265列目:None
276列目:fugafugaufga
28------------------------------------------
列を処理する
iter_cols
関数で列単位でデータを取得できます。
操作感としては iter_rows
関数と同様ですが、ループ対象が列になります。
1# 2列目を開始行として、1列単位で処理をする
2for col in ws.iter_cols(min_row=2):
3 # 列からセルを1個ずつ取得し、処理をする
4 for cell in col:
5 print(f"{cell.row}行目:{cell.value}")
6 print('------------------------------------------')
結果は以下のようになります。
12行目:None
23行目:None
34行目:None
45行目:None
5------------------------------------------
62行目:hogehogehoge
73行目:None
84行目:None
95行目:None
10------------------------------------------
112行目:None
123行目:None
134行目:None
145行目:None
15------------------------------------------
162行目:None
173行目:None
184行目:None
195行目:None
20------------------------------------------
212行目:None
223行目:None
234行目:None
245行目:None
25------------------------------------------
262行目:None
273行目:None
284行目:None
295行目:fugafugaufga
30------------------------------------------
行単位でデータを入力する
append
関数により、行単位でデータを入力することができます。
関数への引数にはリスト型のデータを渡してことで、左詰めでデータが入っていきます。
1wb = Workbook()
2ws = wb.active
3
4data = [
5 ['A', 100, 1.0],
6 ['B', 200, 2.0],
7 ['C', 300, 3.0],
8 ['D', 400, 4.0],
9]
10
11for row in data:
12 # 1行ずつデータが挿入される
13 ws.append(row)
14
15wb.save(filename = 'sample_book.xlsx')
まとめ
今回は openpyxl を使って以下を行いました。
- セルの入力
- セルの読み込み
- 行/列ごとの処理
- 行単位での入力
少しづつExcelをプログラムで操作する旨味が感じられてきたのではないでしょうか!