为什么 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字典中。