我使用xlwings和扩展名PyWin32 API来操作Excel文档。我想创建一个函数,在周一早上,获取一个打开的excel文档并在" volatile_column"的左边插入一个新列,然后用0填充新列。
到目前为止的代码:
import numpy as np
import xlwings as xw
import datetime as dtt
from pybev import datecheck
def monday_new_column(metrics):
stripped_date = datecheck.date_to_datetime(dtt.datetime.today().date())
if stripped_date.weekday() == 0:
if stripped_date not in metrics.df.columns: # ensures no existing column
col_num = int(np.where(metrics.df.columns == metrics.volatile_column)[0][0] + 2)
max_row = int(len(metrics.df.index) + 2)
# Using an xlwings constant & defining a column of zeroes
xlShiftToRight = xw.constants.InsertShiftDirection.xlShiftToRight
zero_array = np.zeros((max_row,), dtype=np.int)[np.newaxis].T
print('Adding new week column...',end=''),
# !! VBA code !!
range_obj = metrics.sheet.range((1,col_num),(max_row,col_num))
range_obj.api.Insert(Shift=xlShiftToRight) # here's the problem line
range_obj.api.value = zero_array
print('Done')
return
转储错误:
--> 191 range_obj.api.Insert(Shift=xlShiftToRight)
192 range_obj.api.value = zero_array
193
C:\Users\username\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\xlwings\_xlwindows.py in __call__(self, *args, **kwargs)
61 while True:
62 try:
---> 63 v = self.__method(*args, **kwargs)
64 t = type(v)
65 if t is CDispatch:
C:\Users\username\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\win32com\client\dynamic.py in Insert(self, Shift, CopyOrigin)
C:\Users\username\AppData\Local\Enthought\Canopy\edm\envs\User\lib\site-packages\win32com\client\dynamic.py in _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args)
280
281 def _ApplyTypes_(self, dispid, wFlags, retType, argTypes, user, resultCLSID, *args):
--> 282 result = self._oleobj_.InvokeTypes(*(dispid, LCID, wFlags, retType, argTypes) + args)
283 return self._get_good_object_(result, user, resultCLSID)
284
com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'Insert method of Range class failed', 'xlmain11.chm', 0, -2146827284), None)
这是一个VBA错误,所以我不认为周围的python代码是个问题。 documentation没有提供关于发生了什么的线索,并且Google搜索错误只会导致很多用户遇到Select()
方法的问题,我在这里没有使用。
我还尝试删除Shift=xlShiftToRight
参数并每次显式调用metrics.sheet.range((1,col_num),(max_row,col_num))
而不是使用range_obj
指针。两种策略都返回与初始策略相同的错误消息。
我的语法是否遗漏了一些简单的内容,或者这是一个更深层次的API问题?
答案 0 :(得分:0)
事实证明,解决方案只是将.EntireColumn
添加到范围对象。
range_obj.api.EntireColumn.Insert()
我不明白为什么它可以弄清楚我希望整个列移动到示例工作表而不是我正在使用的实际工作表上,但这似乎是问题。