如何使用 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 值,你会自己看到的。