将 QTableWidget 写入 .csv 或 .xls

2024-02-13

是否可以将 QTableWidget 的内容写入 csv?我发现了一个关于使用 xlwt 写入 .xls 的问题,但似乎无法使用我的代码使其工作。

def saveFile(self):
    filename = unicode(QtGui.QFileDialog.getSaveFileName(self, 'Save File', '', ".xls(*.xls)"))    
    wbk = xlwt.Workbook()
    self.sheet = wbk.add_sheet("sheet")
    self.write()
    wbk.save(filename)    


def write(self):
    for col in range (self.coordinates.columnCount()):
        for row in range(self.coordinates.rowCount()):
            text=str(self.coordinates.item(row,col).text())
            self.sheet.write(row,col,text)

我收到以下错误:

  File "C:\Users\Tory\Desktop\DIDSON.py", line 186, in saveFile
    self.write()
  File "C:\Users\Tory\Desktop\DIDSON.py", line 192, in write
    text=str(self.coordinates.item(row,col).text())
AttributeError: 'NoneType' object has no attribute 'text'

为什么是这样? self.coordinates 是一个 QTableWidget。我能够将项目本身成功保存到工作表中,尽管我仍然想保存为 .csv...


回答有关的问题AttributeError:这可能是因为表中存在一些空行或空列。

空单元格没有QTableWidgetItem分配给它,所以table.item()将返回None(这显然没有'text'属性)。

要将表格另存为 csv,请尝试下面的示例(也可以opencsv 文件,并希望能够处理任何潜在的 unicode 问题):

import sys, csv
from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):
    def __init__(self, rows, columns):
        QtGui.QWidget.__init__(self)
        self.table = QtGui.QTableWidget(rows, columns, self)
        for column in range(columns - 1):
            for row in range(rows - 1):
                item = QtGui.QTableWidgetItem('Text%d' % row)
                self.table.setItem(row, column, item)
        self.buttonOpen = QtGui.QPushButton('Open', self)
        self.buttonSave = QtGui.QPushButton('Save', self)
        self.buttonOpen.clicked.connect(self.handleOpen)
        self.buttonSave.clicked.connect(self.handleSave)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.table)
        layout.addWidget(self.buttonOpen)
        layout.addWidget(self.buttonSave)

    def handleSave(self):
        path = QtGui.QFileDialog.getSaveFileName(
                self, 'Save File', '', 'CSV(*.csv)')
        if not path.isEmpty():
            with open(unicode(path), 'wb') as stream:
                writer = csv.writer(stream)
                for row in range(self.table.rowCount()):
                    rowdata = []
                    for column in range(self.table.columnCount()):
                        item = self.table.item(row, column)
                        if item is not None:
                            rowdata.append(
                                unicode(item.text()).encode('utf8'))
                        else:
                            rowdata.append('')
                    writer.writerow(rowdata)

    def handleOpen(self):
        path = QtGui.QFileDialog.getOpenFileName(
                self, 'Open File', '', 'CSV(*.csv)')
        if not path.isEmpty():
            with open(unicode(path), 'rb') as stream:
                self.table.setRowCount(0)
                self.table.setColumnCount(0)
                for rowdata in csv.reader(stream):
                    row = self.table.rowCount()
                    self.table.insertRow(row)
                    self.table.setColumnCount(len(rowdata))
                    for column, data in enumerate(rowdata):
                        item = QtGui.QTableWidgetItem(data.decode('utf8'))
                        self.table.setItem(row, column, item)

if __name__ == '__main__':

    app = QtGui.QApplication(sys.argv)
    window = Window(10, 5)
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 QTableWidget 写入 .csv 或 .xls 的相关文章

