PyQt5 + OpenPyXl

Есть задача по автоматизации заполнения Excel отчетов по заданной форме, написано тестовое приложение

from PyQt5 import QtWidgets
from openpyxl import load_workbook
from another import Ui_BaseClass
from datetime import datetime
import sys

ru = {'01': 'января', '02': 'февраля', '03': 'марта', '04': 'апреля', '05': 'мая', '06': 'июня', '07': 'июля',
      '08': 'августа', '09': 'сентября', '10': 'октября', '11': 'ноября', '12': 'декабря'}


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.ui = Ui_BaseClass()
        self.ui.setupUi(self)
        self.ui.save_next_pushButton.clicked.connect(self.bnt_click_save)
        self.ui.save_pushButton.clicked.connect(self.bnt_click_end)
        self.ui.start_dateEdit.setDate(datetime.now())
        self.ui.stop_dateEdit.setDate(datetime.now())

    def paste_data(self):
        wb = load_workbook(filename='src/example.xlsx')
        template = wb.active

        target = wb.copy_worksheet(template)
        target['AG3'] = self.ui.prj_name_Edit.text()
        target['AW70'] = self.ui.work_now_Edit.text()
        target['AS102'] = self.ui.work_next_Edit.text()

        date_start = self.ui.start_dateEdit.text()
        split_start_date = date_start.split(sep='.')
        date_stop = self.ui.stop_dateEdit.text()
        split_stop_date = date_stop.split(sep='.')

        target['AA93'] = split_start_date[0]
        target['AF93'] = ru.get(split_start_date[1])
        target['AU93'] = split_start_date[2] + 'г.'

        target['AA95'] = split_stop_date[0]
        target['AF95'] = ru.get(split_stop_date[1])
        target['AU95'] = split_stop_date[2] + 'г.'

        target.print_area = 'A1:CQ138'
        wb.save('new_document.xlsx')

    def bnt_click_save(self):
        self.paste_data()

    def bnt_click_end(self):
        wb = load_workbook(filename='src/example.xlsx')
        template = wb.active

        date_start = self.ui.start_dateEdit.text()
        split_start_date = date_start.split(sep='.')

        date_stop = self.ui.stop_dateEdit.text()
        split_stop_date = date_stop.split(sep='.')

        target = wb.copy_worksheet(template)
        target['AG3'] = self.ui.prj_name_Edit.text()
        target['AW70'] = self.ui.work_now_Edit.text()
        target['AS102'] = self.ui.work_next_Edit.text()

        target['AA93'] = split_start_date[0]
        target['AF93'] = ru.get(split_start_date[1])
        target['AU93'] = split_start_date[2] + 'г.'

        target['AA95'] = split_stop_date[0]
        target['AF95'] = ru.get(split_stop_date[1])
        target['AU95'] = split_stop_date[2] + 'г.'

        target.print_area = 'A1:CQ138'

        wb.remove(template)
        wb.save('new_document.xlsx')
        wb.close()


def test_app():
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()

    sys.exit(app.exec_())


