3
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-08-05

1.状況説明/やりたい事

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

<LDX73219_report_202107.csv>
1ab.jpg

つまり、こうしたい。
1xy.jpg

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


xyz.jpg
この様に、価格を埋めた上で、経理部に返送する必要がある。(勿論、売上データなので、ミスは許されない!)

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

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

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で1列目を消して、再度保存する。」と言うコードにしたのですが、何かカッコ悪い!

==========
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")

===========

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4