Проблемы при вставлении данных в шаблон Word. PyQt5

Есть код:

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget, QLabel
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow
from PyQt5 import QtCore, QtWidgets
from PyQt5.Qt import *

from docxtpl import DocxTemplate


class Widget(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("test2.ui", self)
        # Добавить/удалить строку в tableWidget_2
        #self.pushButton_7.clicked.connect(self.buttonAdd)
        #self.pushButton_8.clicked.connect(self.buttonDelete)
        # Добавить/удалить строку в tableWidget_3
        self.pushButton_9.clicked.connect(self.buttonAdd_2)
        self.pushButton_10.clicked.connect(self.buttonDelete_2)
        # Сохранить данные из таблицы tableWidget_3
        self.pushButton.clicked.connect(self.buttonSave)

        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, 0, 0))
            )
            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.date_changed(dateTime, row))
            self.tableWidget_3.setCellWidget(row, 0, date_from)

        self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()

    # Расчет времени от начального значения
    def date_changed(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)

    # Кнопка дабовляющая строку в таблицу tableWidget_2
    def buttonAdd(self):
        rowPosition = self.tableWidget_2.rowCount()
        self.tableWidget_2.insertRow(rowPosition)

    # Кнопка удаляющая строку в таблицу tableWidget_2
    def buttonDelete(self):
        if self.tableWidget_2.rowCount() > 0:
            self.tableWidget_2.removeRow(self.tableWidget_2.rowCount()-1)

    # Кнопка дабовляющая строку в таблицу tableWidget_3
    def buttonAdd_2(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.date_changed(dateTime, row))
        self.tableWidget_3.setCellWidget(rowPosition, 0, date_from)

    # Кнопка удаляющая строку в таблицу tableWidget_3
    def buttonDelete_2(self):
        if self.tableWidget_3.rowCount() > 0:
            self.tableWidget_3.removeRow(self.tableWidget_3.rowCount() - 1)

    # Сохранение данных из tableWidget_3
    def buttonSave(self):
        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)
                    item = item.text() if item else 'No data'
                else:
                    #             dateTime
                    #               vvvv
                    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.buttonLoader()


    # Загрузка данных в шаблон Word
    def buttonLoader(self):
        rows = self.tableWidget_3.rowCount()
        cols = self.tableWidget_3.columnCount()
        data = []
        for row in range(rows):
            tmp = []
            for col in range(cols):
                try:
                    tmp.append(self.tableWidget_3.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)

        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]
                })

        doc = DocxTemplate('test_word.docx')  # Загрузить шаблон (создать новый документ по шаблону)

        context = {
            'tbl_contents': data_for_word
        }

        doc.render(context)  # Заполнить шаблон по данным из context

        doc.save('test2.docx')  # Сохранить в новый файл


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Widget()
    ex.show()
    sys.exit(app.exec_())

Данный код должен собирать данные из таблицы (tableWidget_3), после чего вставлять эти данные по шаблону в word.
Но, при заполнении таблицы в шаблон возникает проблема:

введите сюда описание изображения

В первом столбце должны находится данные но, их нет.

введите сюда описание изображения

В первом столбце есть dataEdit из которого данные должны собираться и вставляется в шаблон.

Шаблон word

Код ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>640</width>
    <height>480</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="2" column="0">
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QPushButton" name="pushButton_10">
        <property name="text">
         <string>Удалить</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton_9">
        <property name="text">
         <string>Добавить</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item row="0" column="0">
     <widget class="QTableWidget" name="tableWidget_3">
      <row>
       <property name="text">
        <string>New Row</string>
       </property>
      </row>
      <column>
       <property name="text">
        <string>1</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>2</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>3</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>4</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>5</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>6</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>7</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>8</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>9</string>
       </property>
      </column>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QPushButton" name="pushButton">
      <property name="text">
       <string>Считать данные</string>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>640</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

Как решить данную проблему?


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

