Как подставить данные из таблицы Pyqt5 в таблицу шаблон в word?
Я создал таблицу в qt designer и вывожу данные с нее в массив. Но, как сделать так чтоб данные автоматические вставлялись в уже готовый документ word в определенные ячейки в таблице?
pattern_gui.py
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(640, 475)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.tabWidget = QTabWidget(self.centralwidget)
self.tabWidget.setObjectName(u"tabWidget")
self.tab = QWidget()
self.tab.setObjectName(u"tab")
self.gridLayout_5 = QGridLayout(self.tab)
self.gridLayout_5.setObjectName(u"gridLayout_5")
self.gridLayout_3 = QGridLayout()
self.gridLayout_3.setObjectName(u"gridLayout_3")
self.pushButton_2 = QPushButton(self.tab)
self.pushButton_2.setObjectName(u"pushButton_2")
self.gridLayout_3.addWidget(self.pushButton_2, 5, 0, 1, 1)
self.lineEdit = QLineEdit(self.tab)
self.lineEdit.setObjectName(u"lineEdit")
self.gridLayout_3.addWidget(self.lineEdit, 1, 0, 1, 1)
self.label_2 = QLabel(self.tab)
self.label_2.setObjectName(u"label_2")
self.gridLayout_3.addWidget(self.label_2, 2, 0, 1, 1)
self.label = QLabel(self.tab)
self.label.setObjectName(u"label")
self.gridLayout_3.addWidget(self.label, 0, 0, 1, 1)
self.lineEdit_2 = QLineEdit(self.tab)
self.lineEdit_2.setObjectName(u"lineEdit_2")
self.gridLayout_3.addWidget(self.lineEdit_2, 3, 0, 1, 1)
self.pushButton = QPushButton(self.tab)
self.pushButton.setObjectName(u"pushButton")
self.gridLayout_3.addWidget(self.pushButton, 4, 0, 1, 1)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.gridLayout_3.addItem(self.verticalSpacer, 6, 0, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout_3, 0, 2, 1, 1)
self.gridLayout_4 = QGridLayout()
self.gridLayout_4.setObjectName(u"gridLayout_4")
self.lineEdit_3 = QLineEdit(self.tab)
self.lineEdit_3.setObjectName(u"lineEdit_3")
self.gridLayout_4.addWidget(self.lineEdit_3, 1, 0, 1, 1)
self.label_4 = QLabel(self.tab)
self.label_4.setObjectName(u"label_4")
self.gridLayout_4.addWidget(self.label_4, 2, 0, 1, 1)
self.lineEdit_4 = QLineEdit(self.tab)
self.lineEdit_4.setObjectName(u"lineEdit_4")
self.gridLayout_4.addWidget(self.lineEdit_4, 3, 0, 1, 1)
self.lineEdit_5 = QLineEdit(self.tab)
self.lineEdit_5.setObjectName(u"lineEdit_5")
self.gridLayout_4.addWidget(self.lineEdit_5, 5, 0, 1, 1)
self.label_5 = QLabel(self.tab)
self.label_5.setObjectName(u"label_5")
self.gridLayout_4.addWidget(self.label_5, 4, 0, 1, 1)
self.label_6 = QLabel(self.tab)
self.label_6.setObjectName(u"label_6")
self.gridLayout_4.addWidget(self.label_6, 6, 0, 1, 1)
self.label_3 = QLabel(self.tab)
self.label_3.setObjectName(u"label_3")
self.gridLayout_4.addWidget(self.label_3, 0, 0, 1, 1)
self.lineEdit_6 = QLineEdit(self.tab)
self.lineEdit_6.setObjectName(u"lineEdit_6")
self.gridLayout_4.addWidget(self.lineEdit_6, 7, 0, 1, 1)
self.label_7 = QLabel(self.tab)
self.label_7.setObjectName(u"label_7")
self.gridLayout_4.addWidget(self.label_7, 8, 0, 1, 1)
self.lineEdit_7 = QLineEdit(self.tab)
self.lineEdit_7.setObjectName(u"lineEdit_7")
self.gridLayout_4.addWidget(self.lineEdit_7, 9, 0, 1, 1)
self.gridLayout_5.addLayout(self.gridLayout_4, 0, 0, 1, 1)
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.gridLayout_5.addItem(self.horizontalSpacer, 0, 1, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QWidget()
self.tab_2.setObjectName(u"tab_2")
self.gridLayout_2 = QGridLayout(self.tab_2)
self.gridLayout_2.setObjectName(u"gridLayout_2")
self.tableWidget = QTableWidget(self.tab_2)
if (self.tableWidget.columnCount() < 10):
self.tableWidget.setColumnCount(10)
__qtablewidgetitem = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
__qtablewidgetitem1 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
__qtablewidgetitem2 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, __qtablewidgetitem2)
__qtablewidgetitem3 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, __qtablewidgetitem3)
__qtablewidgetitem4 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, __qtablewidgetitem4)
__qtablewidgetitem5 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, __qtablewidgetitem5)
__qtablewidgetitem6 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, __qtablewidgetitem6)
__qtablewidgetitem7 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, __qtablewidgetitem7)
__qtablewidgetitem8 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, __qtablewidgetitem8)
__qtablewidgetitem9 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, __qtablewidgetitem9)
if (self.tableWidget.rowCount() < 10):
self.tableWidget.setRowCount(10)
__qtablewidgetitem10 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, __qtablewidgetitem10)
__qtablewidgetitem11 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, __qtablewidgetitem11)
__qtablewidgetitem12 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(2, __qtablewidgetitem12)
__qtablewidgetitem13 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(3, __qtablewidgetitem13)
__qtablewidgetitem14 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(4, __qtablewidgetitem14)
__qtablewidgetitem15 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(5, __qtablewidgetitem15)
__qtablewidgetitem16 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(6, __qtablewidgetitem16)
__qtablewidgetitem17 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(7, __qtablewidgetitem17)
__qtablewidgetitem18 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(8, __qtablewidgetitem18)
__qtablewidgetitem19 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(9, __qtablewidgetitem19)
self.tableWidget.setObjectName(u"tableWidget")
self.tableWidget.horizontalHeader().setDefaultSectionSize(125)
self.gridLayout_2.addWidget(self.tableWidget, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.tab_3 = QWidget()
self.tab_3.setObjectName(u"tab_3")
self.gridLayout_6 = QGridLayout(self.tab_3)
self.gridLayout_6.setObjectName(u"gridLayout_6")
self.widget = QWidget(self.tab_3)
self.widget.setObjectName(u"widget")
self.gridLayout_6.addWidget(self.widget, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_3, "")
self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 640, 21))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(1)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d", None))
self.label_2.setText(QCoreApplication.translate("MainWindow", u"\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f:", None))
self.label.setText(QCoreApplication.translate("MainWindow", u"\u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430:", None))
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c", None))
self.label_4.setText(QCoreApplication.translate("MainWindow", u"\u0414\u0430\u0442\u0430:", None))
self.label_5.setText(QCoreApplication.translate("MainWindow", u"\u0417\u0430\u044f\u0432\u043a\u0430/\u0434\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u0432", None))
self.label_6.setText(QCoreApplication.translate("MainWindow", u"\u041e\u0431\u044c\u0435\u043a\u0442 \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f:", None))
self.label_3.setText(QCoreApplication.translate("MainWindow", u"\u041d\u043e\u043c\u0435\u0440 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430:", None))
self.label_7.setText(QCoreApplication.translate("MainWindow", u"\u041c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0430:", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435", None))
___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0)
___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"\u0414\u0430\u0442\u0430", None));
___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1)
___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"\u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f, \u0447\u0430\u0441", None));
___qtablewidgetitem2 = self.tableWidget.horizontalHeaderItem(2)
___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", u" pH,\n"
"\u0435\u0434. pH\n"
"", None));
___qtablewidgetitem3 = self.tableWidget.horizontalHeaderItem(3)
___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", u"\u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u00b1\u0394,\n"
"\u0435\u0434. pH \n"
"", None));
___qtablewidgetitem4 = self.tableWidget.horizontalHeaderItem(4)
___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u" \u0421(Fe \u043e\u0431\u0449.),\n"
"\u043c\u0433/\u0434\u043c3\n"
"", None));
___qtablewidgetitem5 = self.tableWidget.horizontalHeaderItem(5)
___qtablewidgetitem5.setText(QCoreApplication.translate("MainWindow", u"\u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u00b1\u0394,\n"
" \u043c\u0433/\u0434\u043c3\n"
"", None));
___qtablewidgetitem6 = self.tableWidget.horizontalHeaderItem(6)
___qtablewidgetitem6.setText(QCoreApplication.translate("MainWindow", u"\u0421(\u0421\u041e2),\n"
"\u043c\u0433/\u0434\u043c3\n"
"", None));
___qtablewidgetitem7 = self.tableWidget.horizontalHeaderItem(7)
___qtablewidgetitem7.setText(QCoreApplication.translate("MainWindow", u"\u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u00b1\u0394,\n"
"\u043c\u0433/\u0434\u043c3 \n"
"", None));
___qtablewidgetitem8 = self.tableWidget.horizontalHeaderItem(9)
___qtablewidgetitem8.setText(QCoreApplication.translate("MainWindow", u"\u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u00b1\u0394,", None));
___qtablewidgetitem9 = self.tableWidget.verticalHeaderItem(0)
___qtablewidgetitem9.setText(QCoreApplication.translate("MainWindow", u"1", None));
___qtablewidgetitem10 = self.tableWidget.verticalHeaderItem(1)
___qtablewidgetitem10.setText(QCoreApplication.translate("MainWindow", u"2", None));
___qtablewidgetitem11 = self.tableWidget.verticalHeaderItem(2)
___qtablewidgetitem11.setText(QCoreApplication.translate("MainWindow", u"3", None));
___qtablewidgetitem12 = self.tableWidget.verticalHeaderItem(3)
___qtablewidgetitem12.setText(QCoreApplication.translate("MainWindow", u"4", None));
___qtablewidgetitem13 = self.tableWidget.verticalHeaderItem(4)
___qtablewidgetitem13.setText(QCoreApplication.translate("MainWindow", u"5", None));
___qtablewidgetitem14 = self.tableWidget.verticalHeaderItem(5)
___qtablewidgetitem14.setText(QCoreApplication.translate("MainWindow", u"6", None));
___qtablewidgetitem15 = self.tableWidget.verticalHeaderItem(6)
___qtablewidgetitem15.setText(QCoreApplication.translate("MainWindow", u"7", None));
___qtablewidgetitem16 = self.tableWidget.verticalHeaderItem(7)
___qtablewidgetitem16.setText(QCoreApplication.translate("MainWindow", u"8", None));
___qtablewidgetitem17 = self.tableWidget.verticalHeaderItem(8)
___qtablewidgetitem17.setText(QCoreApplication.translate("MainWindow", u"9", None));
___qtablewidgetitem18 = self.tableWidget.verticalHeaderItem(9)
___qtablewidgetitem18.setText(QCoreApplication.translate("MainWindow", u"10", None));
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u0422\u0430\u0431\u043b\u0438\u0446\u0430", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), QCoreApplication.translate("MainWindow", u"\u0413\u0440\u0430\u0444\u0438\u043a", None))
# retranslateUi
Имеющиеся логика:
pattern_log.py
# Импорт библиотек
import os
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from pattern_gui import Ui_MainWindow
from docxtpl import DocxTemplate
import docx
# Новый экземпляр QApplication
app = QApplication(sys.argv)
Window = QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(Window)
Window.setFixedSize(640, 480)
Window.show()
def buttonLoader():
rows = ui.tableWidget.rowCount()
cols = ui.tableWidget.columnCount()
data = []
for row in range(rows):
tmp = []
for col in range(cols):
try:
tmp.append(ui.tableWidget.item(row, col).text())
except:
tmp.append('')
data.append(tmp)
data_for_word = []
# for i in data: print(i)
for i in data:
if i[0] != '':
data_for_word.append(i)
# добавляем таблицу
doc = docx.Document()
table = doc.add_table(rows=len(data_for_word), cols=3)
# применяем стиль для таблицы
table.style = 'Table Grid'
# заполняем таблицу данными
for row in range(len(data_for_word)):
for col in range(3):
print(str(data_for_word[row][col]))
# получаем ячейку таблицы
cell = table.cell(row, col)
# записываем в ячейку данные
cell.text = str(data_for_word[row][col])
doc.save('table.docx')
ui.pushButton_2.clicked.connect(buttonLoader)
# Закрытие программы
sys.exit(app.exec_())
Если кто знает то покажите на моем коде или на своем примере как сделать так как я писал выше. Таблица вот такого вида:

