{Python}エクセル操作

 

https://gammasoft.jp/support/openpyxl-iter-rows/#:~:text=%E7%A9%BA%E8%A1%8C%E3%81%AE%E5%88%A4%E5%AE%9A%E3%81%AF,%E3%81%AA%E3%82%8B%E3%81%8B%E3%81%A7%E8%A6%8B%E5%88%86%E3%81%91%E3%81%BE%E3%81%99%E3%80%82

OS: Windows10
バージョン: 3.7.9

想定シナリオ:
6列のエクセル(1行目ヘッダー)から
ヘッダーを除いて1,3,5列のみ取得して、3列目の昇順にソートしてエクセルへ出力


前提:

python -m pip install openpyxl

 

from openpyxl import Workbook
from openpyxl import load_workbook
import random
from operator import itemgetter


# テスト用ファイル作成


wb1 = Workbook()
ws1 = wb1.active


ws1.append(['col1','col2','col3','col4','col5','col6'])

for i in range(10):
  values = []
  values.append('A'+str(i) )
  values.append('B'+str(i) )
  values.append(random.randrange(100) )
  values.append(i*4)
  values.append(i*5)
  values.append(i*6)
  ws1.append(values)

wb1.save('a.xlsx')


# ファイル加工

wb2 = load_workbook(filename='a.xlsx', read_only=True)
sheetname = wb2.sheetnames[0]
ws2 = wb2[sheetname]


wb3 = Workbook()
ws3 = wb3.active


# シートの内容を取得
# 1カラム目が空になったら終了

keys = ['col1','col2','col3']
dict3_list = []

for row in ws2.iter_rows(min_row=2):
  if row[0].value is None:
    break
  values = []
  for col in row:
    values.append(col.value)
  print(values)
  values = [
]
  values.append(row[0].value )
  values.append(row[2].value )
  values.append(row[4].value )
  dict3 = dict( zip(keys,values) )
  print( dict3 )
  dict3_list.append(dict3)


print(dict3_list)
sorted_list = sorted(dict3_list, key=itemgetter("col2"))
print(sorted_list)

# ソート済み辞書をエクセルに書き込む
for row in sorted_list:
  if row["col1"] is None:
    break
  print(row)
  values = list( row.values() )
  ws3.append(values)

wb3.save('b.xlsx')


# ワークブックデータ確認

for row in ws3.iter_rows(min_row=1):
  if row[0].value is None:
    break
  values = []
  for col in row:
    values.append(col.value)
  print(values)


wb3.close()
wb2.close()
wb1.close()