如何使用 win32com python 在 Excel 单元格中添加下拉列表

Sau*_*wal 5 python excel winapi win32com

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

这是我的代码

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)
Run Code Online (Sandbox Code Playgroud)

Boa*_*les 4

你正在做的事情不起作用,因为这条线

ws.Cells(6,1).Value = "["GREEN", "YELLOW", "RED", "WHITE", "NOT SURE"]" //I want drop down here
Run Code Online (Sandbox Code Playgroud)

正在设置单元格的值,就像前面几行所做的那样。(或者更确切地说,尝试设置它:该行包含两个语法错误,一个在引用中,一个在注释中。)

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

仅使用子句中的代码try...except,看起来像这样:

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()
Run Code Online (Sandbox Code Playgroud)

设置验证的行完全遵循我的评论中给出的参考中的示例。从 Excel 获取的对象win32com不是 Python 对象:它们是 VBA 对象的瘦 Python 包装器,并且这些 VBA 对象遵循它们自己的约定,而不是 Python 的约定。因此,除了语法之外,Python 代码完全遵循 VBA。唯一的区别是外观上的。

  1. .Add得到括号是因为 Python 中的函数必须有它们(VBA 方法没有)。
  2. 方法的命名参数获取的是 Python=而不是 VBA :=
  3. 像这样的常量xlBetween代表整数值;您可以在MSDN上找到这些值。
  4. VBA 定义True-1. 1或者True也可能有效:我没有尝试。
  5. Python 没有与 VBAwith语句等效的语句,因此val必须在赋值中显式赋值,而不是像val.ErrorMessage = ""VBA 中那样隐式赋值。

这是我得到的结果。

Excel 2016下拉列表截图