見出し画像

Python(Excel自動化※完全版)

今回は完成したExcel自動化のコードを共有したいと思います。

時間をかけて作ったため後半は有料の記事になります。
業務効率をしたい方は購入することをお勧めします。

以下がコードになります。

from time import sleep
from test_my import *
import os
import shutil
import collections

getdata = XL()
xl_file_path = r'D:\xxxx\xxx\xxxxx\xxxxxx.xlsx' # IMS用変換テーブルのファイル
sheetname = 'xxxxx' #シート名
try:
   #rename date
   getdata.cell_change(xl_file_path,sheetname,80,"202203","202204")
   sleep(3)
   #どういうエラーが出たのかををメッセージで表示する。
except(IndexError, TypeError, AttributeError,PermissionError) as e:
   print(f"エラーがあります:{e}")
   e_1 = r'D:\xxxx\xxxx\error.log'
   f = open(e_1, 'w')
   f.write("%s\n" % e) #ログファイルを作成。
   print("エラーファイルを作成しました。")
   f.close

# コード、店舗名、国保、社保を取得(セル色なし)
code, name, var_e, var_f = getdata.GetDate(xl_file_path, sheetname, '80')

# コード、店舗名を取得(全部セル)
code1, name1 = getdata.GetDateAll(xl_file_path, sheetname, '80')

