7

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?

1
  • A few questions. Does the file already exist? Is the file already open? Where does the save() write the file to? Commented Sep 16, 2010 at 20:20

1 Answer 1

20

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

Sign up to request clarification or add additional context in comments.

10 Comments

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, SaveCopyAs supports /, but SaveAs doesn't. Go figure. I just replace / with `\` in the file names.
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.
@froadie, try os.path.normpath.
@MikeDeSimone As of python 2.7.9, you actually have to use os.path.join('C:', os.sep, 'test.xlx'). or there will NOT be any slash between C: and test.xlx. See this post for more detail.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.