概要
今回はopenpyxlの使用についてまとめたいと思います。
なお、メモ書き程度に記載していますので、ご了承ください。随時、情報を追加していきます。
openpyxlはpythonのライブラリであり、
Excelファイル(.xlsx)を読み書き(入出力)できます。
今回は、以下を試しました。
1)カラムをエクセルに表示する
2)特定のカラムにおいて重複した値は削除する
3)セル全体から特定のキーワードの位置情報を取得する
実行環境
・windows:Windows11Pro 23H2
・Python 3.12.3
・pandas 2.2.2
・openpyxl 3.1.2
参考サイト
結果
ソースコード◇1と2
import csv
import openpyxl
import pandas as pd
################# 新規作成#############################
######################################################
wb = openpyxl.Workbook()
ws = wb["Sheet"]
###################### データ#########################
######################################################
## カラム= class,numの設定
## classはA,B,Cのいずれか
## numは1-12のいずれか
df = pd.DataFrame([
['A',5],
['B',9],
['C',3],
['C',5],
['C',2],
['C',10],
['B',12],
['A',6],
['B',7],
['C',1],
],columns=['class','num'])
## カラム名とカラム数の取得
temp_column_name = []
for column_name in df:
temp_column_name.append(column_name)
LENGTH = len(df[temp_column_name[0]])
## 特定のカラム名(class)の値の取得(重複なし)
column_kind = []
for i in range(LENGTH):
column_kind.append(df[temp_column_name[0]][i])
column_kind = list(dict.fromkeys(column_kind))
LENGTH_COLUMN_KIND = len(column_kind)
##################### 番号(1-12)の表示####################
#########################################################
START_COLUMU = 2
for alphabet,num in zip (range(66,91),range(1,13)):
ws[f"{chr(alphabet)}{START_COLUMU}"].value = num
################ カラム>>>classの表示#####################
#########################################################
for i in range(LENGTH_COLUMN_KIND):
ws[f"A{3 + i}"].value = column_kind[i]
################ カラム>>>numの表示#####################
#########################################################
## 該当のnumがある場合1を出力
for i in range(LENGTH_COLUMN_KIND):
for class_,num in zip(df[temp_column_name[0]],df[temp_column_name[1]]):
if class_ == column_kind[i]:
ws[f"{chr(65 + num)}{3 + i}"].value = 1
wb.save('auto.xlsx')
wb.close()
エクセルファイル
ソースコード 3
location.py
import openpyxl
import pandas as pd
# カラムが存在するか否かを調べる
# カラムが存在した場合、データのスタートと終わりのセルの位置情報を格納する
def get_col_start(ws, dic_data):
row_count = ws.max_row
for col in ws.columns:
count = 0
for cell in col:
count += 1
# セルのデータを文字列に変換
try:
value = str(cell.value)
except:
continue
# キーワードに一致するセルの位置情報を取得
for key in dic_data:
if value == key:
# キーワードの位置情報のアルファベット
dic_data[key][start] = openpyxl.utils.get_column_letter(cell.column) + str(cell.row + 1)
if cell.value is None:
for key in dic_data:
if openpyxl.utils.get_column_letter(cell.column) in dic_data[key][start]:
dic_data[key][end] = openpyxl.utils.get_column_letter(cell.column) + str(count - 1)
break
if row_count == count:
for key in dic_data:
if openpyxl.utils.get_column_letter(cell.column) in dic_data[key][start]:
dic_data[key][end] = openpyxl.utils.get_column_letter(cell.column) + str(count)
break
# 列名の取得を取得できたか否かの確認
for key,values in dic_data.items():
if dic_data[key][start] == INITDATA:
print(f"<<{key}>>の列を取得できませんでした")
return False
else:
print(f"<<{key}>>の列を取得できた")
print(dic_data)
return dic_data
if __name__ == '__main__':
filename = 'test.xlsx'
wb = openpyxl.load_workbook(filename)
ws = wb['Sheet1']
key1 = "やること"
key2 = "時間帯"
INITDATA = '-1'
start = "start_row"
end = "end_row"
dic = {
key1 : {start : INITDATA,
end : INITDATA},
key2 : {start : INITDATA,
end : INITDATA},
}
# 関数の実行:シート全体を検索
result = get_col_start(ws, dic)
'''
以下が出力結果
<<やること>>の列を取得できた
<<時間帯>>の列を取得できた
{'やること': {'start_row': 'B2', 'end_row': 'B4'}, '時間帯': {'start_row': 'C2', 'end_row': 'C7'}}
'''