1. 개요
회사에서 업무를 진행하게 되는데, 예산 관련 업무를 진행하다 보면 귀찮을 때도 많고 실수할까봐 많은 걱정을 하게됩니다.
또한 보고서도 작성해야하니... 여간 귀찮은게 아닙니다.
원래 프로그래밍이란게 사람의 귀찮이즘이 원천이라고 생각합니다!!
한 귀찮이즘하는 저도 한번 대충 만들어 보겠습니다.
사용할 프로그램은 Python입니다.
문서는 docx로 작성할 예정이고, 우리가 보통 사용하는 Excel을 참고해서 하도록 하겠습니다.
구조는 아래와 같습니다.
Report
├ Data
├ Output
├ Templates
├ main.py
└ Report_Generator.py
사실 이 코딩은 보고서 뿐만 아니라 각종 과제 제출에도 용이합니다~
먼저 Data 폴더에는 우리가 사용하는 Excel파일을 넣어주면됩니다.
저 같은 경우는 이런 예시 Excel 파일을 가져왔습니다.
카테고리, 품목, 수량, 금액으로 나뉘어져 있습니다.
2. Main.py 작성
main을 작성해 보겠습니다.
import tkinter as tk
from tkinter import filedialog, messagebox
from report_generator import generate_report
def select_excel_file():
filepath = filedialog.askopenfilename(filetypes=[("Excel Files", "*.xlsx")])
if filepath:
output_path = generate_report(filepath)
messagebox.showinfo("완료", f"보고서가 생성되었습니다:\n{output_path}")
root = tk.Tk()
root.title("예산 보고서 생성기")
button = tk.Button(root, text="엑셀 파일 선택하여 보고서 생성", command=select_excel_file, height=3, width=40)
button.pack(padx=20, pady=30)
root.mainloop()
이 코드는 Tkinter를 사용해서 만든 간단한 GUI 프로그램으로, 사용자가 엑셀 파일을 선택하면 그 파일을 기반으로 보고서를 자동 생성하는 기능을 합니다.
- tkinter: GUI를 만들기 위한 Python 기본 라이브러리
- filedialog: 파일 선택 창 열기 기능
- messagebox: 메시지(알림) 창을 띄우기 위한 기능
- report_generator는 따로 만든 파일에서 generate_report() 함수만 가져온 것
→ 이 함수가 엑셀 파일을 받아서 보고서를 생성함 - select_excel_file()는 버튼을 눌렀을 때 실행될 함수
- filedialog.askopenfilename() → 엑셀 파일 선택창을 띄움
- .xlsx 확장자만 보이도록 필터 설정
- 선택한 파일이 있으면 generate_report(filepath)를 실행해서 보고서를 생성
- 결과 경로(output_path)를 메시지 박스로 표현
- Tkinter GUI를 계속 실행시키는 메인 루프
- 사용자가 창을 닫기 전까지 프로그램이 계속 작동되게 함
3. Report_Generator.py 작성
다음은 Report_Generator를 살펴보겠습니다.
import pandas as pd
import matplotlib.pyplot as plt
from docx import Document
from docx.shared import Inches
import matplotlib
import os
import datetime
matplotlib.rcParams['font.family'] = 'Malgun Gothic'
matplotlib.rcParams['axes.unicode_minus'] = False
from matplotlib import font_manager, rc
font_path = "C:/Windows/Fonts/malgun.ttf"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
def generate_report(excel_path):
df = pd.read_excel(excel_path)
grouped = df.groupby("카테고리")["금액"].sum()
total = grouped.sum()
plt.figure(figsize=(6, 4))
grouped.plot(kind="bar", color="skyblue")
plt.title("카테고리별 예산 분포")
plt.ylabel("금액")
plt.tight_layout()
os.makedirs("output", exist_ok=True)
graph_path = "output/budget_graph.png"
plt.savefig(graph_path)
plt.close()
doc = Document("templates/report_template.docx")
today = datetime.date.today().strftime("%Y. %m. %d. (%a)")
doc.paragraphs[1].text = f"{today}"
doc.add_heading("1. 개요", level=1)
doc.add_paragraph("2025년 하반기 예산 집행 보고서입니다.")
doc.add_heading("2. 세부 현황", level=1)
doc.add_paragraph(f"총 예산: {total:,.0f}원")
doc.add_paragraph("\n카테고리별 예산:")
for cat, val in grouped.items():
doc.add_paragraph(f"- {cat}: {val:,.0f}원")
doc.add_picture(graph_path, width=Inches(5.5))
doc.add_heading("3. 결론", level=1)
doc.add_paragraph("예산은 계획에 따라 적절히 집행되었습니다.")
output_path = f"output/예산보고서_{datetime.date.today()}.docx"
doc.save(output_path)
return output_path
- 데이터 처리: pandas
- 시각화: matplotlib.pyplot
- 문서 작업: python-docx (Word 문서 생성)
- 그래프에 한글이 깨지지 않게 하기 위한 ‘맑은 고딕’ 폰트 지정
- 엑셀 파일을 읽어서 DataFrame(df)으로 저장
- "카테고리"별로 "금액"을 합산하여 그룹화
- 총 금액도 계산
- 그룹화된 데이터를 막대그래프로 시각화
- output/ 폴더에 budget_graph.png로 저장
- 그래프 이미지 파일은 Word 문서에 삽입
- 기존 템플릿(templates/report_template.docx) 불러오기
- 템플릿의 두 번째 문단에 오늘 날짜 삽입
- 총 예산 및 카테고리별 예산을 항목별로 표시
- :,.0f 포맷은 숫자를 천 단위 쉼표, 소수점 없이 출력
이렇게 설명할 수 있습니다.
그러면 한번 실행해 보겠습니다.
4. 결과 확인
이게 시스템 영역을 건들여서 하다보니 관리자 권한으로 사용하셔야합니다.
관리자 모드로 실행한 cmd창에서 실행하면 tkinter가 생성됩니다.
아래 버튼을 누르고 Data폴더에 넣은 Excel 파일을 선택해줍니다.
그러면 보고서가 생성되었습니다. 라는 문구가 나오면서 완료가 됩니다.
이름은 보고서_만든날짜로 잘 되어있습니다.
이처럼 문서가 작성되게 됩니다.
제가 Temple폴더에 간단하게 작성해 놓은대로 잘 나왔네요.
이처럼 코딩을 사용하면 편리하게 문서를 만들 수 있습니다~
'python' 카테고리의 다른 글
HTTP 서버와 통신(웹 요청) (0) | 2023.08.23 |
---|---|
FTP 서버 익스플로잇[FTP Server Exploit] (0) | 2023.08.03 |
VM를 활용한 FTP소켓 통신 - 2 (0) | 2023.07.28 |
VM를 활용한 FTP소켓 통신 - 1 (0) | 2023.07.28 |
파이썬(Python) 에코 클라이언트, 서버 구현 (0) | 2023.07.26 |
댓글