如何使用openpyxl将qtablewidget数据保存到excel文件中
Posted
技术标签:
【中文标题】如何使用openpyxl将qtablewidget数据保存到excel文件中【英文标题】:how to save qtablewidget data into excel file using openpyxl 【发布时间】:2020-12-18 16:27:52 【问题描述】:我有一个包含数据的 qtablewidet,当用户单击导出按钮时,会出现一个对话框,要求将文件名另存为 excel,我该如何使用 openpyxl?
这是我的代码
self.exportbtn.clicked.connect(self.export)
def export(self):
try:
filename = QtWidgets.QFileDialog.getSaveFileName(self, 'Save file', '','Excel files(*.xlsx)')
wb = Workbook()
sheet = wb.active
for column in range(self.tableWidget.columnCount()):
for row in range(self.tableWidget.rowCount()):
try:
text = str(self.tableWidget.item(row, column).text())
sheet.write(row, column, text)
wb.save(filename)
except Exception as e:
print("Error Writing file.")
except Exception as e:
print("Error Saving file.")
当我尝试从对话框中单击保存时,现在的输出是这样的
如何使用 openpyxl 将包括来自 qtablewidget 的标头在内的整个数据保存到 excel 文件中?
更新: 我现在编辑了我的代码,我能够创建文件,但是来自 qtablewidget 的数据仍然没有写入 excel 文件中
def export(self):
filename, filter = QtWidgets.QFileDialog.getSaveFileName(self, 'Save file', '','Excel files (*.xlsx)')
wb = Workbook()
sheet = wb.active
if not filename:
for column in range(self.tableWidget.columnCount()):
for row in range(self.tableWidget.rowCount()):
try:
text = str(self.tableWidget.item(row, column).text())
sheet.write(row, column, text)
except AttributeError:
pass
wb.save(filename)
我尝试从 qtablewidget 打印数据,它显示,它只是没有保存在 excel 文件中,是否还缺少某些东西?
【问题讨论】:
更改为print("Error Writing file.", e)
【参考方案1】:
所以你的行 wb.save(filename) 在你的 for 循环中,因此在每个循环中都保存了相同的文件名。
将该行移到外部缩进的 for 循环之后,因此只保存一次。
另外,请确保文件名不存在,否则您可能会看到弹出对话框“您确定吗?”然后你需要强制保存它。
【讨论】:
但是当我把它移到外面时它说AttributeError: 'tuple' object has no attribute 'write'
我希望您必须检查从 qtablewidget 获得的值。
我希望您必须检查从 qtablewidget 获得的值,以确保您没有获得无效(空)值。使用打印来验证这些值是否有效。此外,您可以使用以下几行将值保存到 excel 中,并且您的代码中已经包含其中的大部分。 from openpyxl import Workbook wb = Workbook() sheet = wb.active #在for循环中,获取单元格的引用,并分配数据值 cellref = sheet.cell(row=4,column=5) cellref.value = '你的数据对于单元格'#在 for 循环之后 wb.save('samplefile.xlsx')
我现在可以创建 .xlsx 文件,但 qtable 中的数据没有写入文件,我尝试打印 qtablewidget 中的值,它显示,它只是不保存到 excel文件,抱歉我没有得到单元格部分的获取参考?
您的问题可能不在于保存到 Excel,而只是为了确定。首先简单地测试您是否可以将一个简单的字符串保存到 Excel,使用您的代码只需在单元格中输入一个值,就像这样。# 获取单元格的引用 cellref = sheet.cell(row=4,column=5) # 为单元格赋值 cellref.value = 'test hello world' #for 循环之后 wb.save('samplefile.xlsx')【参考方案2】:
QFileDialog 的几乎所有静态方法(getExistingDirectory()
和getExistingDirectoryUrl()
除外)都以(file(s), filter)
的形式返回一个元组。
对于getOpenFileNames()
(注意复数形式),第一个对象是指示所选文件的字符串列表,在其他情况下,它是字符串或 URL 形式的文件路径。
请注意,如果对话框被取消,则文件字符串(或列表)为空,因此在继续写入文件之前应检查:
filename, filter = QtWidgets.QFileDialog.getSaveFileName(
self, 'Save file', '','Excel files(*.xlsx)')
if not filename:
return
# ...
此外,您不应尝试在 for 循环的每个循环中保存文件。
虽然 Qt 中 99% 的函数在 PyQt 中的行为方式相同,但这并不总是正确的,尤其是对于 C++ 使用引用变量的情况。每当您不确定某个函数或从中获得意外行为时,您可以检查 PyQt documentation(返回的类型在函数定义的末尾指定,在 → 之后)或直接调用 help(class.function)
in蟒蛇控制台。一个更简单的解决方案是 print
返回的值,你会自己看到的。
【讨论】:
我现在可以创建 xlsx 文件并保存,但是当我打开它时,没有保存数据并且为空,for 循环中是否缺少某些内容?我也将 wb.save 移到了外面以上是关于如何使用openpyxl将qtablewidget数据保存到excel文件中的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF