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

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')

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をプログラムで操作する旨味が感じられてきたのではないでしょうか!