[python-win32] Trouble with list iteration / comprehension for wrapped COM objects

dornech dornech at gmx.de
Sat Apr 19 05:16:01 EDT 2025


Hi Mark,

thanks for spending time on my question. Sometimes when you are writing, 
you are already on the way to the solution ... Actually I haven't worked 
with an iterator object before an was unsure how to do it. But sometimes 
you must simply try. With an iterator for the Office Collection object 
wrappers like my wrapper for Applicaiton.Workbooks in addition to the 
overloaded __getitem__ it seems to work.

I plan to publish the package (alongside with a package with a COM 
object template class package for easening writing COM objects) as soon 
as I have done some test scripts ready. Probably it is of interest for 
you and the others here.

Best regards
Christoph


Am 19.04.2025 um 04:31 schrieb Mark Hammond:
>
> I'm not sure what's going wrong here. Does fetching the list of 
> workspaces as a simple list work? That would be a workaround, and
> feel free open an issue at https://github.com/mhammond/pywin32 since 
> it shouldn't break that way.
>
> Cheers
>
> On 2025-04-18 8:33 p.m., dornech via python-win32 wrote:
>> Hi there,
>>
>> I am working on an EXCEL wrapper to "phytonize" access to EXCEL.
>>
>> I create a wrapper class for all objects classes derived from abasic 
>> wrapper class which mainly ensures that calls are snaked-case and 
>> pyhtonized calls work. I. e. workbokkobject.SaveAs, 
>> workbookobject.saveas and workbokkobject.save_as would all work. This 
>> is done by overloaded __getattr__ and __setattr__ methods.
>>
>> The "real" EXCEL object is stored in the attribute "_xlWrapped".
>>
>> The overloaded __getattr__ also ensures that when retrieving f. e. a 
>> workbook from the application wrapper, that the resulting EXCEL 
>> object is wrapped as well. I. e. let xlapp be my wrapped EXCEL then 
>> xlapp.active_workbook would return a reference to a wrapped Workbook 
>> object which contains the reference to the "real" EXCEL workbook 
>> object in the attribute _xlwrapped.
>>
>> I also overload __getitem__ to allow xlapp[1] as short for 
>> xlapp.workbooks(1).
>>
>> Some of these classes I do extend for example to check existence of a 
>> worksheet in a workbook.
>>
>> This as very brief introduction.
>>
>> Now I am struggeling with list comprehension and indexes.
>>
>>     # access un-wrapped EXCEL
>>     print(xlapp._xlWrapped.Workbooks(1).Name)
>>     print(xlapp._xlWrapped.Workbooks(2).Name)
>>     for i, wb in enumerate(xlapp._xlWrapped.Workbooks):
>>         print(i, wb.Name)
>>
>>     # access wrapped EXCEL
>>     print(xlapp.Workbooks(1).Name)
>>     print(xlapp.Workbooks(2).Name)
>>     for i, wb in enumerate(xlapp.Workbooks):
>>         print(i, wb.Name)
>>
>> This prints
>>     WB1.xls
>>     WB2.xls
>>     0  WB1.xls
>>     1  WB2.xls
>>     WB1.xls
>>     WB2.xls
>>  and aborts with an windows/COM error:
>>
>>  ret = self._oleobj_.InvokeTypes(170, LCID, 2, (13, 0), ((12, 1),),Index
>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> pywintypes.com_error: (-2147352567, 'Ausnahmefehler aufgetreten.', 
>> (0, None, None, None, 0, -2147352565), None)
>>
>> Obviously when looping via the wrapper object the index is not 
>> automatically adjusted.
>> However, I must not increase the index by on in __getitem__ because 
>> then the index would alway be increased.
>>
>> It seems, püywin32 has some special support for list comprehension 
>> and index adjustment for COM objects?
>> I haven't worked with an iterator before but is this the solution?
>>
>> Thanks in advance.
>>
>> Best
>> Christoph
>>
>>
>>
>>
>>
>> _______________________________________________
>> python-win32 mailing list
>> python-win32 at python.org
>> https://mail.python.org/mailman/listinfo/python-win32



More information about the python-win32 mailing list