如何使用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

如何将文本与 QTableWidget 中的单元格中心对齐

如何将文本与 QTableWidget 中的单元格中心对齐

如何使用 openpyxl 使用宏保存 XLSM 文件

如何将所选项目从 QListWidget、QTableWidget 保存到 Qsettings

Openpyxl:将单元格与 x y 合并。如何将 id 转换为 Excel 列字母?