excelpandaspyqtspreadsheet-excel-writer

PYQT4 not able to write into excelwriter


I have a gui I created in pyqt4 that has a function to call a module that is supposed to write into an excel sheet using pandas excelwriter. For some reason, it creates the worksheet but does not write anything into it. It just crashes my qui without any errors..when I run it in debug mode, it apparently goes through without any issues. I have been debugging this for the past few days and now point the issue between pyqt and excelwriter.Is there a known issue that pyqt does not like pandas excelwriter?

from PyQt4 import QtCore,QtGui  
import sys
from MAIN_GUI import *

if __name__=="__main__":
    app = Qt.Gui.QApplication(sys.argv)


class MAIN_GUI(QtGui.QMainWindow):
        def __init__self:
            super(MAIN_GUI, self.__init__:
            self.uiM=Ui_MainWindow
            self.uiM.setupUi(self)
            self.connect(self.uiM.updateALL_Button,QtCore.SIGNAL('clicked()'),self.updateALLEXCEL)

def updateALLEXCEL(self):
    import excel_dummy

main_gui = MAIN_GUI()
main_gui.show()
main_gui.raise_()
sys.exit(app.exec_())

---excel_dummy.py---

import pandas as pd
from pandas import ExcelWriter

def excelify():
    with ExcelWriter('/home/Desktop/Excelified/final.xlsx', engine='xlsxwriter') as writer:

        workbook=writer.book
        worksheet=workbook.add_worksheet()
        worksheet.write(2,2,'just write something')
    writer.save()
excelify()

---MAIN_GUI.py---

from PyQt4 import QtCore,QtGui
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.unicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(320,201)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.updateALL_Button = QtGui.QPushButton(self.centralwidget)
        self.updateALL_Button.setGeometry(QtCore.QRect(40,110,161,27))
        self.updateALL_Button.setFocusPolicy(QtCore.Qt.NoFocus)
        self.updateAll_Button.setObjectName(_fromUtf8("Options_updateALL_Button"))
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtGui.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 320, 24))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self,MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.updateALL_Button.setText(_translate("MainWindow", "updateALL", None))

Solution

  • The code below works for me. That is, after I click the updateALL button, it prints this:

    file size: 5259 "/tmp/final.xlsx"
    

    and viewing the resulting file shows this:

    enter image description here

    Note that I had to fix quite a lot of bugs to get your example to work. So make sure you use all the files below when you test it:

    main.py:

    import sys
    from MAIN_GUI import *
    from PyQt4 import QtGui, QtCore
    
    if __name__=="__main__":
        app = QtGui.QApplication(sys.argv)
    
    
    class MAIN_GUI(QtGui.QMainWindow):
        def __init__(self):
            super(MAIN_GUI, self).__init__()
            self.uiM = Ui_MainWindow()
            self.uiM.setupUi(self)
            self.connect(self.uiM.updateALL_Button,QtCore.SIGNAL('clicked()'),self.updateALLEXCEL)
    
        def updateALLEXCEL(self):
            try:
                import excel_dummy
            except:
                from traceback import format_exception
                msg = ''.join(format_exception(*sys.exc_info()))
                mb = QtGui.QMessageBox()
                mb.setWindowTitle('Error')
                mb.setText('Click Show Details to get the Traceback')
                mb.setDetailedText(msg)
                mb.exec_()
    
    
    main_gui = MAIN_GUI()
    main_gui.show()
    main_gui.raise_()
    sys.exit(app.exec_())
    

    excel_dummy.py:

    import os, pandas as pd
    from pandas import ExcelWriter
    
    def excelify():
        path = '/tmp/final.xlsx'
        with ExcelWriter(path, engine='xlsxwriter') as writer:
            workbook = writer.book
            worksheet = workbook.add_worksheet()
            worksheet.write(2, 2, 'just write something')
            writer.save()
        print('file size: %s "%s"' % (os.stat(path).st_size, path))
    
    excelify()
    

    MAIN_GUI.py:

    from PyQt4 import QtCore,QtGui
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
    
    try:
        _encoding = QtGui.QApplication.unicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(320,201)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.updateALL_Button = QtGui.QPushButton(self.centralwidget)
            self.updateALL_Button.setGeometry(QtCore.QRect(40,110,161,27))
            self.updateALL_Button.setFocusPolicy(QtCore.Qt.NoFocus)
            self.updateALL_Button.setObjectName(_fromUtf8("Options_updateALL_Button"))
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 320, 24))
            self.menubar.setObjectName(_fromUtf8("menubar"))
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName(_fromUtf8("statusbar"))
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self,MainWindow):
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
            self.updateALL_Button.setText(_translate("MainWindow", "updateALL", None))