banner
Raymond_Li

Raymond_Li

志之所趋,无远弗届; 穷山距海,不能限也

Python_Openpyxlモジュール整理合集

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)
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。