if __name__ == "__main__":
    test_app()

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_BaseClass(object):
    def setupUi(self, BaseClass):
        BaseClass.setObjectName("BaseClass")
        BaseClass.resize(637, 600)
        self.centralwidget = QtWidgets.QWidget(BaseClass)
        self.centralwidget.setObjectName("centralwidget")
        self.prj_name = QtWidgets.QLabel(self.centralwidget)
        self.prj_name.setGeometry(QtCore.QRect(119, 90, 81, 16))
        self.prj_name.setObjectName("prj_name")
        self.save_next_pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.save_next_pushButton.setGeometry(QtCore.QRect(150, 250, 161, 28))
        self.save_next_pushButton.setObjectName("save_next_pushButton")
        self.prj_name_Edit = QtWidgets.QLineEdit(self.centralwidget)
        self.prj_name_Edit.setGeometry(QtCore.QRect(199, 90, 281, 22))
        self.prj_name_Edit.setObjectName("prj_name_Edit")
        self.work_now_Edit = QtWidgets.QLineEdit(self.centralwidget)
        self.work_now_Edit.setGeometry(QtCore.QRect(199, 120, 281, 22))
        self.work_now_Edit.setObjectName("work_now_Edit")
        self.work_now_label = QtWidgets.QLabel(self.centralwidget)
        self.work_now_label.setGeometry(QtCore.QRect(19, 120, 181, 20))
        self.work_now_label.setObjectName("work_now_label")
        self.work_next_label = QtWidgets.QLabel(self.centralwidget)
        self.work_next_label.setGeometry(QtCore.QRect(69, 150, 131, 20))
        self.work_next_label.setObjectName("work_next_label")
        self.work_next_Edit = QtWidgets.QLineEdit(self.centralwidget)
        self.work_next_Edit.setGeometry(QtCore.QRect(199, 150, 281, 22))
        self.work_next_Edit.setObjectName("work_next_Edit")
        self.start_dateEdit = QtWidgets.QDateEdit(self.centralwidget)
        self.start_dateEdit.setGeometry(QtCore.QRect(199, 190, 110, 22))
        self.start_dateEdit.setCalendarPopup(True)
        self.start_dateEdit.setDate(QtCore.QDate(2024, 3, 19))
        self.start_dateEdit.setObjectName("start_dateEdit")
        self.date_start_label = QtWidgets.QLabel(self.centralwidget)
        self.date_start_label.setGeometry(QtCore.QRect(79, 190, 121, 20))
        self.date_start_label.setObjectName("date_start_label")
        self.date_stop_label = QtWidgets.QLabel(self.centralwidget)
        self.date_stop_label.setGeometry(QtCore.QRect(324, 190, 141, 20))
        self.date_stop_label.setObjectName("date_stop_label")
        self.stop_dateEdit = QtWidgets.QDateEdit(self.centralwidget)
        self.stop_dateEdit.setGeometry(QtCore.QRect(464, 190, 110, 22))
        self.stop_dateEdit.setCalendarPopup(True)
        self.stop_dateEdit.setDate(QtCore.QDate(2024, 3, 19))
        self.stop_dateEdit.setObjectName("stop_dateEdit")
        self.save_pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.save_pushButton.setGeometry(QtCore.QRect(340, 250, 151, 28))
        self.save_pushButton.setObjectName("save_pushButton")
        BaseClass.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(BaseClass)
        self.statusbar.setObjectName("statusbar")
        BaseClass.setStatusBar(self.statusbar)

        self.retranslateUi(BaseClass)
        QtCore.QMetaObject.connectSlotsByName(BaseClass)

    def retranslateUi(self, BaseClass):
        _translate = QtCore.QCoreApplication.translate
        BaseClass.setWindowTitle(_translate("BaseClass", "MainWindow"))
        self.prj_name.setText(_translate("BaseClass", "Код проекта"))
        self.save_next_pushButton.setText(_translate("BaseClass", "Сохранить и продолжить"))
        self.work_now_label.setText(_translate("BaseClass", "Освидетельствование работ"))
        self.work_next_label.setText(_translate("BaseClass", "Следующие работы"))
        self.date_start_label.setText(_translate("BaseClass", "Дата начала работ"))
        self.date_stop_label.setText(_translate("BaseClass", "Дата окончания работ"))
        self.save_pushButton.setText(_translate("BaseClass", "Сохранить и закончить"))

Как можно реализовать, чтобы при нажатии кнопки "save_next_pushButton" данные записывались и создавался следующий активный лист с формой для заполнение? При нажатии кнопки "save_pushButton" данные записываются на последний активный лист и происходит сохранение книги с заполненными листами формы. Количество листов отчета заранее не известно


Ответы (1 шт):

Автор решения: Chesh1re

Ответ на вопрос найден, прикладываю пример

from PyQt5 import QtWidgets
from openpyxl import load_workbook
from another import Ui_BaseClass
from datetime import datetime
import sys

ru = {'01': 'января', '02': 'февраля', '03': 'марта', '04': 'апреля', '05': 'мая', '06': 'июня', '07': 'июля',
      '08': 'августа', '09': 'сентября', '10': 'октября', '11': 'ноября', '12': 'декабря'}

wb = load_workbook(filename='src/example.xlsx')
template = wb.active


class Window(QtWidgets.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.ui = Ui_BaseClass()
        self.ui.setupUi(self)
        self.ui.save_next_pushButton.clicked.connect(self.bnt_click_save)
        self.ui.save_pushButton.clicked.connect(self.bnt_click_end)
        self.ui.start_dateEdit.setDate(datetime.now())
        self.ui.stop_dateEdit.setDate(datetime.now())

    def paste_data(self):
        target = wb.copy_worksheet(template)
        target['AG3'] = self.ui.prj_name_Edit.text()
        target['AW70'] = self.ui.work_now_Edit.text()
        target['AS102'] = self.ui.work_next_Edit.text()

        date_start = self.ui.start_dateEdit.text()
        split_start_date = date_start.split(sep='.')
        date_stop = self.ui.stop_dateEdit.text()
        split_stop_date = date_stop.split(sep='.')

        target['AA93'] = split_start_date[0]
        target['AF93'] = ru.get(split_start_date[1])
        target['AU93'] = split_start_date[2] + 'г.'

        target['AA95'] = split_stop_date[0]
        target['AF95'] = ru.get(split_stop_date[1])
        target['AU95'] = split_stop_date[2] + 'г.'

        target.print_area = 'A1:CQ138'

    def bnt_click_save(self):
        self.paste_data()

    def bnt_click_end(self):
        self.paste_data()

        wb.remove(template)
        wb.save('new_document.xlsx')
        wb.close()


def test_app():
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()

    sys.exit(app.exec_())


if __name__ == "__main__":
    test_app()
→ Ссылка