当前位置:   article > 正文

[PyQt5]打开Excel、CSV,tableWidget转换为dataframe,listWidget添加选项,for循环列表推导式--list/dict_pyqt excel

pyqt excel

untitled.py

  1. # -*- coding: utf-8 -*-
  2. # Form implementation generated from reading ui file 'untitled.ui'
  3. #
  4. # Created by: PyQt5 UI code generator 5.15.9
  5. #
  6. # WARNING: Any manual changes made to this file will be lost when pyuic5 is
  7. # run again. Do not edit this file unless you know what you are doing.
  8. from PyQt5 import QtCore, QtGui, QtWidgets
  9. class Ui_Form(object):
  10. def setupUi(self, Form):
  11. Form.setObjectName("Form")
  12. Form.resize(640, 480)
  13. self.verticalLayout_3 = QtWidgets.QVBoxLayout(Form)
  14. self.verticalLayout_3.setObjectName("verticalLayout_3")
  15. self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
  16. self.horizontalLayout_2.setObjectName("horizontalLayout_2")
  17. self.pushButton_excel = QtWidgets.QPushButton(Form)
  18. self.pushButton_excel.setObjectName("pushButton_excel")
  19. self.horizontalLayout_2.addWidget(self.pushButton_excel)
  20. self.pushButton_csv = QtWidgets.QPushButton(Form)
  21. self.pushButton_csv.setObjectName("pushButton_csv")
  22. self.horizontalLayout_2.addWidget(self.pushButton_csv)
  23. self.verticalLayout_3.addLayout(self.horizontalLayout_2)
  24. self.horizontalLayout = QtWidgets.QHBoxLayout()
  25. self.horizontalLayout.setObjectName("horizontalLayout")
  26. self.verticalLayout_2 = QtWidgets.QVBoxLayout()
  27. self.verticalLayout_2.setObjectName("verticalLayout_2")
  28. self.tableWidget = QtWidgets.QTableWidget(Form)
  29. self.tableWidget.setObjectName("tableWidget")
  30. self.tableWidget.setColumnCount(0)
  31. self.tableWidget.setRowCount(0)
  32. self.verticalLayout_2.addWidget(self.tableWidget)
  33. self.pushButton_tW2df = QtWidgets.QPushButton(Form)
  34. self.pushButton_tW2df.setObjectName("pushButton_tW2df")
  35. self.verticalLayout_2.addWidget(self.pushButton_tW2df)
  36. self.horizontalLayout.addLayout(self.verticalLayout_2)
  37. self.verticalLayout = QtWidgets.QVBoxLayout()
  38. self.verticalLayout.setObjectName("verticalLayout")
  39. self.listWidget = QtWidgets.QListWidget(Form)
  40. self.listWidget.setObjectName("listWidget")
  41. self.verticalLayout.addWidget(self.listWidget)
  42. self.pushButton_addLW = QtWidgets.QPushButton(Form)
  43. self.pushButton_addLW.setObjectName("pushButton_addLW")
  44. self.verticalLayout.addWidget(self.pushButton_addLW)
  45. self.pushButton_fL = QtWidgets.QPushButton(Form)
  46. self.pushButton_fL.setObjectName("pushButton_fL")
  47. self.verticalLayout.addWidget(self.pushButton_fL)
  48. self.pushButton_fD = QtWidgets.QPushButton(Form)
  49. self.pushButton_fD.setObjectName("pushButton_fD")
  50. self.verticalLayout.addWidget(self.pushButton_fD)
  51. self.horizontalLayout.addLayout(self.verticalLayout)
  52. self.horizontalLayout.setStretch(0, 3)
  53. self.horizontalLayout.setStretch(1, 1)
  54. self.verticalLayout_3.addLayout(self.horizontalLayout)
  55. self.retranslateUi(Form)
  56. QtCore.QMetaObject.connectSlotsByName(Form)
  57. def retranslateUi(self, Form):
  58. _translate = QtCore.QCoreApplication.translate
  59. Form.setWindowTitle(_translate("Form", "Form"))
  60. self.pushButton_excel.setText(_translate("Form", "打开Excel"))
  61. self.pushButton_csv.setText(_translate("Form", "打开CSV"))
  62. self.pushButton_tW2df.setText(_translate("Form", "tableWidget转换为dataframe"))
  63. self.pushButton_addLW.setText(_translate("Form", "listWidget添加选项"))
  64. self.pushButton_fL.setText(_translate("Form", "for循环列表推导式--list"))
  65. self.pushButton_fD.setText(_translate("Form", "for循环列表推导式--dict"))

