Не могу выводить данные из tableWidget в шаблон Word
Есть программа которая из lineEdit и tableWidget выводит данные в шаблон Word. Но, я не знаю как вывести данные из tableWidget и вставить их параллельно с вставкой из lineEdit.
Код ui, логики и шаблона Word(полный вариант):
- https://disk.yandex.ru/i/KoufIY3aD6ibBA
- https://disk.yandex.ru/d/AaKICjv0fP0pWw
- https://disk.yandex.ru/d/WA2GGWJ-dXsxwQ
Данные выводятся из таблицы tableWidget_3. Как это реализовать???
Минимальный пример: SL_load_date.py
from PyQt5 import QtCore, QtGui, QtWidgets
from load_date import Ui_MainWindow
import sys
import os
from docxtpl import DocxTemplate
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.buttonLoad)
def buttonLoad(self):
date1 = self.lineEdit.text()
date2 = self.lineEdit_2.text()
date3 = self.lineEdit_3.text()
date4 = self.lineEdit_4.text()
doc = DocxTemplate("таблица.docx")
context = {"test1": date1, "test2": date2,
"test3": date3, "test4": date4}
doc.render(context)
doc.save("таблица_ф")
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
load_date.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(640, 480)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout_2.setObjectName("gridLayout_2")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setObjectName("lineEdit")
self.gridLayout.addWidget(self.lineEdit, 0, 0, 1, 1)
self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_3.setObjectName("lineEdit_3")
self.gridLayout.addWidget(self.lineEdit_3, 2, 0, 1, 1)
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setObjectName("lineEdit_2")
self.gridLayout.addWidget(self.lineEdit_2, 1, 0, 1, 1)
self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_4.setObjectName("lineEdit_4")
self.gridLayout.addWidget(self.lineEdit_4, 3, 0, 1, 1)
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
self.tableWidget_3 = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget_3.setObjectName("tableWidget_3")
self.tableWidget_3.setColumnCount(9)
self.tableWidget_3.setRowCount(1)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget_3.setHorizontalHeaderItem(8, item)
self.gridLayout_2.addWidget(self.tableWidget_3, 0, 1, 1, 1)
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setObjectName("pushButton")
self.gridLayout_2.addWidget(self.pushButton, 1, 1, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget_3.verticalHeaderItem(0)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget_3.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(7)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget_3.horizontalHeaderItem(8)
item.setText(_translate("MainWindow", "New Column"))
self.pushButton.setText(_translate("MainWindow", "Загрузить данные"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
таблица.docx
Красным цветом отмечена проблемная таблица.
Ответы (1 шт):
Автор решения: Help_me
→ Ссылка
Попробуйте так:
from PyQt5 import QtCore, QtGui, QtWidgets
from UI_lke2_1 import Ui_SAFTD
from PyQt5.QtCore import QSettings, QDateTime, QDate
from datetime import datetime
from PyQt5.Qt import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from docxtpl import DocxTemplate
from docx2pdf import convert
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg
from docx2pdf import convert
import sys
import os
class MainWindow(QtWidgets.QMainWindow, Ui_SAFTD):
def __init__(self):
super().__init__()
self.setupUi(self)
for row in range(self.tableWidget_3.rowCount()):
date_from = QtWidgets.QDateTimeEdit()
date_from.setDateTime(
QtCore.QDateTime(QtCore.QDate(2021, 8, 26),
QtCore.QTime(15, 12, 33))
)
self.tableWidget_3.setCellWidget(row, 0, date_from)
for row in range(self.tableWidget_3.rowCount()):
date_from = QDateTimeEdit()
date_from.setDateTime(
QDateTime(QDate(2021, 9, 2))
)
date_from.dateTimeChanged.connect(
lambda dateTime, row=row: self.calculationTime(dateTime, row))
self.tableWidget_3.setCellWidget(row, 0, date_from)
self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()
self.pushButton.clicked.connect(self.buttonSaveProject)
self.pushButton_2.clicked.connect(self.buttonExport)
self.toolButton.clicked.connect(self.toolDirectorySave)
self.toolButton_2.clicked.connect(self.toolDirectoryExport)
self.pushButton_7.clicked.connect(self.buttonAddtable2)
self.pushButton_8.clicked.connect(self.buttonDeleteTable2)
self.pushButton_4.clicked.connect(self.buttonAddtable3)
self.pushButton_5.clicked.connect(self.buttonDeleteTable3)
def toolDirectorySave(self):
directory_file = QFileDialog.getExistingDirectory()
directory_file = directory_file + "/"
self.lineEdit_10.setText(directory_file)
def buttonSaveProject(self):
directory_file = self.lineEdit_10.text()
name_folder = self.lineEdit_11.text()
if len(directory_file) > 0 and len(name_folder) > 0:
rows = self.tableWidget_3.rowCount()
cols = self.tableWidget_3.columnCount()
data_for_word = []
for row in range(rows):
tmp = []
for col in range(cols):
if col:
item = self.tableWidget_3.item(row, col)
if col == 1:
item = f'{float(item.text()):.2f}' if item else 'No data'
else:
item = item.text() if item else 'No data'
else:
item = self.tableWidget_3.cellWidget(row, 0). \
dateTime().toString('dd.MM.yyyy hh:mm')
tmp.append(item)
data_for_word.append(tmp)
for i in data_for_word:
print(i)
self.buttonInstallProject(data_for_word)
else:
msg = QMessageBox()
msg.setWindowTitle("Предупреждение")
msg.setText("Поля «Директория сохранения файла» и «Имя сохраняемого файла» пустые")
msg.setIcon(QMessageBox.Warning)
msg.exec_()
def buttonInstallProject(self, data):
data_for_word = []
for item in data:
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]
})
print()
for i in data_for_word:
print(i)
lineEdit = self.lineEdit.text()
lineEdit_2 = self.lineEdit_2.text()
lineEdit_3 = self.lineEdit_3.text()
lineEdit_4 = self.lineEdit_4.text()
lineEdit_5 = self.lineEdit_5.text()
lineEdit_6 = self.lineEdit_6.text()
lineEdit_7 = self.lineEdit_7.text()
lineEdit_8 = self.lineEdit_8.text()
lineEdittime = self.lineEdit_dop_1.text()
lineEdittime_2 = self.lineEdit_dop_2.text()
lineEdittime_3 = self.lineEdit_dop_3.text()
lineEdittime_4 = self.lineEdit_dop_4.text()
lineEdittime_5 = self.lineEdit_dop_5.text()
lineEdittime_6 = self.lineEdit_dop_6.text()
lineEdittime_7 = self.lineEdit_dop_7.text()
lineEdittime_8 = self.lineEdit_dop_8.text()
lineEdittime_9 = self.lineEdit_dop_9.text()
dateEdit_1 = self.dateEdit_dop_1.date()
date_1 = dateEdit_1.toPyDate()
dateEdit_2 = self.dateEdit_dop_2.date()
date_2 = dateEdit_2.toPyDate()
dateEdit_3 = self.dateEdit_dop_3.date()
date_3 = dateEdit_3.toPyDate()
dateEdit_4 = self.dateEdit_dop_4.date()
date_4 = dateEdit_4.toPyDate()
dateEdit_5 = self.dateEdit_dop_5.date()
date_5 = dateEdit_5.toPyDate()
dateEdit_6 = self.dateEdit_dop_6.date()
date_6 = dateEdit_6.toPyDate()
dateEdit_7 = self.dateEdit_dop_7.date()
date_7 = dateEdit_7.toPyDate()
dateEdit_8 = self.dateEdit_dop_8.date()
date_8 = dateEdit_8.toPyDate()
dateEdit_9 = self.dateEdit_dop_9.date()
date_9 = dateEdit_9.toPyDate()
doc = DocxTemplate('таблица.docx')
context = {
'tbl_contents': data_for_word,
"namber": lineEdit, "data": lineEdit_2, "namber_2": lineEdit_3, "data_2": lineEdit_4,
"object": lineEdit_5, "marking": lineEdit_6, "data_start": lineEdit_7, "data_end": lineEdit_8,
"equipment_1": lineEdittime, "eq_data_1": date_1, "equipment_2": lineEdittime_2,
"eq_data_2": date_2, "equipment_3": lineEdittime_3, "eq_data_3": date_3,
"equipment_4": lineEdittime_4,
"eq_data_4": date_4, "equipment_5": lineEdittime_5, "eq_data_5": date_5,
"equipment_6": lineEdittime_6,
"eq_data_6": date_6, "equipment_7": lineEdittime_7, "eq_data_7": date_7,
"equipment_8": lineEdittime_8,
"eq_data_8": date_8, "equipment_9": lineEdittime_9, "eq_data_9": date_9
}
doc.render(context)
directory_file = self.lineEdit_10.text()
name_folder = self.lineEdit_11.text()
try:
save_folder = directory_file + name_folder
os.mkdir(save_folder)
except:
msg = QMessageBox()
msg.setWindowTitle("Предупреждение")
msg.setText("Папка с именем " + name_folder + " уже существует")
msg.setIcon(QMessageBox.Warning)
msg.exec_()
save_folder = save_folder + "/Protocol No_1-LKI_2_CO2.docx"
doc.save(save_folder)
def toolDirectoryExport(self):
pass
def buttonExport(self):
pass
def buttonAddtable2(self):
rowPosition = self.tableWidget_2.rowCount()
self.tableWidget_2.insertRow(rowPosition)
def buttonDeleteTable2(self):
if self.tableWidget_2.rowCount() > 0:
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount() - 1)
def calculationTime(self, dateTime, row):
if row == 0:
self.dateTime0 = self.tableWidget_3.cellWidget(row, 0).dateTime()
for row in range(1, self.tableWidget_3.rowCount()):
dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime()
item = QTableWidgetItem()
item.setData(Qt.DisplayRole,
self.dateTime0.secsTo(dateTime2) / 60. / 60.)
self.tableWidget_3.setItem(row, 1, item)
return
dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime()
item = QTableWidgetItem()
item.setData(Qt.DisplayRole,
self.dateTime0.secsTo(dateTime2) / 60. / 60.)
self.tableWidget_3.setItem(row, 1, item)
def buttonAddtable3(self):
rowPosition = self.tableWidget_3.rowCount()
self.tableWidget_3.insertRow(rowPosition)
date_from = QtWidgets.QDateTimeEdit()
dateTime = QtCore.QDateTime().currentDateTime()
date_from.setDateTime(dateTime)
date_from.dateTimeChanged.connect(
lambda dateTime, row=rowPosition:
self.calculationTime(dateTime, row))
self.tableWidget_3.setCellWidget(rowPosition, 0, date_from)
def buttonDeleteTable3(self):
if self.tableWidget_3.rowCount() > 0:
self.tableWidget_3.removeRow(self.tableWidget_3.rowCount() - 1)
def buttonChartPh(self):
pass
def buttonChartFe(self):
pass
def buttonChartCO2(self):
pass
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
app.setStyle("Fusion")
app.setFont(QtGui.QFont("Times", 10))
w = MainWindow()
w.setFixedSize(640, 600)
w.setWindowTitle("SAFTD")
w.show()
sys.exit(app.exec_())
Для того что бы выводить данные из lineEdit и tableWidget в ccontext сначала загружаем данные для таблицы: 'tbl_contents': data_for_word, а потому уже как обычно данные из lineEdit.