# コードが二つあるセルを表示
double = [item for item, count in collections.Counter(code1).items() if count > 1# 店舗コードが複数の場合。
print(double)
print("上記の店舗コードがダブっています。")

# コード、店舗名を取得(セル色あり)
code2, name2 = getdata.GetDate_greyCell(xl_file_path, sheetname, '80')

def chk():
   """フォルダ数と店舗コードが一致しているのかを確認"""
   try:
       path = r"D:\xxxx\xxx\xxxxxx"
       files = os.listdir(path)

       if len(code1) == len(files):
           print("フォルダの数と店舗コードの数が同じであることを確認しました。")

           for i,j,n in zip(files,code1,name1):
               if i.__contains__(j):
                   print(f"{i.__contains__(j)}    {j}     {i}       {n}")
               else:
                   break
           else:
               print('mach')
       else:
           print("フォルダの数と店舗コードの数が同じではない。")
   except(IndexError, TypeError, AttributeError,FileNotFoundError) as e:
       print(f"例外が発生しました:{e}")
       e_1 = r'D:\xxxx\xxxx\error.log'
       f = open(e_1, 'w')
       f.write("%s\n" % e) #エラーファイルを作成。
       print("エラーファイルを作成しました。")
       f.close
       print("処理を中止します。")
       sys.exit()
chk()
def run(move_file_to):
   # rename fordername
   path = r"D:\xxxxx\xxx\xxxxxx"
   files = os.listdir(path)
   for i, c, n in zip(files, code1, name1):
       if c not in double:
           os.rename(fr"{path}\{i}"fr"{path}\{c} {n}"#フォルダ名変更
           print(c,n)
   else:
       print("rename foldernames OK")

   # delete fordername
   for c, n in zip(code2, name2):
       if c not in double:
           shutil.rmtree(fr"{path}\{c} {n}"# ディレクトリの削除
   else:
       print("delete folders OK")

   # rename filenames(xx,xx)
   err = {}  # エラーファイル
   delete = [] # 削除するフォルダ
   create_kokuho = [] #xxのファイル名
   create_shaho = [] #xxのファイル名

   for c, n, v_e, v_f in zip(code, name, var_e, var_f):
       oldpath_kokugo = fr'{path}\{c} {n}\xx\RECEIPTY.cyo'
       newpath_kokugo = fr'{path}\{c} {n}\xx\{v_e}.cyo'

       oldpath_shaho = fr'{path}\{c} {n}\xx\RECEIPTY.cyo'
       newpath_shaho = fr'{path}\{c} {n}\xx\{v_f}.cyo'

       if (os.path.exists(oldpath_kokugo)):
           #ファイル名を変更する。
           os.rename(oldpath_kokugo, newpath_kokugo) 
           os.rename(oldpath_shaho, newpath_shaho)
           #ディレクトリを移動する。
           shutil.move(newpath_kokugo, move_file_to) 
           shutil.move(newpath_shaho, move_file_to)
           #ディレクトリの移動が終了したら残ったフォルダを削除する。
           shutil.rmtree(fr"{path}\{c} {n}") 
           #削除したフォルダをリストに追加。
           delete.append(fr"{path}\{c} {n}") 
           create_kokuho.append(fr'{v_e}.cyo')
           create_shaho.append(fr'{v_f}.cyo')
       else:
           err[c] = n
   else:
       delete_path = r'D:\xxxx\xxxx\folderderete.log'
       with open(delete_path, 'w'as f:
           for d in delete:
               f.write("%s\n" % d)
       print("削除したフォルダをテキストに保存しました。")
       f.close
       create_path = r'D:\定例作業\自動化\create.log'
       with open(create_path, 'w'as f:
           #変更したファイル名をlogファイルに出力する。
           for create_1,create_2 in zip(create_kokuho,create_shaho):
               f.write("%s\n" % create_1) #ログファイルに書き込む
               f.write("%s\n" % create_2)
       print("変更したファイル名の一覧を作成しました。")
       print("rename filenames OK")
       print("move files OK")
       print()
       print()
   print("#########error folder##########")
   for i, k in err.items():
       print(f"error folder {i}     {k}")
       # エラーが出た場合にテキストファイルを作成する。
       double_path = r'D:\xxxx\xxx\errorfile.log'
       with open(double_path, 'w'as f:
           for j in double:
               f.write("%s\n" % j)
       f.close
   print(f'error folder : {len(err)}')
   print("#########error folder##########")

def main():
   """メイン処理"""
   s = input("引き続きの作業でよろしいでしょうか? yes また no を入力してください。") 
   try:
       #yesの場合は処理を実行,noの場合は処理を中断。
       if s == 'yes':
           new_name = input('新規のフォルダ名を入力してください。')
           move_file_to = getdata.newflder(new_name)
           run(move_file_to)
       else:
           print("ありがとうございました。")
   # どういうエラーが出たのかををメッセージで表示する。
   except(IndexError, TypeError, AttributeError) as e:
       print(f"例外が発生しました:{e}")
       e_1 = r'D:\xxxx\xxxx\error.log'
       f = open(e_1, 'w')
       f.write("%s\n" % e) #エラーファイルを作成。
       print("エラーファイルを作成しました。")
       f.close
       print("処理を中止します。")
       
if __name__ == '__main__':
   main()

プラスしておまけでファイルからフォルダ名を取得してExcelに反映させる処理を共有します。

import openpyxl
import os
def excelchage():
   """Excelのデータをフォルダ名に変更する。"""
   xl_file_path = r'D:\xxxxx\xxxxx\xxxxxxxx.xlsx' # Excelファイル
   sheetname = 'xxxxxxx' #シート名
   selected_Cell_1 = '80'
   selected_Cell = 80
   path = r"D:\xxxxxx\xxxxx\xxxxxxx"
   files = os.listdir(path)
   # print(files)
   book = openpyxl.load_workbook(xl_file_path)
   sheet = book[sheetname]
   name = []
   new_name = []
   for rows in sheet['B11':'B'+selected_Cell_1]:
       for cell in rows:
           name.append(str(cell.value).strip())
   # print(name)
   for j in files:
       new_name.append(j)
   # print(new_name)
   s = None
   num = 0 # 0で初期化をする
   for i in range(11,selected_Cell+1):
       if s is sheet.cell(row = i, column=2).value: # ExcelのデータがNoneなのかを判断する。
           continue # 次のfor文に行く。
       else:
           new_text = new_name.pop(num) # listの要素を前から順にみる
           old_text = sheet.cell(row = i, column=2).value # B列のデータ
           print(old_text)
           new_text =  sheet.cell(row = i, column=2).value.replace(old_text,new_text) # フォルダ名に合わせる。
           sheet.cell(row = i, column=2).value = new_text
           book.save(xl_file_path) # 置換したデータをExcelファイルに保存する。
           print("Excelファイルを保存しました。")
           num + 1 # ループごとに足していく。
excelchage()
       

ここから先が有料になります。

ここから先は

4,511字

¥ 2,000

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?