Skip to content

セル の操作#

  • row: 行
  • column: 列

1つのセルへのアクセス#

  • セルには、ワークシートのキーとして直接アクセスできる。

    c = ws['A4']
    

  • これにより、A4のセルが返されるか、存在しない場合にはセルが作成される。

  • 値は直接割り当てることができる

    ws['A4'] = 4
    

  • Worksheet.cell() メソッドにて行と列の表記を使用してセルにアクセスできる。

d = ws.cell(row=4, column=2, value=10)

Note

ワークシートをメモリに作成すると、セルは含まれません。 それらは最初にアクセスされたときに作成されます。

Warning

セルに直接アクセスする代わりにセルをループすると、値を割り当てなくても、すべてのセルがメモリ内に作成されます。

# メモリ内に 100x100 のセルを作成する
for x in range(1,101):
    for y in range(1,101):
        ws.cell(row=x, column=y)

複数のセルへのアクセス#

スライス#

cell_range = ws['A1':'C2']
  • 行または列の範囲も同様に取得できます。
    colC = ws['C']
    col_range = ws['C:D']
    row10 = ws[10]
    row_range = ws[5:10]
    

range#

from openpyxl import Workbook


filename = "Looping_Range.xlsx"
wb = Workbook()
ws1 = wb["Sheet"]

for row in range(1, 4):
    for col in range(1, 4):
        cell = ws1.cell(row=col, column=row)
        print(cell.coordinate, end=" ")

wb.save(filename)

.iter_rows() メソッド#

for row in ws.iter_rows(min_row=1, max_col=3, max_row=2):
    for cell in row:
            print(cell)
# <Cell Sheet1.A1>
# <Cell Sheet1.B1>
# <Cell Sheet1.C1>
# <Cell Sheet1.A2>
# <Cell Sheet1.B2>
# <Cell Sheet1.C2>

iter_cols() メソッド#

for col in ws.iter_cols(min_row=1, max_col=3, max_row=2):
    for cell in col:
        print(cell)

Warnig

.iter_cols() / .iter_rows() メソッドは読み取り専用モードでは使用できません。

1列にループで書き込む例#

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

with open("test.txt", "r", encoding="utf-8") as f:
    textlines = f.readlines()
    textlines = [x.replace("\n", "") for x in textlines]

row_num = 1 # 2 にすると2行目から
col_num = 1

for text in textlines:
    ws.cell(row = row_num, column=col_num).value = text
    row_num += 1 # 行番号をインクリメント

wb.save("result.xlsx")

行、列を取得してループする例#

from openpyxl import load_workbook

wb = load_workbook("result.xlsx")
ws = wb["Sheet"]

# 外側のループは列
for row in  ws.iter_cols():
    for cell in row:
        if cell.value == None:
            continue
        print(cell.value)

.rows (すべての行)#

すべての行を反復処理する場合は、 .rows プロパティを使用できます。

ws = wb.active
ws['C9'] = 'hello world'
tuple(ws.rows)

.columns (すべての列)#

すべての列を反復処理する場合は、 .columns プロパティを使用できます。

tuple(ws.columns)
((<Cell Sheet.A1>,

Note

Worksheet.columns プロパティは読み取り専用モードでは使用できません。

max_row / max_column#

  • シートオブジェクトのmax_rowメソッド、max_columnメソッドにて、シート内の最大列数、最大行数を取得できる。
  • セルの値(cell.valu)ではなく、cell.coordinate でセルのアドレス(A1など)を出力
from openpyxl import load_workbook


filename = "max_row_max_col.xlsx"
wb = load_workbook(filename)
ws1 = wb["Sheet"]

print(f"max_row is in row: {ws1.max_row}")
print(f"max_column is in column {ws1.max_column}")

for row in ws1.iter_rows(min_row=1, max_col=ws1.max_column, max_row=ws1.max_row):
    for cell in row:
        print("{0: <3}".format(cell.coordinate), end = " ")
    print()
print("-"*50)
for row in ws1.iter_rows(min_row=1, max_col=ws1.max_column, max_row=ws1.max_row):
    for cell in row:
        print("{0: <5}".format(str(cell.value)), end = " ")
    print()

insert / delete#

from openpyxl import Workbook

def set_values(ws):
    ws.delete_cols(1,100)
    counter = 1
    for row in ws.iter_rows(min_row=1, max_col=10, max_row=10):
        for cell in row:
            cell.value = counter
            counter += 1

def print_rows(ws):
    row_string = ""
    for row in ws.iter_rows(min_row=1, max_col=ws.max_column, max_row=ws.max_row):
        for cell in row:
            row_string += "{:<3}".format(str(cell.value) + " ")
        row_string += "\n"
    print(row_string)

if __name__ == "__main__":
    # Create a workbook and sheets
    filename = "Deleting_inserting_rows_cols.xlsx"
    wb = Workbook()
    ws1 = wb["Sheet"]

    # Insert values from 1 to 100 into a grid of 10x10 cells
    set_values(ws1)

    print_rows(ws1)

    # Insert a row at the top
    ws1.insert_rows(0)
    # Insert a row above the second row (which is now the former first row)
    ws1.insert_rows(1)

    print_rows(ws1)

    # Delete the top row
    ws1.delete_rows(0) # zeroeth index for rows

    print_rows(ws1)

    # Save the wb
    wb.save(filename)

append#

append メソッドにリストを渡すと行ごとに書き込む

from openpyxl import Workbook

def print_rows(ws):
    row_string = ""
    for row in ws.iter_rows(min_row=1, max_col=ws.max_column, max_row=ws.max_row):
        for cell in row:
            row_string += "{:<8}".format(str(cell.value) + " ")
        row_string += "\n"
    print(row_string)

if __name__ == "__main__":
    filename = "Append.xlsx"
    wb = Workbook()
    ws1 = wb["Sheet"]

    sales_data = [ 
        ["North",  670_000, 230_000],
        ["South", 340_000, 550_000],
        ["West", 111_000, 95_000],
        ["East", 456_000, 123_000]]
    header = ["Sales", 2018, 2019]
    ws1.append(header)
    for row in sales_data:
        ws1.append(row)

    print_rows(ws1)

    wb.save(filename)

#

ワークシートの値だけが必要な場合は、Worksheet.valuesプロパティを使用します。 これはワークシートのすべての行を繰り返しますが、セル値のみを返します。

for row in ws.values:
   for value in row:
     print(value)
  • .iter_rows().iter_cols()どちらのメソッドもvalues_only引数を取ることができます。
    for row in ws.iter_rows(min_row=1, max_col=3, max_row=2, values_only=True):
        print(row)
    
    # (None, None, None)
    # (None, None, None)
    

値を取得(.value)#

Cellを取得したら、それに値を割り当てることができます。

c.value = 'hello, world'
print(c.value)
# 'hello, world'

```python
d.value = 3.14
print(d.value)
# 3.14