Search code examples
pythonpyqtpyqt5qtablewidget

exporting a table widget in excel with headers


I need exporting a table widget as an excel file including vertical and horizontal headers

This code allows doing that but without the headers:

    def createTable(self):
   # Create table
    self.tableWidget = QTableWidget()
    self.tableWidget.setRowCount(4)
    self.tableWidget.setColumnCount(2)
    self.tableWidget.setHorizontalHeaderLabels(['a','b'])
    print(self.tableWidget.horizontalHeaderItem(1).text())
    self.tableWidget.setItem(0,0, QTableWidgetItem("Cell (1,1)"))
    self.tableWidget.setItem(0,1, QTableWidgetItem("Cell (1,2)"))
    self.tableWidget.setItem(1,0, QTableWidgetItem("Cell (2,1)"))
    self.tableWidget.setItem(1,1, QTableWidgetItem("Cell (2,2)"))
    self.tableWidget.setItem(2,0, QTableWidgetItem("Cell (3,1)"))
    self.tableWidget.setItem(2,1, QTableWidgetItem("Cell (3,2)"))
    self.tableWidget.setItem(3,0, QTableWidgetItem("Cell (4,1)"))
    self.tableWidget.setItem(3,1, QTableWidgetItem("Cell (4,2)"))
    self.tableWidget.move(0,0)

    # table selection change
    self.tableWidget.doubleClicked.connect(self.on_click_table)

def savefile(self):
    filename = QFileDialog.getSaveFileName(self, 'Save File', '', ".xls(*.xls)")
    wbk = xlwt.Workbook()
    sheet = wbk.add_sheet("sheet", cell_overwrite_ok=True)
    for currentColumn in range(self.tableWidget.columnCount()):
        for currentRow in range(self.tableWidget.rowCount()):
            teext = str(self.tableWidget.item(currentRow, currentColumn).text())
            sheet.write(currentRow, currentColumn, teext)
    wbk.save(filename[0])

That's the output:

enter image description here

How is possible include headers?

Tks


Solution

  • The simplest thing is to use the model instead of the items, and the idea is only to move the indexes:

    def savefile(self):
        filename,_ = QFileDialog.getSaveFileName(self, 'Save File', '', ".xls(*.xls)")
        wbk = xlwt.Workbook()
        sheet = wbk.add_sheet("sheet", cell_overwrite_ok=True)
        style = xlwt.XFStyle()
        font = xlwt.Font()
        font.bold = True
        style.font = font
        model = self.tableWidget.model()
        for c in range(model.columnCount()):
            text = model.headerData(c, QtCore.Qt.Horizontal)
            sheet.write(0, c+1, text, style=style)
    
        for r in range(model.rowCount()):
            text = model.headerData(r, QtCore.Qt.Vertical)
            sheet.write(r+1, 0, text, style=style)
    
        for c in range(model.columnCount()):
            for r in range(model.rowCount()):
                text = model.data(model.index(r, c))
                sheet.write(r+1, c+1, text)
        wbk.save(filename)