Python_Openpyxl モジュール整理合集#
1. インストール#
pip install openpyxl
2. ファイルを開く#
① 作成#
from openpyxl import Workbook # インスタンス化
wb = Workbook() # ワークシートをアクティブにする
ws = wb.active
② 既存のファイルを開く#
from openpyxl import load_workbook
wb2 = load_workbook('ファイル名.xlsx')
3. データを保存する#
# 方法一:データを直接セルに割り当てることができる(数式を入力可能)
ws['A1'] = 42
# 方法二:行を追加できる、最初の列から追加(最下部の空白から、最左から開始)(複数行を入力可能)
ws.append([1, 2, 3])
# 方法三:Pythonの型は自動的に変換される
ws['A3'] = datetime.datetime.now().strftime("%Y-%m-%d")
4. シートを作成する#
# 方法一:最後に挿入する(デフォルト)
ws1 = wb.create_sheet("Mysheet")
# 方法二:最初の位置に挿入する
ws2 = wb.create_sheet("Mysheet", 0)
5. シートを選択する#
# シート名をキーとしてインデックスを取得できる
ws3 = wb["New Title"]
ws4 = wb.get_sheet_by_name("New Title")
ws is ws3 is ws4
# 戻り値
True
6. シート名を確認する#
# すべてのシート名を表示
>>> print(wb.sheetnames)
['Sheet2', 'New Title', 'Sheet1'] # すべてのシートを列挙
>>> for sheet in wb:
... print(sheet.title)
7. セルにアクセスする(call)#
① 単一セルのアクセス#
# 方法一
>>> c = ws['A4']
# 方法二:row 行;column 列
>>> d = ws.cell(row=4, column=2, value=10)
# 方法三:アクセスするだけで作成される
>>> for i in range(1,101):
... for j in range(1,101):
... ws.cell(row=i, column=j)
② 複数セルのアクセス#
# スライスを使用
>>> cell_range = ws['A1':'C2']
# 行(列)を使用
>>> colC = ws['C']
>>> col_range = ws['C:D']
>>> row10 = ws[10]
>>> row_range = ws[5:10]
# 指定範囲を使用(行 → 行)
>>> 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>
# 指定範囲を使用(列 → 列)
>>> 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>
# すべてを列挙 方法一
>>> ws = wb.active
>>> ws['C9'] = 'hello world'
>>> tuple(ws.rows)
((<Cell Sheet.A1>, <Cell Sheet.B1>, <Cell Sheet.C1>),
(<Cell Sheet.A2>, <Cell Sheet.B2>, <Cell Sheet.C2>),
...
(<Cell Sheet.A8>, <Cell Sheet.B8>, <Cell Sheet.C8>),
(<Cell Sheet.A9>, <Cell Sheet.B9>, <Cell Sheet.C9>))
# すべてを列挙 方法二
>>> tuple(ws.columns)
((<Cell Sheet.A1>,
<Cell Sheet.A2>,
<Cell Sheet.A3>,
...
<Cell Sheet.B7>,
<Cell Sheet.B8>,
<Cell Sheet.B9>),
(<Cell Sheet.C1>,
...
<Cell Sheet.C8>,
<Cell Sheet.C9>))
8. データを保存する#
>>> wb.save('ファイル名.xlsx')
9. 行と列の挿入、削除#
# 1-① 2行目の前に1行挿入
load_ws.insert_rows(2,1)
load_wb.save('test.xlsx')
# 1-② "2行目から"1行削除
load_ws.delete_rows(2,1)
load_wb.save('test.xlsx')
# 2-① 2列目の前に2列挿入
load_ws.insert_cols(2,2)
load_wb.save('test.xlsx')
# 2-② "2列目から"1列削除
load_ws.delete_cols(2,1)
load_wb.save('test.xlsx')
# 総行数を取得(データが存在する)
load_wb.save('data/test.xlsx')
rows = load_ws.max_row
cols = load_ws.max_column
print('このシートには合計:'+str(rows)+' 行があります')
print('このシートには合計:'+str(cols)+' 列があります')
exit()
10. その他#
① シートタブのボタンの色を変更#
ws.sheet_properties.tabColor = "1072BA"
② 最大行、最大列を取得#
# 最大列と最大行を取得
print(sheet.max_row) print(sheet.max_column)
③ 各行、各列を取得#
sheet.rows
はジェネレーターで、各行のデータが含まれ、各行はタプルで包まれています。sheet.columns
は似ていますが、各タプルは各列のセルです。
# 行ごとに返すため、A1, B1, C1の順序で返される
for row in sheet.rows:
for cell in row:
print(cell.value)
# A1, A2, A3の順序で返される
for column in sheet.columns:
for cell in column:
print(cell.value)
④ 数字から文字を取得し、文字から数字を取得 #プロジェクト重要#
from openpyxl.utils import get_column_letter, column_index_from_string
# 列の数字から文字を返す
print(get_column_letter(2)) # B
# 文字から列の数字を返す
print(column_index_from_string('D')) # 4
⑤ ワークシートを削除#
# 方法一
wb.remove(sheet) # 方法二
del wb[sheet]
⑥ 行列の転置(行 → 列)#
rows = [
['Number', 'data1', 'data2'],
[2, 40, 30],
[3, 40, 25],
[4, 50, 30],
[5, 30, 10],
[6, 25, 5],
[7, 50, 10]]
list(zip(*rows))
# 出力
[('Number', 2, 3, 4, 5, 6, 7),
('data1', 40, 40, 50, 30, 25, 50),
('data2', 30, 25, 30, 10, 5, 10)]
# 注意:方法は欠損データのある列(行)を捨てる
rows = [
['Number', 'data1', 'data2'],
[2, 40 ], # ここでデータが1つ欠けている
[3, 40, 25],
[4, 50, 30],
[5, 30, 10],
[6, 25, 5],
[7, 50, 10],
]
# 出力
[('Number', 2, 3, 4, 5, 6, 7), ('data1', 40, 40, 50, 30, 25, 50)]
10. セルスタイルの設定#
① インポートする必要のあるクラス#
from openpyxl.styles import Font, colors, Alignment
② フォント#
- 以下のコードは
等線24号
、太字斜体
、フォントカラー赤
を指定しています。直接セルのfont
属性を使用し、Font オブジェクトを割り当てます。
bold_itatic_24_font = Font(name='等線', size=24, italic=True, color=colors.RED, bold=True)
sheet['A1'].font = bold_itatic_24_font
③ 配置#
- セルの属性
alignment
を直接使用し、ここで垂直中央と水平中央を指定します。center
の他にright、left
などのパラメータも使用できます。
# B1のデータを垂直中央と水平中央に設定
sheet['B1'].alignment = Alignment(horizontal='center', vertical='center')
④ 行の高さと列の幅を設定#
# 2行目の行の高さ
sheet.row_dimensions[2].height = 40
# C列の列の幅
sheet.column_dimensions['C'].width = 30
⑤ セルの結合と分割#
- セルの結合とは、結合領域の左上のセルを基準にして、他のセルを覆い大きなセルにすることを指します。
- 逆に、セルを分割すると、この大きなセルの値が元の左上の位置に戻ります。
# セルを結合し、左上にデータを書き込むだけで良い
sheet.merge_cells('B1:G1') # 1行のいくつかのセルを結合
sheet.merge_cells('A1:C3') # 矩形領域のセルを結合
- 結合後は左上にのみデータを書き込むことができ、つまり範囲中の左側の座標です。
- 結合するセルにすべてデータがある場合、左上のデータのみが保持され、他は破棄されます。言い換えれば、結合前に左上にデータを書き込まなければ、結合後のセルにはデータがありません。
- 以下はセルを分割するコードです。分割後、値は A1 の位置に戻ります。
sheet.unmerge_cells('A1:C3')
最後に例を挙げる#
import datetime
from random import choice
from time import time
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
# ファイル名を設定
addr = "openpyxl.xlsx"
# ファイルを開く
wb = load_workbook(addr)
# 新しいシートを作成
ws = wb.create_sheet()
# 1行目に入力
ws.append(['TIME', 'TITLE', 'A-Z'])
# データを入力(500行)
for i in range(500):
TIME = datetime.datetime.now().strftime("%H:%M:%S")
TITLE = str(time())
A_Z = get_column_letter(choice(range(1, 50)))
ws.append([TIME, TITLE, A_Z])
# 最大行を取得
row_max = ws.max_row
# 最大列を取得
con_max = ws.max_column
# 上記の内容をコンソールに印刷
for j in ws.rows: # we.rows 各行のデータを取得
for n in j:
print(n.value, end="\t") # n.value セルの値を取得
print()
# 保存、save(必ずファイル名(絶対パス)を指定、デフォルトはpyと同じディレクトリ下、xlsx形式のみサポート)
wb.save(addr)