Ответы (1 шт):
Если есть шаблон, который нужно заполнить, загружайте его через DocxTemplate() и потом заполняйте, а не создавайте новый пустой документ через docx.Document().
Для вывода в шаблон из вопроса нужно заполнить список data_for_word словарями, каждый словарь — это строка в таблице, в каждом из этих словарей ключ соответствует названию ячейки (то что в шаблоне идет после точки), значения — значение в этой ячейке.
Для шаблона из вопроса заполнение будет выглядеть так:
from docxtpl import DocxTemplate
...
data_for_word = []
for item in data:
data_for_word.append({
"data": item[0],
"time": item[1],
"ph": item[2],
"ph2": item[3],
"fe": item[4],
"pm": item[5],
"co2": item[6],
"pm2": item[7],
"pm3": item[8]
})
doc = DocxTemplate('template.docx') # Загрузить шаблон (создать новый документ по шаблону)
context = {
'tbl_contents': data_for_word
}
doc.render(context) # Заполнить шаблон по данным из context
doc.save('table.docx') # Сохранить в новый файл
Строки, состоящие только из пустых ячеек будут выводиться пустыми строками. Если они не нужны, нужно в цикле добавить такую проверку:
for item in data:
# Проверяем, что хотя бы одно значение в строке не пустое
# (даст истину, если в item хотя бы один элемент не пустая строка)
if any(item):
data_for_word.append({
"data": item[0],
"time": item[1],
"ph": item[2],
"ph2": item[3],
"fe": item[4],
"pm": item[5],
"co2": item[6],
"pm2": item[7],
"pm3": item[8]
})

