как сделать вывод из tableWidget в excel с типами данных
Такая проблема, при импорте из tableWidget в excel все сохраняется как string. Как сделать так, чтобы числа сохранялись в integer?
import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, \
QStackedWidget, QMessageBox, QFileDialog
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_dialog(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(221, 160)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(50, 90, 121, 23))
self.pushButton.setObjectName("pushButton")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(50, 50, 121, 20))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(50, 20, 121, 16))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 221, 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"))
self.pushButton.setText(_translate("MainWindow", "ОК"))
self.label.setText(_translate("MainWindow", "Введите номер строки"))
class Ui_table(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1000, 684)
MainWindow.setMinimumSize(QtCore.QSize(1000, 684))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(15, 350, 131, 31))
self.pushButton.setObjectName("pushButton")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(170, 10, 811, 631))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(15, 50, 131, 31))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(15, 100, 131, 31))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(15, 150, 131, 31))
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_5.setGeometry(QtCore.QRect(15, 400, 131, 31))
self.pushButton_5.setObjectName("pushButton_5")
self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_6.setGeometry(QtCore.QRect(15, 600, 131, 31))
self.pushButton_6.setObjectName("pushButton_6")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 21))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.action = QtWidgets.QAction(MainWindow)
self.action.setObjectName("action")
self.menu.addAction(self.action)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "обновить"))
self.pushButton_2.setText(_translate("MainWindow", "добавить"))
self.pushButton_3.setText(_translate("MainWindow", "удалить"))
self.pushButton_4.setText(_translate("MainWindow", "сохранить"))
self.pushButton_5.setText(_translate("MainWindow", "поиск"))
self.pushButton_6.setText(_translate("MainWindow", "Выход"))
self.menu.setTitle(_translate("MainWindow", "открыть"))
self.action.setText(_translate("MainWindow", "открыть файл"))
class Dialog(QMainWindow, Ui_dialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setupUi(self)
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint)
class StartMenuMain(QMainWindow, Ui_table):
def __init__(self, parent=None):
super(StartMenuMain, self).__init__(parent)
self.setupUi(self)
self.fname = None
self.initUI()
self.dialog = Dialog()
self.dialog.pushButton.clicked.connect(self.searchOk)
def initUI(self):
self.pushButton.clicked.connect(self.update)
self.action.triggered.connect(self.open_file)
self.pushButton_2.clicked.connect(self.addRow)
self.pushButton_3.clicked.connect(self.delRow)
self.pushButton_4.clicked.connect(self.exportToExcel)
self.pushButton_5.clicked.connect(self.search)
self.pushButton_6.clicked.connect(self.exit)
self.pushButton.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_2.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_3.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_4.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_5.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_6.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
def exit(self):
exit()
def update(self):
if not self.fname:
QMessageBox.critical(self, 'Ошибка!', "Выберите Exсel файл")
return
excel_file_path = self.fname
worksheet_name = 'Sheet1'
self.loadExcelData(excel_file_path, worksheet_name)
def open_file(self):
self.fname, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Выберите файл', '.',
"Файлы Exсel (*.xlsx)")
print(f'fname = {self.fname}')
def loadExcelData(self, excel_file_path, worksheet_name):
df = pd.read_excel(excel_file_path, worksheet_name)
if df.size == 0:
return
df.fillna('', inplace=True)
self.tableWidget.setRowCount(df.shape[0])
self.tableWidget.setColumnCount(df.shape[1])
self.tableWidget.setHorizontalHeaderLabels(df.columns)
for row in df.iterrows():
values = row[1]
for col_index, value in enumerate(values):
if isinstance(value, (float, int)):
value = '{0:0,.0f}'.format(value)
tableItem = QtWidgets.QTableWidgetItem(str(value))
self.tableWidget.setItem(row[0], col_index, tableItem)
self.tableWidget.setColumnWidth(2, 300)
def search(self):
if not self.fname:
QMessageBox.critical(self, 'Ошибка!', "Выберите Exсel файл")
return
self.dialog.show()
def searchOk(self):
row = self.dialog.lineEdit.text()
_rows = self.tableWidget.rowCount()
if not row.isdigit():
msg = QMessageBox.information(self, 'Внимание', 'Укажите правильно строку.')
self.dialog.hide()
return
if int(row) > _rows:
msg = QMessageBox.information(self, 'Внимание', 'Укажите правильно строку.')
self.dialog.hide()
return
self.dialog.hide()
cols = self.tableWidget.columnCount()
rows = int(row) -1
stolb = ["Номер", "ФИО", "ЗП"]
a = ""
for i in range(cols):
item = self.tableWidget.item(int(rows), i)
if item:
a = a + stolb[i] + " " + (self.tableWidget.item(int(rows), i).text()) + "\n"
else:
a = a + stolb[i] + " ? пусто ? \n"
QMessageBox.information(self, 'Поиск', a)
def addRow(self):
rowPosition = self.tableWidget.rowCount()
if not rowPosition:
msg = QMessageBox.information(self, 'Внимание', 'Выберите Exсel файл для добавления строки.')
return
self.tableWidget.insertRow(rowPosition)
def delRow(self):
row = self.tableWidget.currentRow()
if row == -1:
msg = QMessageBox.information(self, 'Внимание', 'Выберите строку для удаления')
return
self.tableWidget.removeRow(row)
def exportToExcel(self):
rows = self.tableWidget.rowCount()
if not rows:
msg = QMessageBox.information(self, 'Внимание', 'Нечего сохранять.')
return
if not self.fname:
msg = QMessageBox.information(self, 'Внимание', 'Не указан файл для сохранения.')
return
columnHeaders = []
for j in range(self.tableWidget.model().columnCount()):
columnHeaders.append(self.tableWidget.horizontalHeaderItem(j).text())
df = pd.DataFrame(columns=columnHeaders)
for row in range(self.tableWidget.rowCount()):
for col in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(row, col)
df.at[row, columnHeaders[col]] = item.text() if item is not None else ""
df.to_excel(self.fname, index=False)
msg = QMessageBox.information(self, 'Excel', 'Файл сохранен')
if __name__ == '__main__':
app = QApplication(sys.argv)
startmenu_window = StartMenuMain()
windows = QStackedWidget()
windows.addWidget(startmenu_window)
windows.setWindowTitle("Работа с файлами")
windows.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Предположим, что первая колонка у вас содержит какие-то целые числа.
Тогда
...
if col == 0:
df.at[row, columnHeaders[col]] = int(item.text()) \
if item is not None and item.text() else 0
...
import sys
import pandas as pd
from PyQt5.QtWidgets import QApplication, QMainWindow, \
QStackedWidget, QMessageBox, QFileDialog
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_dialog(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(221, 160)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(50, 90, 121, 23))
self.pushButton.setObjectName("pushButton")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(50, 50, 121, 20))
self.lineEdit.setObjectName("lineEdit")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(50, 20, 121, 16))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 221, 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"))
self.pushButton.setText(_translate("MainWindow", "ОК"))
self.label.setText(_translate("MainWindow", "Введите номер строки"))
class Ui_table(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1000, 684)
MainWindow.setMinimumSize(QtCore.QSize(1000, 684))
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(15, 350, 131, 31))
self.pushButton.setObjectName("pushButton")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setGeometry(QtCore.QRect(170, 10, 811, 631))
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(0)
self.tableWidget.setRowCount(0)
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(15, 50, 131, 31))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(15, 100, 131, 31))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(15, 150, 131, 31))
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_5.setGeometry(QtCore.QRect(15, 400, 131, 31))
self.pushButton_5.setObjectName("pushButton_5")
self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_6.setGeometry(QtCore.QRect(15, 600, 131, 31))
self.pushButton_6.setObjectName("pushButton_6")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 21))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.action = QtWidgets.QAction(MainWindow)
self.action.setObjectName("action")
self.menu.addAction(self.action)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "обновить"))
self.pushButton_2.setText(_translate("MainWindow", "добавить"))
self.pushButton_3.setText(_translate("MainWindow", "удалить"))
self.pushButton_4.setText(_translate("MainWindow", "сохранить"))
self.pushButton_5.setText(_translate("MainWindow", "поиск"))
self.pushButton_6.setText(_translate("MainWindow", "Выход"))
self.menu.setTitle(_translate("MainWindow", "открыть"))
self.action.setText(_translate("MainWindow", "открыть файл"))
class Dialog(QMainWindow, Ui_dialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
self.setupUi(self)
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint)
class StartMenuMain(QMainWindow, Ui_table):
def __init__(self, parent=None):
super(StartMenuMain, self).__init__(parent)
self.setupUi(self)
self.fname = None
self.initUI()
self.dialog = Dialog()
self.dialog.pushButton.clicked.connect(self.searchOk)
def initUI(self):
self.pushButton.clicked.connect(self.update)
self.action.triggered.connect(self.open_file)
self.pushButton_2.clicked.connect(self.addRow)
self.pushButton_3.clicked.connect(self.delRow)
self.pushButton_4.clicked.connect(self.exportToExcel)
self.pushButton_5.clicked.connect(self.search)
self.pushButton_6.clicked.connect(self.exit)
self.pushButton.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_2.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_3.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_4.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_5.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
self.pushButton_6.setStyleSheet("color: white; background-color: #b6afa9;"
"border-radius: 10px;")
def exit(self):
exit()
def update(self):
if not self.fname:
QMessageBox.critical(self, 'Ошибка!', "Выберите Exсel файл")
return
excel_file_path = self.fname
worksheet_name = 'Sheet1'
self.loadExcelData(excel_file_path, worksheet_name)
def open_file(self):
self.fname, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Выберите файл', '.',
"Файлы Exсel (*.xlsx)")
print(f'fname = {self.fname}')
def loadExcelData(self, excel_file_path, worksheet_name):
df = pd.read_excel(excel_file_path, worksheet_name)
if df.size == 0:
return
df.fillna('', inplace=True)
self.tableWidget.setRowCount(df.shape[0])
self.tableWidget.setColumnCount(df.shape[1])
self.tableWidget.setHorizontalHeaderLabels(df.columns)
for row in df.iterrows():
values = row[1]
for col_index, value in enumerate(values):
if isinstance(value, (float, int)):
value = '{0:0,.0f}'.format(value)
tableItem = QtWidgets.QTableWidgetItem(str(value))
self.tableWidget.setItem(row[0], col_index, tableItem)
self.tableWidget.setColumnWidth(2, 300)
def search(self):
if not self.fname:
QMessageBox.critical(self, 'Ошибка!', "Выберите Exсel файл")
return
self.dialog.show()
def searchOk(self):
row = self.dialog.lineEdit.text()
_rows = self.tableWidget.rowCount()
if not row.isdigit():
msg = QMessageBox.information(self, 'Внимание', 'Укажите правильно строку.')
self.dialog.hide()
return
if int(row) > _rows:
msg = QMessageBox.information(self, 'Внимание', 'Укажите правильно строку.')
self.dialog.hide()
return
self.dialog.hide()
cols = self.tableWidget.columnCount()
rows = int(row) -1
stolb = ["Номер", "ФИО", "ЗП"]
a = ""
for i in range(cols):
item = self.tableWidget.item(int(rows), i)
if item:
a = a + stolb[i] + " " + (self.tableWidget.item(int(rows), i).text()) + "\n"
else:
a = a + stolb[i] + " ? пусто ? \n"
QMessageBox.information(self, 'Поиск', a)
def addRow(self):
rowPosition = self.tableWidget.rowCount()
if not rowPosition:
msg = QMessageBox.information(self, 'Внимание', 'Выберите Exсel файл для добавления строки.')
return
self.tableWidget.insertRow(rowPosition)
def delRow(self):
row = self.tableWidget.currentRow()
if row == -1:
msg = QMessageBox.information(self, 'Внимание', 'Выберите строку для удаления')
return
self.tableWidget.removeRow(row)
def exportToExcel(self):
rows = self.tableWidget.rowCount()
if not rows:
msg = QMessageBox.information(self, 'Внимание', 'Нечего сохранять.')
return
if not self.fname:
msg = QMessageBox.information(self, 'Внимание', 'Не указан файл для сохранения.')
return
columnHeaders = []
for j in range(self.tableWidget.model().columnCount()):
columnHeaders.append(self.tableWidget.horizontalHeaderItem(j).text())
df = pd.DataFrame(columns=columnHeaders)
for row in range(self.tableWidget.rowCount()):
for col in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(row, col)
if col == 0:
df.at[row, columnHeaders[col]] = int(item.text()) \
if item is not None and item.text() else 0
else:
df.at[row, columnHeaders[col]] = item.text() if item is not None else ""
df.to_excel(self.fname, index=False)
msg = QMessageBox.information(self, 'Excel', 'Файл сохранен')
if __name__ == '__main__':
app = QApplication(sys.argv)
startmenu_window = StartMenuMain()
windows = QStackedWidget()
windows.addWidget(startmenu_window)
windows.setWindowTitle("Работа с файлами")
windows.show()
sys.exit(app.exec_())
