是否可以将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 ...
答案 0 :(得分:10)
回答关于AttributeError
的问题:可能是因为表中有一些空行或列。
空单元格未分配QTableWidgetItem
,因此table.item()
将返回None
(显然没有'text'
属性。)
要将表保存为csv,请尝试以下示例(也可以打开 csv文件,并希望处理任何潜在的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_())