【问题标题】:how to add drop down list in excel cell using win32com python如何使用win32com python在excel单元格中添加下拉列表
【发布时间】:2019-01-07 09:30:06
【问题描述】:

我正在尝试使用 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)

【问题讨论】:

  • 什么是下拉列表?是过滤器吗?
  • @ycx 这是一个列表。编辑了我的问题。 :)
  • 你的问题在哪里?
  • OP 想要做的是您可以通过这种方式在 Excel 2016 中以交互方式执行的操作:数据选项卡 |数据工具窗格 |数据验证 |数据验证... |设置 |允许:列表,来源:。这是在 VBA 中执行此操作的一种方法:software-solutions-online.com/excel-vba-drop-down-lists/#Jump2
  • @SaurabhAgrawal 而不是像你的代码那样设置ws.Cells(6,1).Value。而是按照 VBA 示例设置 ws.Cells(6,1).Validation。所有此类 Excel 文档都假定您使用 VBA 进行编程,因此您需要学习将解决方案转换为 Python。

标签: python excel winapi win32com


【解决方案1】:

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

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,除了语法。唯一的区别是外观。

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

这是我得到的结果。

【讨论】:

  • 啊,这就是我的代码中缺少的内容。非常感谢您的帮助 BoarGules。但似乎val.IgnoreBlank = True 不起作用,因为如果单元格为空白,那么它仍会显示在下拉列表中。
  • 它似乎不起作用。 忽略空白 并不意味着 Excel 将忽略您在 Formula1 中提供的命名范围内的空白单元格并构建一个没有它们的下拉列表,正如您所期望的那样。这意味着当空白不是下拉列表中的选项之一时,Excel 不会抱怨单元格中的空白值。 mrexcel.com/forum/excel-questions/…
  • 感谢您向我展示了一些关键点。顺便说一句 win32com 在内部使用 COM 我想避免的对象。有没有其他方法可以在没有COM 对象的情况下访问完整的 excel 功能。
  • 我认为您已经发现无法将此解决方案部署到未安装 Excel 的计算机上。 win32com 模块使用 COM。顾名思义,这就是它的目的。 xlwings 模块也使用 COM,但顾名思义,它是 Excel 特定的。你可以试试openpyxl。它至少支持验证(openpyxl.readthedocs.io/en/stable/validation.html),但我不能说它的支持是否扩展到完整的 Excel 功能。唯一可以做到 Excel 所做的所有操作的软件就是 Excel 本身,而 COM 是唯一以编程方式访问它的方法。
  • 如何在下拉列表中添加记录列表,而不是 Formula1="=Sheet1!A1:A5"。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
相关资源
最近更新 更多