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
この記事が気に入ったらサポートをしてみませんか?