如何使用Win32 COM python在excel单元格中添加下拉列表

如何使用Win32 COM python在excel单元格中添加下拉列表,python,excel,winapi,win32com,Python,Excel,Winapi,Win32com,我正在尝试使用pythonwin32comapi在excel单元格中添加下拉列表。但无法实施 这是我的密码 from win32com.client import Dispatch import os import win32api path = os.getcwd() path1 = path + '\\myExcel.xlsx' try: xl = Dispatch("Excel.Application") xl.Visible = 1 # fun to watch

我正在尝试使用python
win32com
api在excel单元格中添加下拉列表。但无法实施

这是我的密码

from win32com.client import Dispatch
import os
import win32api
path = os.getcwd()

path1 = path + '\\myExcel.xlsx'
try:
    xl = Dispatch("Excel.Application")   
    xl.Visible = 1  # fun to watch!
    wb = xl.Workbooks.Open(Filename=path1)

    ws = wb.Worksheets(1)

    ws.Cells(1,1).Value = "GREEN"
    ws.Cells(2,1).Value = "YELLOW"
    ws.Cells(3,1).Value = "RED"
    ws.Cells(4,1).Value = "WHITE"
    ws.Cells(5,1).Value = "NOT SURE"
    ws.Cells(6,1).Value = "["GREEN", "YELLOW", "RED", "WHITE", "NOT SURE"]" //I want drop down here
    wb.Close(SaveChanges=True)
    xl.Quit()
except Exception as e:
    print(e)

你所做的不起作用,因为这条线

ws.Cells(6,1).Value = "["GREEN", "YELLOW", "RED", "WHITE", "NOT SURE"]" //I want drop down here
正在设置单元格的值,就像前面几行一样。(或者更确切地说,尝试设置它:该行包含两个语法错误,一个在引用中,一个在注释中。)

但您不希望设置单元格的值,而是希望对单元格应用验证。所以您需要设置对象的属性
ws.Cells(6,1).Validation

只取
try中的代码…除了
子句外,如下所示:

xl = Dispatch("Excel.Application")   
xl.Visible = 0  # Not really such fun to watch because the code below closes down Excel
                # straightaway. xl.Visible = 1 will just show a screen flicker.
wb = xl.Workbooks.Open(Filename=path1)

ws = wb.Worksheets(1)

ws.Cells(1,1).Value = "GREEN"
ws.Cells(2,1).Value = "YELLOW"
ws.Cells(3,1).Value = "RED"
ws.Cells(4,1).Value = "WHITE"
ws.Cells(5,1).Value = "NOT SURE"

# Set up validation
val = ws.Cells(6,1).Validation
val.Add(Type=3, AlertStyle=1, Operator=1, Formula1="=Sheet1!A1:A5")
val.IgnoreBlank = -1
val.InCellDropdown = -1
val.InputTitle = ""
val.ErrorTitle = ""
val.InputMessage = ""
val.ErrorMessage = ""
val.ShowInput = -1
val.ShowError = -1

wb.Close(SaveChanges=True)
xl.Quit()
设置验证的行完全遵循我的评论中给出的参考中的示例。
win32com
从Excel获取的对象不是Python对象:它们是围绕VBA对象的精简Python包装器,这些VBA对象遵循自己的约定,而不是Python的约定。因此,除了语法之外,Python代码完全遵循VBA。唯一的区别是装饰性的

  • .Add
    获取括号,因为Python中的函数必须有括号(VBA方法没有)
  • 方法的命名参数获取Python
    =
    而不是VBA
    :=
  • xlBetween
    等常量表示整数值;您可以在上找到值
  • VBA将
    True
    定义为
    -1
    1
    True
    也可能有效:我没有尝试
  • Python没有与VBA的
    with
    语句等价的语句,因此
    val
    必须在
    val.ErrorMessage=”“
    等赋值中显式,而不是像VBA中那样隐式
  • 这就是我得到的结果


    什么是下拉列表?它是一个过滤器吗?@ycx它是一个列表。编辑我的问题。:)您的问题在哪里?OP想要做的是您可以在Excel 2016中以交互方式执行的操作:数据选项卡|数据工具窗格|数据验证|数据验证…|设置|允许:列表,源:。下面是在VBA中执行此操作的一种方法:@SaurabhAgrawal,而不是按代码的方式设置
    ws.Cells(6,1).Value
    。按照VBA示例设置
    ws.Cells(6,1).Validation
    。所有这类Excel文档都假定您使用VBA编程,因此您需要学习将解决方案转换为Python。啊,这就是我在代码中缺少的内容。。非常感谢您对博阿古利斯的帮助。但似乎
    val.IgnoreBlank=True
    不起作用,因为如果单元格为空白,则它仍显示在下拉列表中。它只是看起来不起作用。“忽略空白”并不意味着Excel将忽略您在
    Formula1
    中提供的命名范围内的空白单元格,并按照您的预期构建一个没有空白单元格的下拉列表。这意味着,当下拉列表中的选项不为空时,Excel不会抱怨单元格中的空值。谢谢你告诉我一些要点。顺便说一句,win32com在内部使用了我想要避免的
    COM
    对象。没有
    COM
    对象,是否有其他方法可以访问完整的excel功能。我想您已经发现无法将此解决方案部署到未安装excel的计算机上。
    win32com
    模块使用COM。顾名思义,这就是它的目的。
    xlwings
    模块也使用COM,但顾名思义,它是特定于Excel的。您可以尝试
    openpyxl
    。它至少对validation()有一些支持,但我不能说它的支持是否扩展到了完整的Excel功能。唯一可以做Excel所做的一切的软件是Excel本身,COM是以编程方式访问它的唯一方法。如何在下拉列表中添加记录列表,而不是公式1=“=Sheet1!A1:A5”。