티스토리 뷰

반응형

youtu.be/6_URHcHmLrQ

다른 강의자료는 www.codingnow.co.kr/ 여기를 참고해주세요.!!

 

코딩나우

프로그래밍 교육및 개발의뢰 받습니다.

www.codingnow.co.kr

 

사무자동화편 pandas를 이용한 엑셀파일 제어 강의 속편입니다.

cflab2017.tistory.com/109

pandas로 정리된 성적점수를 바탕으로 1등,2등,3등의 학생의 상장을 자동으로 생성하는 프로그래밍입니다.

한글(HWP)는 api를 제공하고 있습니다.

api 개발메뉴얼 주소입니다.

(www.hancom.com/board/devmanualList.do?gnb0=25&gnb1=81)

 

또한 한글을 파이썬으로 open할때 보안 팝업이 발생합니다.

이것을 방지하기 위한 해결 방법 url 및 동영상에 설명되어 있습니다.

(www.hancom.com/board/devdataView.do?board_seq=47&artcl_seq=4085&pageInfo.page=&search_text=)

 

 

pandas를 사용하여 학생의 평균을 구하고 평균을 기준으로 내림차순으로 정렬을합니다.

정렬된 기준에서 순위가 구해지고되고

1등을 최우수상, 2등은 우수상, 3등은 장려상을 발행하도록 프로그래밍하였습니다.

 

여기에서 pandas의 활용과 한글 api 호출 방법과

파이썬의 리스트, 딕셔너리를 학습할 수 있습니다.

 

자세한 설명은 첨부된 동영상을 참고해주세요.

 

exam.xlsx
0.01MB
main.py
0.00MB
상장_양식.hwp
0.01MB
FilePathCheckerModuleExample.dll
0.21MB

강의 소스코드

import pandas as pd
import shutil
import win32com.client as win32
# import time

#pip install pandas
#pip install xlrd
#pip install pywin32
#pip install openpyxl

df = pd.read_excel('exam.xlsx', sheet_name='Sheet1')
# print(df.loc[:,'국어':'수학'].mean(axis=1))
# print(df)

#평균, 총점, 최대, 최소 구하여 추가하기
avr = df.mean(axis=1)
total = df.sum(axis=1)
max = df.max(axis=1)
min = df.min(axis=1)

df['최대'] =  max
df['최소'] =  min
df['총점'] = total
df['평균'] = avr
# print(df)

#평균 점수를 기준으로 내림차순 정렬하기
df = df.sort_values(by='평균', ascending=False)
# print(df)

#index 정리하기
df = df.reset_index(drop=True)
# print(df)

#평균 80점 이상만 가져오기
df2 = df.loc[df['평균']>80]
# print(df2)

#내가 원하는 형태로 출력해 보기
print()
for i in df2.columns:
    print(i, end='\t')
print()

for i in range(len(df2)):
    for col in df2.columns:
        val = df2.loc[i,[col]].values[0]
        # print(type(val))
        if str(type(val)) == "<class 'numpy.float64'>":
            print(f"{val:0.2f}", end='\t')
        else:
            print(val,end='\t')
    print()

#엑셀파일로 저장하기
# df2.to_excel('result.xlsx',sheet_name='Sheet1')

#######################################################
## 한글 자동화 API
#######################################################
#1. 상위 3명을 가져와 상주기
award = ['최우수상', '우수상', '장려상']
infor = []
for i, na in enumerate(df2['이름']):
    if i > len(award)-1:
        break
    dic = {
        'index':i+1,
        'name':na,
        'rangking':award[i],
        'year':2021,
        'month':4,
        'day':26
    }
    infor.append(dic)

print(infor)

#2. 파일복사
shutil.copyfile(r"./상장_양식.hwp", r"./상장_출력.hwp")

#3. 한글열기
""" 개발문서
 https://www.hancom.com/board/devmanualList.do?artcl_seq=3934
"""
hwp = win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

#4. 보안모듈 적용
""" 보안모듈
https://www.hancom.com/board/devdataView.do?board_seq=47&artcl_seq=4085&pageInfo.page=&search_text=
HKEY_CURRENT_USER\SOFTWARE\HNC\HwpAutomation\Modules
"""
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")

#5. 복사한 한글 열기
# 반드시 절대경로(전체경로)를 넣어주어야 함 !!!!!
hwp.Open(r"D:\Etc\programming 강의\Debugging_210426_pandas_한글\work\상장_출력.hwp")

#6. 한글 누름틀 목록 불러오기
print('\n', hwp.GetFieldList())
field_list = [i for i in hwp.GetFieldList().split("\x02")]
print('\n', field_list)

#7. 내용 복사
hwp.Run('SelectAll')  # Ctrl-A (전체선택)
hwp.Run('Copy')  # Ctrl-C (복사)
hwp.MovePos(3)  # 문서 끝으로 이동

#8. 내용 붙여넣기
for i in range(len(infor)-1):
    hwp.Run('Paste')  # Ctrl-V (붙여넣기)
    hwp.MovePos(3)  # 문서 끝으로 이동

hwp.MovePos(2) #처음 으로 이동하기
# time.sleep(3)
#9. 내용 넣기
for page in range(len(infor)):
    for field in field_list:
        # time.sleep(1)
        # print(field)
        # hwp.MoveToField(f'{field}{{{{{page}}}}}')  #name{{0}}
        hwp.PutFieldText(f'{field}{{{{{page}}}}}', infor[page][field])

 

반응형