1. 기획

이번에는 엑셀로 뽑는 방법에 대해 알아보도록 하겠습니다.

2. 코드

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QToolTip
from PyQt5.QtGui import QIcon, QPixmap, QFont
from PyQt5.QtCore import QCoreApplication, QDateTime
import requests
from bs4 import BeautifulSoup
import xlsxwriter

class 자동재무보고서(QWidget):
    def __init__(self):
        super().__init__()
        self.UI초기화()

    def UI초기화(self):
        self.제목라벨 = QLabel('(주)캣네생선', self)
        self.제목라벨.move(50, 50)
        self.제목라벨.setFont(QFont('Helvetica', pointSize=20, weight=2))

        self.시총라벨 = QLabel('시가총액 : - 원', self)
        self.시총라벨.move(50, 110)

        self.시총순위라벨 = QLabel('시가총액 순위 : 위니브 월드 - 위', self)
        self.시총순위라벨.move(50, 140)

        self.현재가 = QLabel('현재가 : - 원', self)
        self.현재가.move(50, 170)

        self.최고최저가 = QLabel('52주 최고 | 52주 최저 : - 원 | - 원', self)
        self.최고최저가.move(50, 200)

        self.배당율 = QLabel('배당율 : - %', self)
        self.배당율.move(50, 230)

        self.오픈날짜 = QLabel('오픈날짜 : 2020년 1월 1일', self)
        self.오픈날짜.move(50, 260)

        self.오픈된날짜 = QLabel('오픈된날짜 : - 일', self)
        self.오픈된날짜.move(50, 290)

        self.매출비용순익 = QLabel('매출/비용/순익 : -원/-원/-원', self)
        self.매출비용순익.move(50, 320)

        작성버튼 = QPushButton('재무 보고서 작성', self)
        작성버튼.move(30, 430)
        작성버튼.resize(340, 50)
        작성버튼.clicked.connect(self.write)

        엑셀버튼 = QPushButton('엑셀 보고서 작성', self)
        엑셀버튼.move(30, 490)
        엑셀버튼.resize(340, 50)
        엑셀버튼.clicked.connect(self.excel)

        종료버튼 = QPushButton('프로그램 종료', self)
        종료버튼.move(30, 550)
        종료버튼.resize(340, 50)
        종료버튼.clicked.connect(self.close)

        self.대표이미지 = QLabel(self)
        self.대표이미지.setPixmap(QPixmap('img/weniv-licat.png').scaled(35, 44))
        self.대표이미지.move(10, 10)

        self.setWindowTitle('재무 보고서를 만들어라!')
        self.setWindowIcon(QIcon('img/weniv-licat.png'))
        self.setGeometry(800, 300, 400, 630)
        self.show()

    def write(self):
        url = '<http://paullab.co.kr/stock.html>'
        response = requests.get(url)
        response.encoding = 'utf-8'
        html = response.text
        soup = BeautifulSoup(html, 'html.parser')

        values = soup.select('.tables td')
        # print(values)
        self.시총라벨값 = values[0].text
        self.시총라벨.setText(f'시가총액 : {values[0].text}')
        self.시총라벨.resize(400, 20)

        self.시총순위라벨값 = values[1].text
        self.시총순위라벨.setText(f'시가총액 순위 : {values[1].text}')
        self.시총순위라벨.resize(400, 20)

        self.현재가값 = values[3].text
        self.현재가.setText(f'현재가 : {values[3].text}')
        self.현재가.resize(400, 20)

        s = values[4].text.strip().replace('\\n', '').split('l')
        # print(s)
        self.최고최저가값 = f'{s[0]} | {s[1]}'
        self.최고최저가.setText(f'52주 최고 | 52주 최저 : {s[0]} | {s[1]}')
        self.최고최저가.resize(400, 20)

        i = values[5].text.strip()
        # print(i)
        self.배당율.setText(f'배당율 : {i}')
        self.배당율.resize(400, 20)

        self.매출값 = values[6].text
        self.비용값 = values[7].text
        self.순익값 = values[8].text
        self.매출비용순익.setText(f'매출/비용/순익 :\\n{values[6].text}\\n / {values[7].text}\\n / {values[8].text}')
        self.매출비용순익.resize(400, 80)

        day = QDateTime(2020, 1, 1, 00, 00, 00)
        # print(type(day))
        # print(dir(day))
        day = str(day.daysTo(QDateTime.currentDateTime()))
        self.오픈된날짜계산값 = day
        self.오픈된날짜.setText(f'오픈된 날짜 : {day} 일')
        self.오픈된날짜.resize(400, 20)

    def excel(self):
        workbook = xlsxwriter.Workbook('재무보고서.xlsx')
        worksheet = workbook.add_worksheet('보고서')
        
        #셀 안에 문자값 입력하기
        worksheet.write('A1', '시가총액')
        worksheet.write('A2', '시가총액순위')
        worksheet.write('A3', '현재가')
        worksheet.write('A4', '52주최고|최저')
        worksheet.write('A5', '오픈날짜')
        worksheet.write('A6', '오픈된날짜')
        worksheet.write('A7', '매출')
        worksheet.write('A8', '비용')
        worksheet.write('A9', '순익')

        worksheet.write('B1', self.시총라벨값)
        worksheet.write('B2', self.시총순위라벨값)
        worksheet.write('B3', self.현재가값)
        worksheet.write('B4', self.최고최저가값)
        worksheet.write('B5', '2020. 1. 1.')
        worksheet.write('B6', self.오픈된날짜계산값)
        worksheet.write('B7', self.매출값)
        worksheet.write('B8', self.비용값)
        worksheet.write('B9', self.순익값)

        workbook.close()

    def close(self):
        return QCoreApplication.instance().quit()

프로그램무한반복 = QApplication(sys.argv)
실행인스턴스 = 자동재무보고서()
프로그램무한반복.exec_()

3. 상세 내용

엑셀라이터는 엑셀을 다룰 수 있는 파이썬 모듈로 다른 라이브러리와 비교해보더라도 훌륭하게 엑셀을 다를 수있는 모듈입니다. 자세한 비교내용, 모듈의 사용법은 아래 무료책으로 공개해두었습니다. 혹시 더 궁금하신 분은 아래 내용을 참고해주세요.

xlsxwriter 튜토리얼로 배우는 Python 엑셀 프로그래밍

해당 내용은 좀 더 상세한 영상강의로도 나와 있습니다.

Python 엑셀 프로그래밍 - with xlsxwriter - 인프런

우선 엑셀라이터를 설치해주세요! PowerShell 창에서 입력하셔도 좋고, 만약 Visual Studio Code를 사용하고 있으시다면 Terminal 창에서 입력하셔도 좋습니다.

pip3 install xlsxwriter

Excel의 구성

Excel에 개념인 Workbook, Worksheet, Cell 등이 이 모듈에서 그대로 사용됩니다.

  1. Workbook

    하나의 Excel 파일이라 생각하시면 됩니다. Workbook 안에는 Worksheet 생성이 가능합니다. 또한 Excel과 같이 여러 Worksheet를 생성하여 작업이 가능합니다.

  2. Worksheet

    Worksheet를 생성해야 그 안에 포함되는 Cell에 값을 입력하는 등의 작업이 가능합니다. 아래와 같이 엑셀 좌측 하단에 있는 Sheet입니다.

    https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a8c580d8-6ee8-48cf-bfd4-c97eee7a4e7d/Untitled.png