I am trying to separate a single workbook with many sheets into single workbooks, each with one sheet. My code below works until I try to save the new workbook. I have tried raw strings, absolute file paths, and relative file paths. Nothing seems to work. I get the error below. How can I save this file?
#! python 3
import xlwings as xw
import pandas as pd
x= 0
wb= xw.Book('Copy of US Distribution Income Stmt FOR REVIEW FZN DFC.xlsm')
worksheet_names = wb.sheets
for worksheet in wb.sheets:
for worksheet in wb.sheets:
if worksheet != wb.sheets[x]:
worksheet.delete()
wb.save(r'PRELIM P&L - ' + str(worksheet) + ".xlsm"'')
x= x+1
---------------------------------------------------------------------------
com_error Traceback (most recent call last)
<ipython-input-9-7b2ca719ce21> in <module>
13 worksheet.delete()
14 wb.save()
---> 15 wb.save(r'PRELIM P&L - ' + str(worksheet) + ".xlsm"'')
16 x= x+1
17
~\AppData\Local\Continuum\anaconda3\lib\site-packages\xlwings\main.py in __repr__(self)
993
994 def __repr__(self):
--> 995 return "<Sheet [{1}]{0}>".format(self.name, self.book.name)
996
997 @property
~\AppData\Local\Continuum\anaconda3\lib\site-packages\xlwings\main.py in name(self)
887 def name(self):
888 """Gets or sets the name of the Sheet."""
--> 889 return self.impl.name
890
891 @name.setter
~\AppData\Local\Continuum\anaconda3\lib\site-packages\xlwings\_xlwindows.py in name(self)
609 @property
610 def name(self):
--> 611 return self.xl.Name
612
613 @name.setter
~\AppData\Local\Continuum\anaconda3\lib\site-packages\xlwings\_xlwindows.py in __getattr__(self, item)
120 while True:
121 try:
--> 122 v = getattr(self._inner, item)
123 if isinstance(v, (CDispatch, CoClassBaseClass, DispatchBaseClass)):
124 return COMRetryObjectWrapper(v)
~\AppData\Local\Continuum\anaconda3\lib\site-packages\win32com\client\__init__.py in __getattr__(self, attr)
472 if args is None:
473 raise AttributeError("'%s' object has no attribute '%s'" % (repr(self), attr))
--> 474 return self._ApplyTypes_(*args)
475
476 def __setattr__(self, attr, value):
~\AppData\Local\Continuum\anaconda3\lib\site-packages\win32com\client\__init__.py in _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args)
465 def _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args):
466 return self._get_good_object_(
--> 467 self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
468 user, resultCLSID)
469
com_error: (-2146827864, 'OLE error 0x800a01a8', None, None)
Welcome to stackoverflow.
The problem with your code is that
worksheetis an sheet object. It doesn't help to dostr(worksheet), this gives you the sheet object as string, e.g. "<Sheet[filename.xlsx]Sheet1>", which has characters that are not allowed for filenames.I think what you want is
worksheet.name, which gives you just the sheet name, e.g. "Sheet1". That means the second last line of your code should be: