tags:

views:

102

answers:

1

I have an Python ExcelDocument class that provides basic convenience methods for reading/writing/formatting Excel files, and I'm getting a strange error in seemingly simple Python code. I have a save and saveAs method:

def save(self):
   ''' Save the file '''
   self.workbook.Save()

def saveAs(self, newFileName):
   ''' Save the file as a new file with a different name '''
   self.workbook.SaveAs(newFileName)

The save method works perfectly, but when I try to call the saveAs method - myExcelObject.saveAs("C:/test.xlsx") - I get the following error:

Traceback (most recent call last):
  File "C:\workspace\Utilities\src\util\excel.py", line 201, in <module>
    excel.saveAs("C:/test.xlx")
  File "C:\workspace\Utilities\src\util\excel.py", line 185, in saveAs
    self.workbook.SaveAs(newFileName)
  File "<COMObject Open>", line 7, in SaveAs
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft Office Excel', u"Microsoft Office Excel cannot access the file 'C:\\//8CBD2000'. 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 open workbook.", u'C:\\Program Files\\Microsoft Office\\Office12\\1033\\XLMAIN11.CHM', 0, -2146827284), None)

Can anyone explain what is happening?

+8  A: 

I've found (the hard way) that SaveAs doesn't support slash /.
Try saveAs("C:\\test.xlx") instead.

Nick D
wow, that did it. thanks so much!! but why is it different than the save method? is there any way I can sanitize the input? I can't really trust all my users to know about this quirk...
froadie
@froadie, `SaveCopyAs` supports `/`, but `SaveAs` doesn't. Go figure. I just replace `/` with `\\` in the file names.
Nick D
Or use `saveAs(os.path.join("C:", "test.xlx"))`. The `os.path` library is chock full of platform-independent ways to handle filenames, paths, whatever.
Mike DeSimone
@froadie, try `os.path.normpath`.
Nathan Ernst