Вставить скопированные ячейки из Excel в ячейки QTableWidget
Я новичек, поэтому не судите строго.
Через QT Designer создал таблицу, условно говоря на 3х3 ячеек.
Можно ли как-то сделать так, чтобы данные в таблицу я переносил из того же Excel сразу из нескольких ячеек?
В Excel 3 ячейки скопировал и в 3 ячейки вставил - просто копипастить из Excel чтобы было удобно. А потом уже думаю вытаскивать полученные данные, из того что введено пользователем и вносить эти данные в фильтр для поиска (полученные данные будут своеобразным фильтром для поиска).
Код вот такой:
from PyQt5.QtWidgets import QApplication, QMainWindow, QGridLayout, QWidget, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import QSize, Qt
class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setMinimumSize(QSize(480, 80))
self.setWindowTitle("Работа с QTableWidget")
central_widget = QWidget(self)
self.setCentralWidget(central_widget)
grid_layout = QGridLayout()
central_widget.setLayout(grid_layout)
table = QTableWidget(self)
table.setColumnCount(3)
table.setRowCount(3)
table.setHorizontalHeaderLabels(["1","2","3"])
table.horizontalHeaderItem(0).setToolTip("столбик 1 ")
table.horizontalHeaderItem(1).setToolTip("столбик 2 ")
table.horizontalHeaderItem(2).setToolTip("столбик 3 ")
table.horizontalHeaderItem(0).setTextAlignment(Qt.AlignLeft)
table.horizontalHeaderItem(1).setTextAlignment(Qt.AlignHCenter)
table.horizontalHeaderItem(2).setTextAlignment(Qt.AlignRight)
table.setItem(0, 0, QTableWidgetItem("введи сюда 1"))
table.setItem(0, 1, QTableWidgetItem("введи сюда 2"))
table.setItem(0, 2, QTableWidgetItem("введи сюда 3"))
table.resizeColumnsToContents()
grid_layout.addWidget(table, 0, 0)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec())```
Ответы (2 шт):
Вам нужно перехватить событие клавиатуры Ctrl+V,
переопределив метод keyPressEvent и обработав данные буфера обмена вручную.
Вы можете использовать QClipboard и QMimeData для получения данных Excel из буфера обмена.
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralwidget = QWidget()
self.setCentralWidget(self.centralwidget)
self.tableWidget = QTableWidget(3, 3, self.centralwidget)
layout = QGridLayout(self.centralwidget)
layout.addWidget(self.tableWidget)
self.clipboard = QApplication.clipboard()
def keyPressEvent(self, event):
if event.key() == Qt.Key_V and event.modifiers() == Qt.ControlModifier:
# Вручную обрабатывать данные буфера обмена и вставлять
# их в таблицу, начиная с выбранного tableitem
mime_data = self.clipboard.mimeData()
#print(* mime_data.formats(), sep='\n')
data = mime_data.data('application/x-qt-windows-mime;value="Csv"')
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# Проверьте, содержит ли буфер обмена данные Excel.
# vvvv
if data:
# преобразовать из QByteArray в строку
data = data.data().decode()
list_item = data.split('\r')[0]
list_item = list_item.split(';')
#print(f'list_item = {list_item}')
selectedIndexes = self.tableWidget.selectedIndexes()
if selectedIndexes:
row = selectedIndexes[0].row()
column = selectedIndexes[0].column()
#print(f'row = {row}, column = {column}')
rows = self.tableWidget.rowCount()
columns = self.tableWidget.columnCount()
#print(f'rows = {rows}, columns = {columns}')
# проанализируйте данные и вставьте их в таблицу.
for item in list_item:
self.tableWidget.setItem(row, column, QTableWidgetItem(item))
column += 1
if column >= columns:
break
else:
msg = QMessageBox.information(
self,
'Внимание',
'Выберите ячейку, начиная с которой будите вставлять данные.'
)
return
super(MainWindow, self).keyPressEvent(event)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = MainWindow()
w.resize(520, 320)
w.show()
sys.exit(app.exec_())

