Как получить данные из TableWidget и сохранить их в Word?

Я создал таблицу в Qt Designer, но как получить из нее данные не знаю.

Помогите пожалуйста.

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_4 = QGridLayout(self.tab)
        self.gridLayout_4.setObjectName(u"gridLayout_4")
        self.gridLayout_3 = QGridLayout()
        self.gridLayout_3.setObjectName(u"gridLayout_3")
        self.lineEdit = QLineEdit(self.tab)
        self.lineEdit.setObjectName(u"lineEdit")

        self.gridLayout_3.addWidget(self.lineEdit, 3, 0, 1, 1)

        self.label_2 = QLabel(self.tab)
        self.label_2.setObjectName(u"label_2")

        self.gridLayout_3.addWidget(self.label_2, 4, 0, 1, 1)

        self.label = QLabel(self.tab)
        self.label.setObjectName(u"label")

        self.gridLayout_3.addWidget(self.label, 2, 0, 1, 1)

        self.lineEdit_2 = QLineEdit(self.tab)
        self.lineEdit_2.setObjectName(u"lineEdit_2")

        self.gridLayout_3.addWidget(self.lineEdit_2, 5, 0, 1, 1)

        self.pushButton = QPushButton(self.tab)
        self.pushButton.setObjectName(u"pushButton")

        self.gridLayout_3.addWidget(self.pushButton, 6, 0, 1, 1)

        self.pushButton_2 = QPushButton(self.tab)
        self.pushButton_2.setObjectName(u"pushButton_2")

        self.gridLayout_3.addWidget(self.pushButton_2, 7, 0, 1, 1)


        self.gridLayout_4.addLayout(self.gridLayout_3, 1, 1, 1, 1)

        self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.gridLayout_4.addItem(self.horizontalSpacer, 1, 0, 1, 1)

        self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)

        self.gridLayout_4.addItem(self.verticalSpacer, 0, 1, 1, 1)

        self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.gridLayout_4.addItem(self.horizontalSpacer_2, 1, 2, 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() < 15):
            self.tableWidget.setRowCount(15)
        __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)
        __qtablewidgetitem20 = QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(10, __qtablewidgetitem20)
        __qtablewidgetitem21 = QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(11, __qtablewidgetitem21)
        __qtablewidgetitem22 = QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(12, __qtablewidgetitem22)
        __qtablewidgetitem23 = QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(13, __qtablewidgetitem23)
        __qtablewidgetitem24 = QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(14, __qtablewidgetitem24)
        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.gridLayout.addWidget(self.tabWidget, 0, 1, 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(0)


        QMetaObject.connectSlotsByName(MainWindow)
    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", 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.pushButton_2.setText(QCoreApplication.translate("MainWindow", u"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"Tab 1", 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));
        ___qtablewidgetitem19 = self.tableWidget.verticalHeaderItem(10)
        ___qtablewidgetitem19.setText(QCoreApplication.translate("MainWindow", u"11", None));
        ___qtablewidgetitem20 = self.tableWidget.verticalHeaderItem(11)
        ___qtablewidgetitem20.setText(QCoreApplication.translate("MainWindow", u"12", None));
        ___qtablewidgetitem21 = self.tableWidget.verticalHeaderItem(12)
        ___qtablewidgetitem21.setText(QCoreApplication.translate("MainWindow", u"13", None));
        ___qtablewidgetitem22 = self.tableWidget.verticalHeaderItem(13)
        ___qtablewidgetitem22.setText(QCoreApplication.translate("MainWindow", u"14", None));
        ___qtablewidgetitem23 = self.tableWidget.verticalHeaderItem(14)
        ___qtablewidgetitem23.setText(QCoreApplication.translate("MainWindow", u"15", None));
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"Tab 2", None))
    # retranslateUi

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

Автор решения: Sergey Tatarincev

Примерно в таком виде (прошу прощения, возможны ошибки, протестировать сейчас негде)

for i in range(self.tableWidget.rowCount()):
    for j in range(self.tableWidget.columnCount()):
       item = self.tableWidget.item(1,1)
       itemText = item.data(Qt.DisplayRole).toString()

Для получения данных в item.data(int) передается параметр - роль https://doc.qt.io/qt-5/qt.html#ItemDataRole-enum

Qt::DisplayRole - текст ячейки, Qt::BackgroundRole - цвет заливки, Qt::ForegroundRole - цвет текста, и т.д.

→ Ссылка
Автор решения: Konstantin

Что-то примерно такое, на скорую руку (если я правильно вас понял). С помощью кнопок добавьте строки (или удалите), заполните таблицу и нажмите кнопку "получить данные из таблицы", рядом с файлом скрипта появится файл word с табличными данными исключая пустые строки.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import docx


class App(QWidget):
    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 Table Example'
        self.initUI()

    def initUI(self):

        self.table = QTableWidget(1,3,self)

        table_title = ["Столбец_1", "Столбец_2", "Столбец_3"]

        i = 0
        for item in table_title:
            col = QTableWidgetItem(item)
            col.setBackground(QColor(56, 199, 199))
            self.table.setHorizontalHeaderItem(i, col)
            i += 1



        self.table.resizeColumnsToContents()
        add_btn = QPushButton('Добавить строки')
        del_btn = QPushButton('Удалить строки')
        get_data_btn = QPushButton('Получить данные из таблицы')

        add_btn.clicked.connect(self.add_row)
        del_btn.clicked.connect(self.del_row)
        get_data_btn.clicked.connect(self.get_data)

        mainLayout = QHBoxLayout()
        mainLayout.addWidget(self.table)
        partLayout = QVBoxLayout()
        partLayout.addWidget(add_btn)
        partLayout.addWidget(del_btn)
        partLayout.addWidget(get_data_btn)
        mainLayout.addLayout(partLayout)
        self.setLayout(mainLayout)
        self.show()

    def add_row(self):
        rows = self.table.rowCount()
        try:
            end_part = (self.table.item(rows-1, 1).text())
            end_part_niv = (self.table.item(rows - 1, 3).text())
            self.table.insertRow(rows)
            self.table.setItem(rows, 0, QTableWidgetItem(end_part))
            self.table.setItem(rows, 2, QTableWidgetItem(end_part_niv))
        except:
            self.table.insertRow(rows)

    def del_row(self):
        rows = self.table.rowCount()
        self.table.removeRow(rows-1)


    def get_data(self):
        rows = self.table.rowCount()
        cols = self.table.columnCount()
        data = []
        for row in range(rows):
            tmp = []
            for col in range(cols):
                try:
                    tmp.append(self.table.item(row,col).text())
                except:
                    tmp.append('No data')
            data.append(tmp)
            
        data_for_word = []  
        #for i in data: print(i)
        
        for i in data:
            if i[0] != 'No data':
                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')





if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle(QStyleFactory.create('Fusion'))
    ex = App()
    sys.exit(app.exec_())

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

→ Ссылка
Автор решения: S. Nick

Sorry, если вы хотите получать быстрые и правильные ответы,
вам необходимо предоставлять минимально-воспроизводимый пример, о чем вам настойчиво писали в предыдущих ваших вопросах, которые вы удалили.

Минимальный пример, означает, что не надо предоставлять весь ваш проект, а предоставить только то, что касается проблемы указанной в вопросе. Вам предоставили ссылки как создать минимальный, самодостаточный и воспроизводимый пример, почитайте внимательно как это делается.

Воспроизводимый пример, означает, что ваш пример копируется и запускается без дополнительных добавлений и правок.

Теперь по сути вашего вопроса.

Мой пример делает копирование таблицы в системный буфер (clipboard) в формате HTML.
Затем мы можем вставить скопированные данные в нужное место, будь то Excel, Word, редактор веб-страниц или что-то другое.

Обратите внимание, что я использую QTableView.
QTableView реализует табличное представление, в котором отображаются элементы модели.

Вы можете выбрать в таблице что угодно, строку/строки, колонку/колонки, отдельную ячейку/ячейки или ничего не выбирать.

Попробуйте.

import sys
from PyQt5.Qt import *


class MyObject(object):
    pass
      

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()    
        
        self.view = QTableView(self)
        self.view.setModel(QStandardItemModel(7, 4))
        
        self.header = ['col1', 'col2', 'col3', 'col4']
        self.view.model().setHorizontalHeaderLabels(self.header)
       
        for each in [
            (row, 
             col, 
             QStandardItem(f'item {row}_{col}')) \
                 for row in range(1, 5) for col in range(4)
            ]:
            self.view.model().setItem(*each)

        btnInvert = QPushButton('Clipboar')
        btnInvert.clicked.connect(self.select_data)
        
        layout = QVBoxLayout(self)
        layout.addWidget(self.view)
        layout.addWidget(btnInvert)

    def select_data(self):
        model = self.view.model()
        indexes = self.view.selectionModel().selectedIndexes()

        if len(indexes) == 0:
            for i in range(model.rowCount()):
                _list = [model.index(i, col).data() for col in range(4) \
                         if model.index(i, col).data()]            
                if _list:
                    for j in range(model.columnCount()):
                        ix = model.index(i, j)
                        self.view.selectionModel().select(
                            ix, QItemSelectionModel.Toggle)            
            indexes = self.view.selectionModel().selectedIndexes()
            if len(indexes) == 0:
                msg = QMessageBox.information(
                    self, 
                    'Внимание', 
                    'Выберите что-нибудь \nили \nзаполните таблицу.') 
                return
            
        model = self.view.model()
        
        d = self.create_object(indexes)
        
        headers = { 
            col:model.headerData(col, Qt.Horizontal) for col in d.columns 
        }
        minRow = min(d.rows)
        minCol = min(d.columns)
        
        html = self.data_clipboar(d, model)

        mime = QMimeData()
        mime.setHtml(html)
        self.clipboard = QApplication.clipboard()
        self.clipboard.setMimeData(mime)

    def create_object(self, indexes):
        d = MyObject()
        d.indexes = { (i.row(), i.column()):i for i in indexes }
        d.rows = sorted(list(set([ i[0] for i in d.indexes ])))
        d.columns = sorted(list(set([ i[1] for i in d.indexes ])))
        return d

    def data_clipboar(self, d, model):
          html = '<table cellspacing="2" border="1" cellpadding="5" width="600"><tbody>\n'
          headers = { col:model.headerData(col, Qt.Horizontal) for col in d.columns }
          html += '<tr>' 
          for c in d.columns:
             html += '<th>%s</th>' % headers[c]
          html += '</tr>\n' 
          for r in d.rows:
             html += '<tr>' 
             for c in d.columns:
                if (r, c) in d.indexes:
                   v = d.indexes[(r,c)].data(Qt.DisplayRole)
                   html += '<td>%s</td>' % v
                else:
                   html += '<td></td>'
             html += '</tr>' 
          html += '</tbody></table>'
          return html


if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 300)
    w.show()
    sys.exit(app.exec_())

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

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

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

→ Ссылка