Автор решения: S. Nick

Попробуйте заменить

...

    # Сохранение данных из tableWidget_3
    def buttonSave(self):
        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)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
                    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.buttonLoader(data_for_word)          # +++ data_for_word  

    # Загрузка данных в шаблон Word
    def buttonLoader(self, data):                 # +++ data 
    
        ''' !!!!!!!!!!!!!!!! Вы это уже сделали выше !!!!!!!!!!!!!!!!
        
        rows = self.tableWidget_3.rowCount()
        cols = self.tableWidget_3.columnCount()
        data = []
        for row in range(rows):
            tmp = []
            for col in range(cols):
                try:
                    tmp.append(self.tableWidget_3.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)
        '''

        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]
                })
                
        for i in data_for_word: print(i)
        
        doc = DocxTemplate('test_word.docx')  
        context = {
            'tbl_contents': data_for_word
        }
        doc.render(context)     # Заполнить шаблон по данным из context
        doc.save('test2.docx')  # Сохранить в новый файл

...

введите сюда описание изображения


Полный текст main.py

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget, QLabel
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow
from PyQt5 import QtCore, QtWidgets
from PyQt5.Qt import *

from docxtpl import DocxTemplate


class Widget(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("test2.ui", self)
        # Добавить/удалить строку в tableWidget_2
        #self.pushButton_7.clicked.connect(self.buttonAdd)
        #self.pushButton_8.clicked.connect(self.buttonDelete)
        # Добавить/удалить строку в tableWidget_3
        self.pushButton_9.clicked.connect(self.buttonAdd_2)
        self.pushButton_10.clicked.connect(self.buttonDelete_2)
        # Сохранить данные из таблицы tableWidget_3
        self.pushButton.clicked.connect(self.buttonSave)

        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, 0, 0))
            )
            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.date_changed(dateTime, row))
            self.tableWidget_3.setCellWidget(row, 0, date_from)

        self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()

    # Расчет времени от начального значения
    def date_changed(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)

    # Кнопка дабовляющая строку в таблицу tableWidget_2
    def buttonAdd(self):
        rowPosition = self.tableWidget_2.rowCount()
        self.tableWidget_2.insertRow(rowPosition)

    # Кнопка удаляющая строку в таблицу tableWidget_2
    def buttonDelete(self):
        if self.tableWidget_2.rowCount() > 0:
            self.tableWidget_2.removeRow(self.tableWidget_2.rowCount()-1)

    # Кнопка дабовляющая строку в таблицу tableWidget_3
    def buttonAdd_2(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.date_changed(dateTime, row))
        self.tableWidget_3.setCellWidget(rowPosition, 0, date_from)

    # Кнопка удаляющая строку в таблицу tableWidget_3
    def buttonDelete_2(self):
        if self.tableWidget_3.rowCount() > 0:
            self.tableWidget_3.removeRow(self.tableWidget_3.rowCount() - 1)

    # Сохранение данных из tableWidget_3
    def buttonSave(self):
        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)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
                    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.buttonLoader(data_for_word)          # +++ data_for_word  

    # Загрузка данных в шаблон Word
    def buttonLoader(self, data):                 # +++ data 
    
        ''' !!!!!!!!!!!!!!!! Вы это уже сделали выше !!!!!!!!!!!!!!!!
        
        rows = self.tableWidget_3.rowCount()
        cols = self.tableWidget_3.columnCount()
        data = []
        for row in range(rows):
            tmp = []
            for col in range(cols):
                try:
                    tmp.append(self.tableWidget_3.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)
        '''

        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)
        
        doc = DocxTemplate('test_word.docx')  
        context = {
            'tbl_contents': data_for_word
        }
        doc.render(context)     # Заполнить шаблон по данным из context
        doc.save('test2.docx')  # Сохранить в новый файл


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Widget()
    ex.show()
    sys.exit(app.exec_())
        

введите сюда описание изображения

→ Ссылка