2017-07-26 1 views
1

Actuellement, je travaille à gérer les connexions SQL à un fichier Excel via un script Python. Le script utilise xlwings pour lire et écrire dans le classeur. Malheureusement, seule la pièce «lue» fonctionne. J'ai peigné Stackoverflow depuis un bon moment aujourd'hui et personne ne semble avoir ce problème. Voici un code de débogage que j'ai écrit dans le script Python pertinent (il existe sur une feuille de calcul en tant que UDF, la feuille que j'essaye d'écrire est différente); Je ne suis pas terriblement expérimenté avec Python ou encore xlwings alors ne hésitez pas à ronchonner sur la structure/syntaxe :)xlwings problème d'écriture dans les cellules dans Excel 2010

@xw.func 
def compatTest(): 
    #use active workbook 
    wb = xw.Book.caller() 
    #does the sheet Notes exist? 
    if wb.sheets['Notes']: 
     status = "Status: " 
     #does A1 in Notes have a value? 
     if wb.sheets['Notes'].range('$A$1').value: 
      status += "Good" 
      #Can we write to the specified empty cell? 
      try: 
       wb.sheets['Notes'].range('$E$1').value = 'something' 
      #Nope :(
      except Exception as e: 
       status = e.message 
       return status + "can't write :(" 
      #This return statement shouldn't evaluate, just casting a wide net here 
      return status + " " + str(wb.sheets['Notes'].range('$A$1').value) 
     else: 
      #A1 in notes is blank 
      status += "Bad" 
      wb.sheets['Notes'].range('$E$1').value = 'nothing' 
      return status + " " + 'blank :(' 

sortie dans la cellule avec l'UDF en elle: « ne peut pas écrire :(» - cela signifie que le message d'erreur n'est pas retourné.

J'utilise les xlwings 0.11.4 add-in et référence VBA (je suis pas à l'aide du module VBA comme il semble se chevaucher avec le complément et génère VBA erreur 49 'Mauvaise convention d'appel de DLL') .Je n'ai pas touché le code du complément, car contrairement au module les paramètres ne sont pas traités dans le fichier.Les paramètres que j'ai entrés dans le ruban xlwings sont tous précis

Paramètres actuels:
OS: Windows Server 2008 R2 Enterprise (test ici en raison de restrictions, le script ne sera pas déployé ici)
Python version/distro: 2.7/Anaconda2
xlwings Version: 0.11.4
Excel version: 2010 v 14.0.7182.5000 (32 bits)


Edit:. Il est intéressant, quand j'ouvrir le fichier (après la mise à jour des liens & frapper 'Continuer' pour des liens obsolètes), la cellule avec l'affichage UDF s "Statut: Bon". Si je double cliquez sur la cellule pour réévaluer l'UDF, il se transforme en « ne peut pas écrire :(» à nouveau
Si je change le bloc, sauf à ce qui suit:.

except: 
      a = str(sys.exc_info()[0]) 
      b = str(sys.exc_info()[1]) 
      c = str(sys.exc_info()[2]) 
      status = str(a + " \ " + b + " \ " + c) 
      return status 

Je reçois:

"<class 'pywintypes.com_error'> \ (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None) \ <traceback object at 0x0000000007B95708>" 


Edit # 2:
assez que je peux écrire à Bizarrement cellules en utilisant le xw.sub décorateur:

@xw.sub 
def SomeFunction(): 
    wb = xw.Book.caller() 
    wb.sheets['Notes'].range('B3').value = "hello world" 

Ce code fonctionne très bien, mais je préfère courir autant que possible par des FDU si possible.

Répondre

1

Il s'avère que j'ai mal compris le comportement des fonctions dans Excel et l'utilisation du décorateur xw.func - qui va essentiellement convertir ce bloc de code en une fonction Excel. le comportement de la fonction est décrite ici:
https://support.microsoft.com/en-us/help/170787/description-of-limitations-of-custom-functions-in-excel
je l'avais espéré contourner les macros entièrement à réduire les frais généraux, mais malheureusement, les restrictions inhérentes à l'utilisation d'Excel empêcher cela - fonctions ne peuvent pas modifier le contenu d'une autre pièce du classeur. J'espère que cela épargnera à quelqu'un d'autre la peine de perdre quelques jours de travail, bien qu'ils soient certainement éducatifs. Si quelqu'un voit cela et peut suggérer une solution de rechange viable compte tenu de mon environnement, vous êtes plus que bienvenue.