セル の操作#
- row: 行
- column: 列
1つのセルへのアクセス#
-
セルには、ワークシートのキーとして直接アクセスできる。
-
これにより、A4のセルが返されるか、存在しない場合にはセルが作成される。
-
値は直接割り当てることができる
-
Worksheet.cell()
メソッドにて行と列の表記を使用してセルにアクセスできる。
Note
ワークシートをメモリに作成すると、セルは含まれません。 それらは最初にアクセスされたときに作成されます。
Warning
セルに直接アクセスする代わりにセルをループすると、値を割り当てなくても、すべてのセルがメモリ内に作成されます。
複数のセルへのアクセス#
スライス#
- 行または列の範囲も同様に取得できます。
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() メソッド#
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
プロパティを使用できます。
.columns
(すべての列)#
すべての列を反復処理する場合は、 .columns プロパティを使用できます。
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プロパティを使用します。 これはワークシートのすべての行を繰り返しますが、セル値のみを返します。
.iter_rows()
と.iter_cols()
どちらのメソッドもvalues_only
引数を取ることができます。
値を取得(.value)#
Cellを取得したら、それに値を割り当てることができます。