如何使用 openpyxl 将 qtablewidget 数据保存到 excel 文件中
how to save qtablewidget data into excel file using openpyxl
我有一个包含数据的 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 中的 headers 在内的整个数据保存到 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 文件中,是否还缺少某些内容?
所以你的行 wb.save(filename) 在你的 for 循环中,因此在每个循环中保存相同的文件名。
将该行移到外部缩进处的 for 循环之后,因此只保存一次。
此外,请确保文件名不存在,否则您可能会看到一个弹出对话框“您确定吗?”然后你需要强制保存它。
QFileDialog的几乎所有静态方法(getExistingDirectory()
和getExistingDirectoryUrl()
除外)return (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(returned 类型在函数定义的末尾指定,在 → 之后)或者在 python 控制台中调用 help(class.function)
。一个更简单的解决方案是 print
returned 值,你会自己看到的。
我有一个包含数据的 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 中的 headers 在内的整个数据保存到 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 文件中,是否还缺少某些内容?
所以你的行 wb.save(filename) 在你的 for 循环中,因此在每个循环中保存相同的文件名。
将该行移到外部缩进处的 for 循环之后,因此只保存一次。
此外,请确保文件名不存在,否则您可能会看到一个弹出对话框“您确定吗?”然后你需要强制保存它。
QFileDialog的几乎所有静态方法(getExistingDirectory()
和getExistingDirectoryUrl()
除外)return (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(returned 类型在函数定义的末尾指定,在 → 之后)或者在 python 控制台中调用 help(class.function)
。一个更简单的解决方案是 print
returned 值,你会自己看到的。