Как получить данные из 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 шт):
Примерно в таком виде (прошу прощения, возможны ошибки, протестировать сейчас негде)
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 - цвет текста, и т.д.
Что-то примерно такое, на скорую руку (если я правильно вас понял). С помощью кнопок добавьте строки (или удалите), заполните таблицу и нажмите кнопку "получить данные из таблицы", рядом с файлом скрипта появится файл 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_())
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_())



