如何使用 win32com python 在 excel 单元格中添加下拉列表
how to add drop down list in excel cell using win32com python
我正在尝试使用 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...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()
设置验证的行完全遵循我评论中给出的参考中的示例。 win32com
从 Excel 获得的对象不是 Python 对象:它们是围绕 VBA 对象的薄 Python 包装器,这些 VBA 对象跟随他们自己的惯例,而不是 Python 的。所以 Python 代码完全遵循 VBA,语法除外。唯一的区别是外观。
.Add
得到圆括号,因为 Python 中的函数必须有圆括号(VBA 方法没有)。
- 方法的命名参数得到 Python
=
而不是 VBA :=
.
- 像
xlBetween
这样的常量表示整数值;您可以在 MSDN. 上找到这些值
- VBA 将
True
定义为 -1
。 1
或 True
也可能有效:我没试过。
- Python 没有等同于 VBA 的
with
语句,因此 val
必须在 val.ErrorMessage = ""
这样的赋值中显式而不是隐式如 VBA.
这是我得到的结果。
我正在尝试使用 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...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()
设置验证的行完全遵循我评论中给出的参考中的示例。 win32com
从 Excel 获得的对象不是 Python 对象:它们是围绕 VBA 对象的薄 Python 包装器,这些 VBA 对象跟随他们自己的惯例,而不是 Python 的。所以 Python 代码完全遵循 VBA,语法除外。唯一的区别是外观。
.Add
得到圆括号,因为 Python 中的函数必须有圆括号(VBA 方法没有)。- 方法的命名参数得到 Python
=
而不是 VBA:=
. - 像
xlBetween
这样的常量表示整数值;您可以在 MSDN. 上找到这些值
- VBA 将
True
定义为-1
。1
或True
也可能有效:我没试过。 - Python 没有等同于 VBA 的
with
语句,因此val
必须在val.ErrorMessage = ""
这样的赋值中显式而不是隐式如 VBA.
这是我得到的结果。