【Python】「２つのエクセルシートを見比べて、単価を拾い、記入していた手動処理」を完全自動化した話。

１．状況説明／やりたい事

下記の様な顧客別の売上管理シートが月初に大量に経理から流れてきます。
売上管理シートは、顧客別に別csvになっており、下記csvシートの名称は、"LDX73219_report_202107.csv"です。
LDXと５桁の数字は顧客番号となっております。

＜LDX73219_report_202107.csv>
![1ab.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/0b9009b3-ccb7-164b-89e8-a12a5b074086.jpeg)

つまり、こうしたい。
![1xy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/cb29a957-db82-5e5a-523e-63075559c9fc.jpeg)


２．今までのやり方。
下記の価格元帳(pricelist.xlsx)を開いて、単価を目視で探した上で、"LDX73219_report_202107.csv"に記入していた。
例えば、上記CSVファイルの最上段は、LDX Code（顧客番号）は、LDX73219であり、「Model Number 14を、2600個ロット」で注文したと言う事になるので、下の価格元帳から、探すと、単価960円となる。

<pricelist.xlsx>
![xyz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/56406277-77a9-2118-461b-8084e2c9d14d.jpeg)
この様に、価格を埋めた上で、経理部に返送する必要がある。（勿論、売上データなので、ミスは許されない！）


３．従来のやり方の問題点。
顧客別の売上管理シートが、１枚や２枚なら、まだしも、何十枚もあるので、時間も掛かるし、ミスも頻発している。
よって、自動化する。

４． Code 
自動で、価格を埋めたExcelファイルを吐き出します。


```Python:price_search.py
import openpyxl as px
from datetime import datetime 
from dateutil.relativedelta import relativedelta
import os
import glob
from openpyxl.styles import Font
from time import sleep
import pandas as pd

wb2=px.load_workbook("pricelist.xlsx",data_only=True)
ws2=wb2["price_list"]

filez2=glob.glob('LDX*_report_*.csv')

for i in range(len(filez2)):
	df2=pd.read_csv(filez2[i],sep=',',encoding='utf-8',index_col=None)
	df2_list1=df2['LDX Code'].to_list()
	print(df2_list1)
	df2_list2=df2['Model Number'].to_list()
	print(df2_list2)
	df2_list3=df2['units/lot'].to_list()
	print(df2_list3)
	df2_list4=df2['Price per unit'].to_list()
	print(df2_list4)
	i2=0
	for i2 in range(df2.shape[0]):
		i3=0
		for i3 in range(ws2.max_row):
			if df2_list2[i2]==ws2.cell(row=i3+1,column=4).value and df2_list1[i2]==ws2.cell(row=i3+1,column=1).value and df2_list3[i2]==ws2.cell(row=i3+1,column=5).value:
				df2.at[i2,"Price per unit"]=ws2.cell(row=i3+1,column=6).value   # when "LDX Number","Model Numeber" and "units/lot" matches, "Price per unit" is retrived from pricelist.xlsx 
				print(df2.at[i2,"Price per unit"])
		i3=i3+1
	i2=i2+1

	print(filez2[i])
	print(df2)
	
	
	basex=os.path.basename("revised_"+filez2[i]).split('.', 1)[0]
	print(basex+".xlsx")
	df2.to_excel(basex+".xlsx", encoding='utf-8')
	wbr1 = px.load_workbook(basex+".xlsx")
	wsr1 = wbr1["Sheet1"]
	wsr1.delete_cols(1)
	wbr1.save(basex+".xlsx")	
i=i+1

```
```
C:\Users\User_XXX\Desktop\code>Tree/F
フォルダー パスの一覧
ボリューム シリアル番号は 2E48-BBB4 です
C:.
    LDX12345_report_202107.csv  #最初にセットします。
    LDX73219_report_202107.csv　#最初にセットします。
    pricelist.xlsx　　　　　　　#最初にセットします。（価格元帳です。）
    price_search.py　　　　　　 #実行ファイルです。　
    revised_LDX12345_report_202107.xlsx #価格が埋まったシートが自動作成されます。
    revised_LDX73219_report_202107.xlsx #価格が埋まったシートが自動作成されます。
サブフォルダーは存在しません
```


＜今後の改善点＞
Pandasで全部処理しようとしたのですが、Index_colがどうしても消せないので、ここで詰まりました。
プログラムの末尾で、「一旦、xlsxに変換した上で、得意なOpenpyxlで１列目を消して、再度保存する。」と言うコードにしたのですが、何かカッコ悪い！

＝＝＝＝＝＝＝＝＝＝
basex=os.path.basename("revised_"+filez2[i]).split('.', 1)[0]
print(basex+".xlsx")
df2.to_excel(basex+".xlsx", encoding='utf-8')
wbr1 = px.load_workbook(basex+".xlsx")
wsr1 = wbr1["Sheet1"]
wsr1.delete_cols(1)
wbr1.save(basex+".xlsx")	
＝＝＝＝＝＝＝＝＝＝＝