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()