为什么 Python 的 Excel 版本的 Range.Resize 不能按预期工作?
Why does Python's version of Excel's Range.Resize not work as expected?
在 Excel VBA 中,下面的代码选择了列 A 到 E。
worksheet.Columns(1).Resize(ColumnSize:=5).Select
但在 Python 中(使用 win32com.client
模块)下面的代码不起作用。
worksheet.Columns(1).Resize(ColumnSize=5).Select()
# TypeError: __call__() got an unexpected keyword argument 'ColumnSize'
worksheet.Columns(1).Resize(ColumnIndex=5).Select()
# pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)
而下面的代码只选择了E列。
worksheet.Columns(1).Resize(5).Select()
worksheet.Columns(1).Resize(RowIndex=5).Select()
下面代码中的解决方法(我不想使用 worksheet.Columns('A:E')
,因为列数不同)。
worksheet.Range(Cell1=worksheet.Cells(RowIndex=1, ColumnIndex=1), Cell2=worksheet.Cells(RowIndex=1, ColumnIndex=5)).EntireColumn.Select()
我的问题是为什么调整大小没有按预期工作,这是一个错误吗?如果是这样,是否有适当的地方报告?我应该使用我提供的解决方法还是其他方法?
在文件 C:\Users\UserName\AppData\Local\Temp\gen_py.7[=15=]020813-0000-0000-C000-000000000046x0x1x8\Range.py
中搜索 Resize
后,我找到了以下行:
from win32com.client import DispatchBaseClass
class Range(DispatchBaseClass):
# *irrelevant code in between*
# Result is of type Range
# The method GetResize is actually a property, but must be used as a method to correctly pass the arguments
def GetResize(self, RowSize=defaultNamedOptArg, ColumnSize=defaultNamedOptArg):
ret = self._oleobj_.InvokeTypes(256, LCID, 2, (9, 0), ((12, 17), (12, 17)),RowSize
, ColumnSize)
if ret is not None:
ret = Dispatch(ret, 'GetResize', '{00020846-0000-0000-C000-000000000046}')
return ret
所以我尝试使用 GetResize
代替,它的工作原理应该是 Resize
。
worksheet.Columns(1).GetResize(ColumnSize=5).Select()
没有声明 Resize
所以它实际使用代码:
# Default method for this class is '_Default'
def __call__(self, RowIndex=defaultNamedOptArg,
ColumnIndex=defaultNamedOptArg):
return self._ApplyTypes_(0, 2, (12, 0), ((12, 17), (12, 17)), '__call__', None,RowIndex
, ColumnIndex)
因此,如果我在该文件中将 GetResize
重命名为 Resize
,我可以在代码中使用 Resize
,但该文件是由代码创建的(如果尚未创建) .
模块 win32com.client.build
DispatchItem.Build
中的 loop:
for key, item in list(self.propMapGet.items()):
self._propMapGetCheck_(key,item)
获取键值'Resize'
,_propMapGetCheck_
将其转化为GetResize
并添加到mapFuncs
字典中。
在 Excel VBA 中,下面的代码选择了列 A 到 E。
worksheet.Columns(1).Resize(ColumnSize:=5).Select
但在 Python 中(使用 win32com.client
模块)下面的代码不起作用。
worksheet.Columns(1).Resize(ColumnSize=5).Select()
# TypeError: __call__() got an unexpected keyword argument 'ColumnSize'
worksheet.Columns(1).Resize(ColumnIndex=5).Select()
# pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)
而下面的代码只选择了E列。
worksheet.Columns(1).Resize(5).Select()
worksheet.Columns(1).Resize(RowIndex=5).Select()
下面代码中的解决方法(我不想使用 worksheet.Columns('A:E')
,因为列数不同)。
worksheet.Range(Cell1=worksheet.Cells(RowIndex=1, ColumnIndex=1), Cell2=worksheet.Cells(RowIndex=1, ColumnIndex=5)).EntireColumn.Select()
我的问题是为什么调整大小没有按预期工作,这是一个错误吗?如果是这样,是否有适当的地方报告?我应该使用我提供的解决方法还是其他方法?
在文件 C:\Users\UserName\AppData\Local\Temp\gen_py.7[=15=]020813-0000-0000-C000-000000000046x0x1x8\Range.py
中搜索 Resize
后,我找到了以下行:
from win32com.client import DispatchBaseClass
class Range(DispatchBaseClass):
# *irrelevant code in between*
# Result is of type Range
# The method GetResize is actually a property, but must be used as a method to correctly pass the arguments
def GetResize(self, RowSize=defaultNamedOptArg, ColumnSize=defaultNamedOptArg):
ret = self._oleobj_.InvokeTypes(256, LCID, 2, (9, 0), ((12, 17), (12, 17)),RowSize
, ColumnSize)
if ret is not None:
ret = Dispatch(ret, 'GetResize', '{00020846-0000-0000-C000-000000000046}')
return ret
所以我尝试使用 GetResize
代替,它的工作原理应该是 Resize
。
worksheet.Columns(1).GetResize(ColumnSize=5).Select()
没有声明 Resize
所以它实际使用代码:
# Default method for this class is '_Default'
def __call__(self, RowIndex=defaultNamedOptArg,
ColumnIndex=defaultNamedOptArg):
return self._ApplyTypes_(0, 2, (12, 0), ((12, 17), (12, 17)), '__call__', None,RowIndex
, ColumnIndex)
因此,如果我在该文件中将 GetResize
重命名为 Resize
,我可以在代码中使用 Resize
,但该文件是由代码创建的(如果尚未创建)
模块 win32com.client.build
DispatchItem.Build
中的 loop:
for key, item in list(self.propMapGet.items()):
self._propMapGetCheck_(key,item)
获取键值'Resize'
,_propMapGetCheck_
将其转化为GetResize
并添加到mapFuncs
字典中。