본문 바로가기
공부

Python 과 SmartA(pyautogui path.join openpyxl)

by 심현주 2022. 11. 26.
반응형

 

저에게는 조금 더 쉽게 간단하게는 항상 관건이었습니다.
행정병시절에 excel 수식을 겉핥기식으로라도 알게된것도 결국엔 그때문이었는데
바뀐명부의 정보찾아내는 방법도 분명 더 좋은방법이 있었을텐데
vlookup으로 하나하나 찾아냈던게 떠오르네요.

일단 아래 코드는 엑셀에서 특정 값 추출하여 사용하고
엑셀 제목을 통하여 SmartA 에 접근 하는 오토마우스 코드입니다.

사실 필요없는 코드도 있고 import 항목도 있어서 보고 약간 수정해서 쓰시면 될것같습니다.



전제



SmartA(이하 더존)은 사업자번호로 데이터 검색이 가능
엑셀 이름을 사업자번호 111-11-11111 로 확장자는 .xlsx사용
더존 실행시 사업자 번호 검색으로 설정되어있어야하고
원천세 마감이 풀려있어야 하며(기존 데이터 유무는 상관없음)
입력하려는 년도에 기수가 맞춰져 있어햐합니다.
vscode python 실행 import 내역들 install (pip install ---)


실행시



엑셀 제목으로 더존데이터 접근후
사업소득 업로드 후 원천세 마감까지
다른소득이 있을경우 미리 입력해두고 사업소득은 이 코드로 진행하여도 됩니다.


한계



활성화 방식이므로 실행후 다른작업 불가능, win32를 통한 비활성화 방법 모색필요함
타 소득 업로드도 조건부로 삽입할 수 있을것 같은데 고려하지 않음
엑셀 이름 사업자번호로 저장하여야 하고 내용이 더존 엑셀 업로드 서식을 따라야함

코드에 관하여


설명으로인해 나눠진 코드를 하나로 붙여넣고 파이썬으로 돌리면 구동합니다.

import os
import clipboard
import pyautogui
import pygetwindow
import time
import pandas as pd
import openpyxl


#사업소득 엑셀업로드를 통한 원천세마감
위는 import내역으로 아래 필요한 모듈들을 불러 오는 내용이고
엑셀 숫자만큼 반복하기 위하며 xlsx 파일 리스트를 만들고, 리스트의 개수를 정의

PATH = r'D:/im'
file_list = os.listdir(PATH)
file_list_01 = [file for file in file_list if file.endswith(".xlsx")]
num = len(file_list_01)

#for i in range(num):
#print(i)

사실상 반복작업에 대한 구문이 시작되는 곳으로
처음에 헤맨게 파일 위치를 특정하여 로딩하는 문제였다.
for "i"를 몇번 반복할지 len은 수를 세는 함수인거같은데 해당 개수로 반환된 숫자보다
range()의 두번째 숫자는 개수-1 이었다. 파일리스트가 0번부터 시작해서 num-1로 했더니 오류가 나서
그냥 num을 썼더니 문제가 안생겼다. 왜인지는 모르겠지만
위의 구문으로 파일개수를 구한다면 range(0,num)으로만 써도 되는거같다.

for filename in file_list_01:
print (os.path.splitext(filename)[0])

for i in range(0,num):
xfilepath = os.path.join("D:/im/", file_list_01[i])
wb = openpyxl.load_workbook(xfilepath, data_only=True)
sheet = wb.active
xmonth=sheet['B4'].value

어차피 첫번째 시트만 쓰므로 월 값을 시트상 월 입력 칸으로 정의
파일의 위치를 특정해야 openpyxl 에 불러올수 있는데
대표적인 예제들이 모두 같은 폴더에 있는것으로 가정하고 \xxx.xlsx
라고 되어있어 여기서 첫번째로 헤맸다.

