最近工作中需要实现一个根据python读取到的数据向excel中动态添加下拉列表的功能
但是写好代码运行之后发现总是报错
File "C:\Users\XXX\AppData\Local\Temp\gen_py\3.11\00020813-0000-0000-C000-000000000046x0x1x9.py", line 40370, in Add
return self._oleobj_.InvokeTypes(181, LCID, 1, (24, 0), ((3, 1), (12, 17), (12, 17), (12, 17), (12, 17)),Type, AlertStyle, Operator, Formula1, Formula2)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)
在网上找了各种方法,看到有人说有可能是COM进程没有释放的原因,但是将进程kill了之后依然不行。后来仔细分析代码,发现少了一行清除下拉菜单数据的操作,所以才会导致首次运行是OK的,但是后面再运行就会报这个错:pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)
所以设置数据验证的时候,这句代码很关键!
sheet.range('A1').api.Validation.Delete()
附上正确的代码:
import xlwings as xw
app = xw.App(visible=True, add_book=False) # 可见,只打开不新建工作薄
app.display_alerts = False # 关闭警告
app.screen_updating = False # 关闭屏幕更新
wb = app.books.open(r"C:\Users\sgj3szh\Desktop\New Microsoft Excel Worksheet.xlsx") # 打开已有的 Excel 文件
# 获取工作表对象
sheet = wb.sheets.active
# 设置下拉菜单的选项
options = "Dog,Cat,Bat" # 以逗号分隔的选项
sheet.range('A1').api.Validation.Delete()
# 在 A1 单元格上设置数据验证
sheet.range('A1').api.Validation.Add(
Type=3, AlertStyle=1, Operator=1, Formula1=options
)
wb.save() # 保存文件
wb.close() # 关闭文件
app.quit() # 关闭程序