主代码: 

  1. import sys
  2. import pandas as pd
  3. from PyQt5.QtWidgets import *
  4. from untitled import Ui_Form
  5. class MyMainWindow(QWidget, Ui_Form): # 继承 QWidget类和 Ui_Form界面类
  6. def __init__(self, parent=None):
  7. super(MyMainWindow, self).__init__(parent) # 初始化父类
  8. self.setupUi(self) # 继承 Ui_Form 界面类
  9. # 设置选择模式为多选模式
  10. # self.listWidget.setSelectionMode(QListWidget.ExtendedSelection)
  11. self.listWidget.setSelectionMode(QAbstractItemView.MultiSelection)
  12. # ********** 打开Excel
  13. self.pushButton_excel.clicked.connect(self.openExcel)
  14. self.pushButton_excel.clicked.connect(self.creatExcelTable)
  15. # ********** 打开CSV
  16. self.pushButton_csv.clicked.connect(self.openCSV)
  17. self.pushButton_csv.clicked.connect(self.creatCsvTable)
  18. # ********** 将tableWidget转换为dataframe
  19. self.pushButton_tW2df.clicked.connect(self.tW2df)
  20. # ********** 设置up_listWidget选项
  21. self.pushButton_addLW.clicked.connect(self.addlistWidgetItem)
  22. # ********** for循环列表推导式--list
  23. self.pushButton_fL.clicked.connect(self.forLoopListDerivationFormula_list)
  24. # ********** for循环列表推导式--dict
  25. self.pushButton_fD.clicked.connect(self.forLoopListDerivationFormula_dict)
  26. # 打开Excel
  27. def openExcel(self):
  28. openXlsName = QFileDialog.getOpenFileName(self, '选择Excel文件', '',
  29. 'Excel files(*.xlsx , *.xls)')
  30. global excelPath
  31. excelPath = openXlsName[0]
  32. # print("Excel路径:", excelPath)
  33. def creatExcelTable(self):
  34. # print("Excel路径:", excelPath)
  35. try:
  36. # 读取Excel,将内容转写进表格
  37. inputTable = pd.read_excel(excelPath)
  38. # print(inputTable)
  39. # 设置表格行数与列数
  40. inputTableRows = inputTable.shape[0]
  41. inputTableColunms = inputTable.shape[1]
  42. # print(inputTableRows)
  43. # print(inputTableColunms)
  44. self.tableWidget.setRowCount(inputTableRows)
  45. self.tableWidget.setColumnCount(inputTableColunms)
  46. # 表头设置
  47. inputTableHeader = inputTable.columns.values.tolist()
  48. # print(inputTableHeader)
  49. self.tableWidget.setHorizontalHeaderLabels(inputTableHeader)
  50. for i in range(inputTableRows):
  51. for j in range(inputTableColunms):
  52. self.tableWidget.setItem(i, j, QTableWidgetItem(str(inputTable.iloc[i, j])))
  53. # 设置表格不可编辑
  54. self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
  55. except Exception as e:
  56. QMessageBox.critical(self, "错误", f"读取Excel文件时出错。\n{e}")
  57. # 打开CSV
  58. def openCSV(self):
  59. openCsvName = QFileDialog.getOpenFileName(self, '选择CSV文件', '',
  60. 'CSV files(*.csv)')
  61. global csvPath
  62. csvPath = openCsvName[0]
  63. # print("Csv路径:", csvPath)
  64. def creatCsvTable(self):
  65. # print("Csv路径:", csvPath)
  66. try:
  67. # 读取CSV,将内容转写进表格
  68. inputTable = pd.read_csv(csvPath)
  69. # print(inputTable)
  70. # 设置表格行数与列数
  71. inputTableRows = inputTable.shape[0]
  72. inputTableColunms = inputTable.shape[1]
  73. # print(inputTableRows)
  74. # print(inputTableColunms)
  75. self.tableWidget.setRowCount(inputTableRows)
  76. self.tableWidget.setColumnCount(inputTableColunms)
  77. # 表头设置
  78. inputTableHeader = inputTable.columns.values.tolist()
  79. # print(inputTableHeader)
  80. self.tableWidget.setHorizontalHeaderLabels(inputTableHeader)
  81. for i in range(inputTableRows):
  82. for j in range(inputTableColunms):
  83. self.tableWidget.setItem(i, j, QTableWidgetItem(str(inputTable.iloc[i, j])))
  84. # 设置表格不可编辑
  85. self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
  86. except Exception as e:
  87. QMessageBox.critical(self, "错误", f"读取CSV文件时出错。\n{e}")
  88. def addlistWidgetItem(self):
  89. # 清空选项框(必需)
  90. self.listWidget.clear()
  91. # 返回主窗口表格列数
  92. numberCol = self.tableWidget.columnCount()
  93. # print(numberCol)
  94. listWidgeDt = []
  95. # 获取表格表头内容
  96. for c in range(numberCol):
  97. headerItem = self.tableWidget.horizontalHeaderItem(c)
  98. # print(headerItem)
  99. if headerItem != None:
  100. headerText = headerItem.text()
  101. # print(headerText)
  102. listWidgeDt.append(headerText)
  103. # print(listWidgeDt)
  104. self.listWidget.addItems(listWidgeDt)
  105. self.listWidget.selectAll() # 设置全选
  106. def tableWidget2dataframe(self, tableWidget):
  107. data = []
  108. for r in range(self.tableWidget.rowCount()):
  109. row = []
  110. for c in range(self.tableWidget.columnCount()):
  111. item = self.tableWidget.item(r, c)
  112. if item is not None:
  113. row.append(item.text())
  114. else:
  115. row.append('')
  116. data.append(row)
  117. df = pd.DataFrame(data)
  118. return df
  119. def tW2df(self):
  120. print(self.tableWidget2dataframe(self.tableWidget))
  121. def forLoopListDerivationFormula_list(self):
  122. # 获取选中的文本
  123. # selectItem = self.listWidget.currentItem() # 返回选中的项(仅限单选)
  124. selectItem = self.listWidget.selectedItems() # 返回一个包含item对象的list对象
  125. select_item = [i.text() for i in selectItem]
  126. # print(select_item)
  127. tb_cols = self.tableWidget.columnCount()
  128. # 方法一:for循环
  129. list_c = []
  130. for i in select_item:
  131. for c in range(tb_cols):
  132. if self.tableWidget.horizontalHeaderItem(c).text() == i:
  133. # print(c)
  134. list_c.append(c)
  135. print(list_c)
  136. # 方法二:for循环列表推导式
  137. list_x = [c for i in select_item for c in range(tb_cols) if
  138. self.tableWidget.horizontalHeaderItem(c).text() == i]
  139. print(list_x)
  140. def forLoopListDerivationFormula_dict(self):
  141. # 获取选中的文本
  142. # selectItem = self.listWidget.currentItem() # 返回选中的项(仅限单选)
  143. selectItem = self.listWidget.selectedItems() # 返回一个包含item对象的list对象
  144. select_item = [i.text() for i in selectItem]
  145. # print(select_item)
  146. tb_cols = self.tableWidget.columnCount()
  147. dict_x = {c: i for i in select_item for c in range(tb_cols) if
  148. self.tableWidget.horizontalHeaderItem(c).text() == i}
  149. print(dict_x)
  150. if __name__ == '__main__':
  151. app = QApplication(sys.argv) # 在 QApplication 方法中使用,创建应用程序对象
  152. myWin = MyMainWindow() # 实例化 MyMainWindow 类,创建主窗口
  153. myWin.show() # 在桌面显示控件 myWin
  154. sys.exit(app.exec_()) # 结束进程,退出程序

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/422058?site
推荐阅读
相关标签
  

闽ICP备14008679号