기존에 어째서 경로와 파일리스트를 ,로 이어서 쓰면 안되는거지..라고 생각했는데
프린트해보니 공백이 들어가는걸 확인해볼수 있었고
(ex xfilepath=("D:/im/",file_list_01[i] 프린트결과 D:/im/ xxx-xx-xxxxx)
이전 remove 이용시 파일 경로 설정때 os.path.join 이란걸 깨닫고
해당 코드이용하였더니 패스.

#엑셀 월 값찾기
#밑으로는 엑셀파일 이름을 통한 더존, 사업자번호로 검색 세팅해야함
clipboard.copy(os.path.splitext(file_list_01[i])[0])
wins = pygetwindow.getWindowsWithTitle('Smart A Main')[0]
wins.activate()
time.sleep(1)
pyautogui.click(wins.left+94, wins.top+11)
pyautogui.press('f2')
pyautogui.hotkey('ctrl','v')
pyautogui.press('enter')
pyautogui.press('enter')
pyautogui.press('enter')
time.sleep(1)
pyautogui.click(wins.left-31, wins.top+180)
time.sleep(1)
pyautogui.click(wins.left+200, wins.top+116)
time.sleep(1)
pyautogui.click(wins.left+486, wins.top+204)
time.sleep(2)
pyautogui.press('tab')
pyautogui.press('f11')
pyautogui.hotkey('ctrl','f8')


여기까지가 엑셀 업로드 누르기

아래부터는 사실 별 내용이 없는데
splitext 를 통하여 엑셀 리스트상 이름을 하나 복사하여
더존메인으로 들어가 pygetwindow 로
더존메인화면, 엑셀불러오기 메뉴화면, 불러오기클릭시 열리는 창이름 "열기"를 각각 정의하고
오토마우스를 해당 창의 좌표를 클릭하는 내용이다.
winsss = pygetwindow.getWindowsWithTitle('DZDialog')[0]
pyautogui.click(winsss.left+136, winsss.top+346)
time.sleep(0.5)
pyautogui.click(winsss.left+252, winsss.top+391)
time.sleep(1)
winss = pygetwindow.getWindowsWithTitle('열기')[0]
pyautogui.click(winss.left+623, winss.top+37)
pyautogui.write('D:/im', interval=0.25)
pyautogui.press('enter')
pyautogui.click(winss.left+439, winss.top+479)
pyautogui.hotkey('ctrl','v')
pyautogui.write('.xlsx', interval=0.25)
pyautogui.press('enter')
time.sleep(1)
pyautogui.press('enter')
time.sleep(1)
pyautogui.press('enter')
time.sleep(1)
pyautogui.press('enter')
time.sleep(1)
pyautogui.press('enter')
time.sleep(1)


여기까지가 엑셀파일 업로드후
아래는 원천세 신고마감
아까 엑셀 파일에서 가져온 month값이 마감하는 월에대한 입력이다.
사실 년도도 값을 불러와서 하나하나 세팅할수 있지만
일반적으로 더존 데이터가 당해년도에 맞춰져 있다는 사실을 고려하면
코드를 고민할 실익이 없어지는거 같아서 고려하지 않았다.
pyautogui.click(wins.left-31, wins.top+180)
time.sleep(1)
pyautogui.click(wins.left+65, wins.top+114)
time.sleep(0.5)
pyautogui.click(wins.left+489, wins.top+188)
time.sleep(2)
pyautogui.write(xmonth)
pyautogui.press('enter')
time.sleep(0.5)
pyautogui.write(xmonth)
pyautogui.press('enter')
time.sleep(0.5)
pyautogui.write(xmonth)
pyautogui.press('enter')
time.sleep(0.5)
pyautogui.write(xmonth)
pyautogui.press('enter')
time.sleep(2)
pyautogui.press('right')
time.sleep(0.5)
pyautogui.press('enter')
time.sleep(3)
pyautogui.press('f4')
time.sleep(0.5)
pyautogui.press('tab')
time.sleep(0.5)
pyautogui.press('enter')
time.sleep(0.5)

반응형

댓글