IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques tierces Python Discussion :

passage de windows xp vers windows 8 avec pywin32 ?


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Points : 46
    Points
    46
    Par défaut passage de windows xp vers windows 8 avec pywin32 ?
    Bonjour,

    Voici un code qui fonctionne parfaitement sous xp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    # -*- coding: UTF-8 -*-
     
    #Imporation des modules
    import win32com.client as win32
    import win32com.client.dynamic
    from pywintypes import UnicodeType, TimeType
    import os
     
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    xls = excel.Workbooks.Open ('F:\Classeur1.xls')
    # passage sur la 1ère feuille pour y mettre les infos de chantier
    pos = xls.Worksheets("Feuil1")
    pos.Activate()      #on active cette feuille
     
    excel.Visible = False
    #
    # Ici le travail d'édition de la première feuille
    #par exemple je mets un texte dans la 1ere cellule de la premiére colonne attention ici c'est d'abord la ligne puis la colonne et ca commence à 1 au lieu de 0 d'habitude
    pos.Cells(1,1).Value = 'test'
     
    # on va chercher la deuxième de feuille (celle du devis)
    sht = xls.Worksheets('Feuil2')
    sht.Activate()
    sht.Cells(13,8).Value = 40
    #sauvegarde simple...
    xls.SaveAs('F:\test.xls')
    xls.Close()
    del excel  # Preferer ceci à celle en dessous, car celle-là ne ferme pas le fichier d'origine.
    #excel.Application.Quit()
    os.startfile('F:\test.xls')
    lorsque j'essaie d'exécuter ce script sur windows 8, j'ai ce traceback:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Traceback (most recent call last):
      File "<module1>", line 53, in <module>
      File "C:\Users\PIERR_~1\AppData\Local\Temp\gen_py\2.7\00020813-0000-0000-C000-000000000046x0x1x6\_Workbook.py", line 253, in SaveAs
        , Local)
    com_error: (-2147352567, 'Une exception s\x92est produite.', (0, u'Microsoft Office Excel', u"Impossible d'acc\xe9der \xe0 \xab\xa0F:\\/\xa0\xbb. Le fichier peut \xeatre endommag\xe9, en lecture seule ou enregistr\xe9 sur un serveur qui ne r\xe9pond pas.", u'C:\\Program Files (x86)\\Microsoft Office\\Office12\\1036\\XLMAIN11.CHM', 0, -2146827284), None)
    Par contre si je mets en ligne 26:
    Et en ligne 30:
    mon "Classeur1.xls" souvre bien avec les modifs et le script se termine sans erreur...

    quelqu'un s'aurait-il pourquoi la fonction xls.SaveAs(nomdefichier) ne fonctionne pas ?

    Merci d'avance,

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    La grosse différence entre XP et Vista+ est la mise en place de l'UAC par défaut i.e. utilisateurs et programmes n'ont pas plus de droits sous Windows qu'ils en ont sous Linux, OSX,...
    Essayez en écrivant le fichier dans une répertoire "a vous" plutôt que dans F:\

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    En fait cela ne fonctionne pas non plus dans un répertoire " à moi" (C:\Users\pierr_000\Documents\test3.xls)

    par contre, le SaveAs fonctionne sous ces forme là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xls.SaveAs('F:\\Test.xls')
    xls.SaveAs(os.path.join('F:', 'Test.xls'))
    de cette manière cela fonctionne pour n'importe quel répertoire...

    ce qui m'amène à un autre problème, je voudrais étoffer en permettant le choix du dossier via Tkinter tkFileDialog.asksaveasfilename, avec ce bout de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    def quitter ():
        # On sauve le fichier modifié
        mesFormats = [
            ('Fichier Excel','*.xls'),
            ('Tous les fichiers','*.*'),
            ]
     
     
        nomFichier = tkFileDialog.asksaveasfilename(parent=Mafenetre,initialdir = 'H:', defaultextension = 'xls', filetypes=mesFormats,title="Sauvez le fichier sous...")
        if len(nomFichier) > 0:
            print "Sauvegarde en cours dans %s" % nomFichier
            xls.SaveAs(nomFichier)
            xls.Close()
            Mafenetre.destroy() #del excel
            os.startfile (nomFichier)
    le print m'indique que le fichier est syntaxé de cette façon : F:\Test.xls
    Et je ne vois pas comment "forcer" l'insertion des doubles \\ ou de quelle manière utiliser os.path.join.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par pierre3401 Voir le message
    En fait cela ne fonctionne pas non plus dans un répertoire " à moi" (C:\Users\pierr_000\Documents\test3.xls)
    Si c'est le cas, il n'y a pas de bonnes raisons pour que ce code fonctionne sous XP: le traitement des "\" par les biblio. C et leur rôle comme séparateur dans les noms de chemins n'a pas change.

    le print m'indique que le fichier est syntaxé de cette façon : F:\Test.xls
    Et je ne vois pas comment "forcer" l'insertion des doubles \\ ou de quelle manière utiliser os.path.join.
    Vous n'avez besoin de le doubler que pour "entrer" la chaine de caractère. "print" affiche de son cote une représentation (ce qui est encore autre chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = r'a\v\b'
    >>> print (a)
    a\v\b
    >>> print (repr(a))
    'a\\v\\b'
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    Et pourtant,
    F:\test.xls me renvoie toujours le même message d'erreur tandis que F:\\test.xls enregistre sans problèmes et termine le script sans erreur...
    le simple backslash fonctionne sous xp pas sur win8
    J'ai trouvé le principe du double bakckslash sur stack Overflow, par contre je n'ai pas trouvé d'explication logique...
    SaveAs doesn't support slash /.
    Try saveAs("F:\\test.xls")
    Or use saveAs(os.path.join("F:", "test.xls"))
    Et donc, ce code faisait partie d'un code sous Tkinter , maintenant je suis bloqué pour pouvoir sauvegarder via tkFileDialog.asksaveasfilename, la fonction me posant le même probleme

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    F:\test.xls me renvoie toujours le même message d'erreur tandis que F:\\test.xls enregistre sans problèmes et termine le script sans erreur...
    le simple backslash fonctionne sous xp pas sur win8
    Et pourtant, çà se teste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.
    
    C:\Documents and Settings\villabe>python
    ActivePython 2.7.0.1 (ActiveState Software Inc.) based on
    Python 2.7 (r27:82500, Jul  4 2010, 19:43:51) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> f = open('c:\test.txt', 'w')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IOError: [Errno 22] invalid mode ('w') or filename: 'c:\test.txt'
    >>> f = open(r'c:\test.txt', 'w')
    >>>
    Et on a la même punition avec Excel / win32client:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> import win32com.client as w32
    >>> xl = w32.Dispatch('Excel.Application')
    >>> xl
    <COMObject Excel.Application>
    >>> wb = xl.Workbooks.Add()
    >>> wb.SaveAs('c:\test.xls')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<COMObject Add>", line 7, in SaveAs
    pywintypes.com_error: (-2147352567, "Une exception s'est produite.", (0, u'Microsoft Office Excel', u"The file could not be accessed. Try one of the following:\n\n\u2022 Make sure the specified folder exists. \n\u2022 Make sure the folder t
    hat contains the file is not read-only.\n\u2022 Make sure the file name does not contain any of the following characters:  <  >  ?  [  ]  :  | or  *\n\u2022 Make sure the file/path name doesn't contain more than 218 characters.", u'C:\\Program Files\\Microsoft Office\\OFFICE11\\1033\\xlmain11.chm', 0, -2146827284), None)
    >>> wb.SaveAs(r'c:\test.xls')
    >>>
    Vous noterez aussi que ce message d'erreur est différent de celui donne dans le premier post.

    Après ce qui est "vicieux" c'est qu'avec "c:\Test.xls", le "\T" ne correspondant a rien, il n'est pas interprété... aucun caractère n'est remplace - contrairement au '\t'.

    Et donc, ce code faisait partie d'un code sous Tkinter , maintenant je suis bloqué pour pouvoir sauvegarder via tkFileDialog.asksaveasfilename, la fonction me posant le même probleme
    Elle vous pose un problème, mais pas avec "F:\Test.xls", car le T est majuscule. Par contre, "asksaveasfilename" devrait retourner un séparateur Linux et i.e. le print afficher "F:/Test.xls".
    Pour ré-écrire ça avec un séparateur Windows, os.path.normpath devrait faire l'affaire.

    J'ai trouvé le principe du double bakckslash sur stack Overflow, par contre je n'ai pas trouvé d'explication logique...
    Il n'y a pas d'explication "logique" dans les choix de Microsoft, c'est juste un business.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2011
    Messages : 57
    Points : 46
    Points
    46
    Par défaut
    os.path.normpath fonctionne !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xls.SaveAs(os.path.normpath(nomFichier))
    Tout grand merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Migration d'une base de Windows 2003 vers Windows 2008
    Par bangoulap dans le forum Oracle
    Réponses: 14
    Dernier message: 08/07/2011, 11h37
  2. Downgrade Windows 7 vers Windows XP
    Par Pierre-Eric dans le forum Windows
    Réponses: 3
    Dernier message: 01/02/2011, 16h37
  3. Migrer une application de Windows 98 vers Windows XP
    Par siempre dans le forum Windows
    Réponses: 1
    Dernier message: 19/07/2010, 13h22
  4. Réponses: 4
    Dernier message: 28/06/2010, 10h55
  5. Windows Vista vers Windows XP + Linux
    Par clio671 dans le forum Windows XP
    Réponses: 6
    Dernier message: 16/04/2008, 12h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo