我使用xlwings和pywin32api来操作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
它将转储错误:
^{pr2}$这是一个VBA错误,所以我不认为周围的python代码是问题所在。documentation没有提供关于发生了什么的线索,google搜索错误只会让很多用户遇到Select()
方法的问题,我在这里没有使用这个方法。在
我还尝试删除Shift=xlShiftToRight
参数,每次都显式地调用metrics.sheet.range((1,col_num),(max_row,col_num))
,而不是使用range_obj
指针。这两种策略都会返回与初始策略相同的错误消息。在
我是不是缺少了一些简单的语法,或者这是一个更深层次的API问题?在
结果是,解决方案只需将
.EntireColumn
添加到range对象中。在range_obj.api.EntireColumn.Insert()
我不明白为什么我希望在一个示例工作表上移动整个列,而不是实际使用的工作表,但这似乎是问题所在。在
相关问题 更多 >
编程相关推荐