随机推荐

  • 如何排除 jasmine 中的某些规范文件?

    有没有办法排除 jasmine 目录中的某些规范文件 例如 我想从 Foo 文件夹中排除扩展文件夹中的所有规范 Foo sub extended a spec js e spec js b spec js c spec js d spec
  • 标头保护/翻译单元问题

    我的印象是标头保护解决了重新定义的问题 我收到链接器错误 表明 obj 文件中存在重新定义 这是我要包含的标头 问题在于所有全局声明的重新定义 ifndef DIRECT3D H define DIRECT3D H global decla
  • 如何将 WPF 项添加到 VS2019 中的 C# 类库项目中?

    我已在 Visual Studio 2019 中启动了一个类库项目 现在希望向其中添加 WPF 项 窗口 用户控件 自定义控件 但 添加项 对话框在 WPF 部分下未列出任何内容 我在以前版本的 VS 中遇到过这个问题 并通过添加
  • 为什么 MATLAB 使用列优先顺序? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我知道C语言使用行优先顺序来存储数组 而MATLAB使用列优先顺序 MATLAB 选择列优先顺序有什么具体原因吗 通过选择在内存中按列排列
  • 如何访问 cl-json 从 JSON 解码的对象?

    我正在尝试在 Common Lisp 中导入 JSON 我想出了如何从 JSON 字符串解码对象 但我不知道如何访问返回的对象的属性 要解码字符串 并将结果存储在 tempjson 中 我这样做 defun test json with i
  • Mysql 未与 JNDI Tomcat 6 重新连接

    我使用 JNDI 和 Tomcat6 来管理 Mysql 连接 我的 Catalina domain com ROOT xml 有
  • 内核:如何从进程的task_struct中找到所有线程?

    给定一个进程或线程的任务结构 迭代属于同一进程的所有其他线程的习惯用法是什么 Linux 不区分进程 任务 和线程 库调用 fork 和 pthread create 使用相同的系统调用 clone fork 和 pthread creat
  • JSR 305 的状态如何?

    我已经看到问题了JSR305 与 JSR308 Java 类型注释 哪个将成为标准 https stackoverflow com questions 1476757 jsr305 vs jsr308 java type anotation
  • 如何在 OpenCart 的任何页面上显示小计?

    目前我知道的唯一全局 PHP 命令是
  • 如何将滑动选项卡视图放入导航抽屉选项之一

    更新的代码 Override public View onCreateView LayoutInflater inflater ViewGroup container Bundle savedInstanceState View rootV
  • 链接元素加载

    无论如何 有没有办法监听 onload 事件元素 F ex var link document createElement link link rel stylesheet link href styles css link onload
  • 如何使用 python 打开 adb shell 并在 shell 内执行命令

    我正在尝试使用 subprocess Popen 在 python 中执行 adb shell 命令 示例 需要在 adb shell 中执行 命令 手动执行时 我打开命令窗口并按如下所示执行 它可以工作 gt adb shell
  • 如果芹菜工人死了,工作会重试吗?

    如果运行工作程序的服务器挂掉 是否有办法重试 celery 作业 我指的不仅仅是执行作业的子进程 而是整个服务器变得不可用 我尝试使用 RabbitMQ 和 Redis 作为代理 在这两种情况下 如果当前正在处理作业 则它会被完全遗忘 当工
  • 当键盘出现时 ActionBar 隐藏

    我正在使用 ActionBarSherlock windowSoftInputMode is adjustPan 我尝试过adjustResize and adjustNothing also 我想保留ActionBar当键盘出现时屏幕上b
  • 从 Laravel 查询生成器生成原始 MySQL 查询

    我怎样才能得到mysql查询一个laravel query Convert App User where balance gt 0 gt where gt get To SELECT FROM users WHERE balance gt
  • 从 CoffeeScript 文件调用 JavaScript 函数

    我需要在我的 CoffeeScript 应用程序中使用 JavaScript 库 由于我对两种语言都不熟悉 所以我尝试一些简单的方法 我的咖啡脚本文件 empty require models empty class Contact ext
  • glGenTextures - 纹理的数量有限制吗?

    在 OpenGL 中 即使用 glGenTextures 可以创建的纹理数量是否有限制 我知道 GL 施加了一些限制 例如 片段着色器中可以使用的纹理数量 但是 我无法找到任何有关可用的整数 纹理名称 总数的文档 glGenTextures
  • 基本 Javascript 数学文本字段

    你好 我是新人 正在学习 javascript 我正在尝试通过文本字段制作一个加法程序 检查js fiddle上的html代码http jsfiddle net fCXMt http jsfiddle net fCXMt 我需要知道的是如何
  • 突出显示 PHP 中两个字符串之间的差异

    在 PHP 中突出显示两个字符串之间的差异的最简单方法是什么 我正在沿着 Stack Overflow 编辑历史页面的思路思考 其中新文本为绿色 删除的文本为红色 如果有任何预先编写的函数或类可用 那将是理想的 只是编写了一个类来计算将一个
  • 将 QTableWidget 写入 .csv 或 .xls

    是否可以将 QTableWidget 的内容写入 csv 我发现了一个关于使用 xlwt 写入 xls 的问题 但似乎无法使用我的代码使其工作 def saveFile self filename unicode QtGui QFileDi