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

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

前回の ExcelをPython(openpyxl)で操作する - シートの作成、シート属性値変更 では openpyxl を使って Excelシートの作成Excelシートの属性値変更 を行いました。

今回は、シート内の セルの値の読み書き をしましょう。

セルに値を入力する

Worksheet オブジェクトに対して 列+行 のプロパティでセルにアクセスすることができます。

例えば、以下のようなコードの場合、2つのセルへ入力を行います。

from openpyxl import Workbook
from openpyxl.compat import range
from openpyxl.utils import get_column_letter

wb = Workbook()
ws = wb.active

# `B` 列の `2` 行目に `hogehogehoge` を入力
ws['B2'] = 'hogehogehoge'
# `F` 列の `5` 行目に `fugafugaufga` を入力
ws['F5'] = 'fugafugaufga'

wb.save(filename = 'sample_book.xlsx')

fill_cell

または、 cell 関数を使っても入力できます。

cell 関数の場合は列はアルファベットではなく、数字で入力する必要があります。

ws.cell(row=2, column=2, value='hogehogehoge')
ws.cell(row=5, column=6, value='fugafugaufga')

セルの値を読み込む

セルの値を読み込むには、入力時と同様に 列+行 のプロパティでセルにアクセスした後に value プロパティで取得できます。

例えば、以下のように書くと、変数 b2 に文字列 hogehogehoge が格納されます。

b2 = ws['B2'].value

入力のときと同様に、読み込みについても cell 関数で代用できます。

b2 = 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 に対して、各行のすべてのセルの値を表示してみます。

# 2行目を開始行として、1行単位で処理をする
for row in ws.iter_rows(min_row=2):
    # 行からセルを1個ずつ取得し、処理をする
    for cell in row:
        print(f"{cell.col_idx}列目:{cell.value}")
    print('------------------------------------------')

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

1列目:None
2列目:hogehogehoge
3列目:None
4列目:None
5列目:None
6列目:None
------------------------------------------
1列目:None
2列目:None
3列目:None
4列目:None
5列目:None
6列目:None
------------------------------------------
1列目:None
2列目:None
3列目:None
4列目:None
5列目:None
6列目:None
------------------------------------------
1列目:None
2列目:None
3列目:None
4列目:None
5列目:None
6列目:fugafugaufga
------------------------------------------

列を処理する

iter_cols 関数で列単位でデータを取得できます。

操作感としては iter_rows 関数と同様ですが、ループ対象が列になります。

# 2列目を開始行として、1列単位で処理をする
for col in ws.iter_cols(min_row=2):
    # 列からセルを1個ずつ取得し、処理をする
    for cell in col:
        print(f"{cell.row}行目:{cell.value}")
    print('------------------------------------------')

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

2行目:None
3行目:None
4行目:None
5行目:None
------------------------------------------
2行目:hogehogehoge
3行目:None
4行目:None
5行目:None
------------------------------------------
2行目:None
3行目:None
4行目:None
5行目:None
------------------------------------------
2行目:None
3行目:None
4行目:None
5行目:None
------------------------------------------
2行目:None
3行目:None
4行目:None
5行目:None
------------------------------------------
2行目:None
3行目:None
4行目:None
5行目:fugafugaufga
------------------------------------------

行単位でデータを入力する

append 関数により、行単位でデータを入力することができます。

関数への引数にはリスト型のデータを渡してことで、左詰めでデータが入っていきます。

wb = Workbook()
ws = wb.active

data = [
        ['A', 100, 1.0],
        ['B', 200, 2.0],
        ['C', 300, 3.0],    
        ['D', 400, 4.0],        
]

for row in data:
    # 1行ずつデータが挿入される
    ws.append(row)

wb.save(filename = 'sample_book.xlsx')

bulk_insert

まとめ

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

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

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


関連記事

soudegesu avatar
About soudegesu
Software Engineer
comments powered by Disqus