Как добавить выпадающий список в ячейке Excel с помощью Win32com Python - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь добавить выпадающий список в ячейке Excel, используя python win32com api. Но не в состоянии это реализовать.

Вот мой код

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)

1 Ответ

0 голосов
/ 08 января 2019

То, что вы делаете, не работает, потому что эта строка

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: это тонкие оболочки Python для объектов VBA, и эти объекты VBA следуют собственным соглашениям, а не соглашениям Python. Таким образом, код Python точно соответствует VBA, за исключением синтаксиса. Разница только в косметике.

  1. .Add получает скобки, потому что функции в Python должны иметь их (методы VBA этого не делают).
  2. Именованные параметры для методов получают Python =, а не VBA :=.
  3. Константы, такие как xlBetween представляют целочисленные значения; Вы можете найти значения на MSDN .
  4. VBA определяет True как -1. 1 или True, вероятно, также будет работать: я не пробовал.
  5. Python не имеет эквивалента оператора with VBA, поэтому val должен быть явным в присваиваниях, таких как val.ErrorMessage = "", а не неявным, как в VBA.

Это результат, который я получил.

Excel 2016 screenshot of drop-down list

...