10 votes

accès refusé à excel avec win32 python pywin32

Mon code est le suivant

#Opens template for creating final report
excel = win32.dynamic.Dispatch('Excel.Application')
template = os.path.abspath((folderpath+'\Poop.xlsx'))
wb = excel.Workbooks.Open(template)
freshws= wb.Sheets("Fresh") #Sheet names must match perfectly
secws= wb.Sheets("sec")

cur.execute("Select * from FIRALL")
freshdata=list(cur.fetchall())
#writes to the first sheet
datarowlen=0
for i,a in enumerate(freshdata):
    datarowlen = len(a)
    for j,b in enumerate(a):
        freshws.Cells(i+1,j+1).Value = a[j]

cur.execute("Select * from SECVE")
secdata=list(cur.fetchall())
#writes to the second sheet
datarowlen=0
for i,a in enumerate(secdata):
    datarowlen = len(a)
    for j,b in enumerate(a):
        secws.Cells(i+1,j+1).Value = a[j]
#saves the report
wb.SaveAs()
wb.Close()

L'erreur que j'obtiens lorsque j'exécute mon code est la suivante

Traceback (most recent call last):
  File "main.py", line 369, in <module>
    wb = excel.Workbooks.Open(template)
  File "<COMObject <unknown>>", line 8, in Open
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel'
, "Microsoft Excel cannot access the file 'path to stuff------------------------
Poop Report\\Poop.xlsx'. There are several possible reasons:\n\n\u2022 The file
name or path does not exist.\n\u2022 The file is being used by another program.\
n\u2022 The workbook you are trying to save has the same name as a currently ope
n workbook.", 'xlmain11.chm', 0, -2146827284), None)

J'obtiens une fenêtre de dialogue indiquant que l'accès est refusé. Le fichier n'est pas en lecture seule et je suis le propriétaire du classeur qu'il essaie d'ouvrir. J'ai essayé

win32.gencache.EnsureDispatch('Excel.Application')

Je reçois toujours la même erreur. Y a-t-il quelque chose qui m'échappe ? Je suis passé en dynamique en pensant que la liaison tardive résoudrait cette erreur.

une autre erreur que j'ai eu était l'erreur Pywins -2147418111 quand j'essayais de fixer ce code.

16voto

Matthew Radford Points 373

Un collègue et moi avons diagnostiqué ce problème exact. Je n'arrivais pas à croire à quel point il était obscur et nous avons trouvé la solution en recherchant des problèmes similaires avec un code .NET équivalent :

Pour résoudre ce problème, créez un dossier appelé 'Desktop' dans le dossier ' . C:\Windows\SysWOW64\config\systemprofile\ sur une architecture 64 bits ou ' C:\Windows\System32\config\systemprofile\ sur les serveurs 32 bits.

Cela a véritablement réglé un problème absolument identique.

5voto

Drfrink Points 394

J'ai fini par le corriger, pour une raison quelconque, cela fonctionne, si quelqu'un pouvait me dire pourquoi, je l'apprécierais.

La principale chose que j'ai modifiée pour ouvrir le classeur était les barres obliques de / à \ dans les chemins d'accès.

Ensuite, je ne pouvais pas sélectionner le nom de la feuille jusqu'à ce que je rende excel visible.

excel.Visible = True
wb = excel.Workbooks.Open((excelreport+"\Poop.xlsx"))

Bizarrement, cela a éliminé l'erreur pywins.

J'ai également changé la façon dont les feuilles sont remplies.

cur.execute("Select * from FIRALL")
freshdata=list(cur.fetchall())
#writes to the first sheet
freshws.Range(freshws.Cells(2,1),freshws.Cells((len(freshdata)+1),len(freshdata[0]))).Value = freshdata

J'espère que cela aidera les personnes qui rencontrent les mêmes problèmes que moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X