ExcelをPython(openpyxl)で操作する - セルの読み書き

ExcelをPython(openpyxl)で操作する - セルの読み書き
Page content

前回の 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')

fill_cell

または、 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')

bulk_insert

まとめ

今回は openpyxl を使って以下を行いました。

  • セルの入力
  • セルの読み込み
  • 行/列ごとの処理
  • 行単位での入力

少しづつExcelをプログラムで操作する旨味が感じられてきたのではないでしょうか!


関連記事

soudegesu avatar
About soudegesu
Software Engineer
comments powered by Disqus