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

結果は以下のようになります。

 11None
 22hogehogehoge
 33None
 44None
 55None
 66None
 7------------------------------------------
 81None
 92None
103None
114None
125None
136None
14------------------------------------------
151None
162None
173None
184None
195None
206None
21------------------------------------------
221None
232None
243None
254None
265None
276fugafugaufga
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('------------------------------------------')

結果は以下のようになります。

 12None
 23None
 34None
 45None
 5------------------------------------------
 62hogehogehoge
 73None
 84None
 95None
10------------------------------------------
112None
123None
134None
145None
15------------------------------------------
162None
173None
184None
195None
20------------------------------------------
212None
223None
234None
245None
25------------------------------------------
262None
273None
284None
295fugafugaufga
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をプログラムで操作する旨味が感じられてきたのではないでしょうか!