Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

excel access denied with win32 python pywin32

My code is

#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()

The error i get when I run my code is

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)

I get a popup dialog saying access is denied. The file isn't readonly and I'm the owner of the workbook its trying to open. I've tried

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

I still get the same error. Is there something I'm missing? I switched to dynamic thinking late-binding would solve this error.

another error I had was Pywins -2147418111 error when I was trying to fix this code.

like image 241
Drfrink Avatar asked Jun 18 '13 19:06

Drfrink


People also ask

What is pywin32?

Pywin32 is basically a very thin wrapper of python that allows us to interact with COM objects and automate Windows applications with python. The power of this approach is that you can pretty much do anything that a Microsoft Application can do through python.

How do I use win32com client?

Run ' win32com\client\makepy.py ' (eg, run it from the command window, or double-click on it) and a list will be presented. Select the Type Library ' Microsoft Word 8.0 Object Library ' From a command prompt, run the command ' makepy.py "Microsoft Word 8.0 Object Library" ' (include the double quotes).

Is pywin32 the same as win32com?

win32com is a "Component Object Model" part of pywin32. pywin32 works with python3. pywin32 doesn't works with python3 after installing from pip.


2 Answers

A colleague and I were diagnosing this exact issue. I couldn't believe how obscure this was and we found the solution by searching similar issues with .NET equivalent code:

To fix, create a folder called 'Desktop' in 'C:\Windows\SysWOW64\config\systemprofile\' on 64bit architecture or 'C:\Windows\System32\config\systemprofile\' on 32bit servers.

This genuinely fixed an absolutely identical issue.

like image 58
Matthew R Avatar answered Oct 22 '22 08:10

Matthew R


I ended up fixing it for some reason this works, if someone could comment why I would appreciate that.

Main thing I changed to open the workbook was the slashes from / to \ in the pathways.

Then I couldn't select the sheet name until I made excel visible.

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

Oddly enough that got rid of the pywins error

Also changed how sheets are filled its now

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

Hopefully this helps anyone else who runs into the same issues I did.

like image 23
Drfrink Avatar answered Oct 22 '22 06:10

Drfrink