sauvegarder le classur avec openpyxl dans ironpython

Je suis en train de résoudre un problème en sauvegardant un file excel en utilisant openpyxl en utilisant le moteur d'exécution IronPython embedded dans une application .NET 4.0, mais lors de l'exécution du même code dans l'interprète IronPython, je ne reçois aucune erreur et l'logging est réussi. Littéralement, le code est aussi simple que ceci:

import sys sys.path.append(r'c:\python27\lib\site-packages') import openpyxl wb=openpyxl.Workbook() wb.save(r'c:\save\to\somewhere.xlsx') 

Lors de l'exécution de ce code dans l'application .NET, j'obtiens la trace de stack suivante:

 une erreur s'est produite lors de l'logging dans "c: \ _ kevin \ test.xlsx": Traceback (dernier appel en dernier):
     Fichier "C: \ path \ vers \ script \ file.py", ligne 582, dans __write_logs_to_excel
     wb.save (outfile)
   Fichier "C: \ Python27 \ Lib \ site-packages \ openpyxl \ workbook.py", ligne 265, en sauvegarde
     save_workbook (self, filename)
   Fichier "C: \ Python27 \ Lib \ site-packages \ openpyxl \ writer \ excel.py", ligne 187, dans save_workbook
     writer.save (nom de file)
   Fichier "C: \ Python27 \ Lib \ site-packages \ openpyxl \ writer \ excel.py", ligne 170, en sauvegarde
     self.write_data (archive)
   Fichier "C: \ Python27 \ Lib \ site-packages \ openpyxl \ writer \ excel.py", ligne 76, dans write_data
     shared_ssortingng_table = self._write_ssortingng_table (archive)
   Fichier "C: \ Python27 \ Lib \ site-packages \ openpyxl \ writer \ excel.py", ligne 105, dans _write_ssortingng_table
     archive.writestr (ARC_SHARED_STRINGS,
   Fichier "C: \ Python27 \ Lib \ site-packages \ openpyxl \ writer \ ssortingngs.py", ligne 47, dans write_ssortingng_table
     start_tag (doc, 'sst', {'xmlns':
   Fichier "C: \ Python27 \ Lib \ site-packages \ openpyxl \ shared \ xmltools.py", ligne 172, dans start_tag
     doc.startElementNS ((namespace, nom), nom, attr2)
   Fichier "C: \ Python27 \ Lib \ xml \ sax \ saxutils.py", ligne 165, dans startElementNS
     def startElementNS (auto, nom, qname, attrs):
   Fichier "C: \ Python27 \ Lib \ xml \ sax \ saxutils.py", ligne 102, en écriture
     def write (self, s):
 TypeError: attendu depuis longtime, obtenu NoneType

J'initialise le moteur Python avec le code suivant:

 _pythonEngine = Python.CreateEngine(engineDict); _memStream = new System.IO.MemoryStream(); _streamWriter = new util.EventRaisingStreamWriter(_memStream); _pythonEngine.Runtime.IO.SetErrorOutput(_memStream, _streamWriter); _pythonEngine.Runtime.IO.SetOutput(_memStream, _streamWriter); 

_streamwriter est un wrapper pour envoyer des sorties sur des events dans une textbox.

Pourquoi pourrais-je économiser sans problème de l'interprète et non avec le moteur? J'ai essayé de ne pas redirect les stream de sortie et la même erreur s'est produite.

  • IronPython version = 2.7.0.40 (version du file 2.7.4.1000)
  • version openpyxl = 1.8.5
  • python version = 2.7.6

Merci.

Si vous avez l'air d'utiliser une partie du stdlib de CPython:

 File "C:\Python27\Lib\xml\sax\saxutils.py", line 165, in startElementNS def startElementNS(self, name, qname, attrs): File "C:\Python27\Lib\xml\sax\saxutils.py", line 102, in write def write(self, s): TypeError: expected long, got NoneType 

Le stdlib d'IronPython est légèrement différent. Lors de l'exécution sous l'interprète, il est probablement en train de reprendre le stdlib IronPython, mais dans votre programme, il prend le CPython lib.

Lors de l'intégration, vous pouvez utiliser le engine.SetSearchPaths pour contrôler le path de search.