XLWINGS:从 Panda DataFrame 填充用户表单的组合框

xlwings: fill the combobox of a user form from a panda dataframe

提问人:mandela 提问时间:10/13/2023 最后编辑:mokenmandela 更新时间:10/13/2023 访问量:53

问:

我有一个包含 SQL 查询记录的 pandas 数据帧。 我想使用 xlwings 将此数据帧的数据插入到用户表单的组合框中。

我有这样的东西:

cb = xw.Book.caller().sheets.active.shapes("ufm_PortfolioCompo.cbb_DALI_ptf_id").api.ControlFormat
cb.RemoveAllItems()
for id in df_dali_ptf_id:
    cb.AddItem(id)
    cb.ListIndex = 1

这是我收到的错误消息:


Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\site-packages\xlwings\_xlwindows.py", line 1134, in __call__
    return self._wrap(xl=self.xl.Item(key))
  File "C:\ProgramData\Anaconda3\lib\site-packages\xlwings\_xlwindows.py", line 63, in __call__
    v = self.__method(*args, **kwargs)
  File "<COMObject <unknown>>", line 2, in Item
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, "The item with the specified name wasn't found.", None, 0, -2147024809), None)

任何帮助将不胜感激! 提前非常感谢!

我查看了 xlwings 文档。
我还试图模仿这篇文章中的一个例子;
xlwings-how-to-write-values-to-a-combo-box-from-python-udf

胜过 组合框 用户表单 XLWINGS公司

评论

0赞 moken 10/13/2023
熊猫数据帧是什么样子的?

答:

0赞 moken 10/13/2023 #1

您只需将 Dataframe 写入工作表并使用组合框引用它;

import xlwings as xw
import pandas as pd

data = pd.DataFrame({
    "A": ["foo1", "foo2", "foo3", "foo4", "foo5"],
})

with xw.App(visible=False) as app:
    wb = xw.Book()
    ws = wb.sheets[0]

    ### Write the Dataframe to the sheet
    ws["A1"].options(index=False, header=False, expand="table").value = data

    ### Create Combobox
    cb = ws.api.Shapes.AddFormControl(2, 96, 0.6, 48, 16.2)
    ### Reference the dataframe data
    cb.OLEFormat.Object.ListFillRange = "$A$1:$A$5"

    wb.save('foo_out.xlsx')

表:-
Example Output

评论

0赞 mandela 10/15/2023
非常感谢您@moken的帮助。问题是我想使用用户表单上的组合框(根据 MS 术语的 Forms 对象)。这个想法是用户在打开用户表单>按下一个按钮,>在这个用户表单上有一个组合框,里面装满了 Python 脚本(感谢存储在 Pandas DF 中的 SQL 查询)。您认为可以到达用户表单的组合框吗?没有一个在纸上。提前非常感谢。
0赞 moken 10/16/2023
@mandela 访问表单上的组合框可能很困难。不确定,没有将 Xlwings 与 Forms 一起使用,也从未见过任何特定的代码做这种事情。当然,创建一个宏来填充组合框应该可以工作,即当单击按钮或加载表单等时,它使用 VBA 从数据帧值填充。您可以使用 Xlwings 创建宏并将其添加到工作簿中,从而根据数据帧值操作宏包含的内容,例如,从工作表中使用什么范围或创建数组或 '.AddItem' 行来添加值。
0赞 mandela 10/17/2023
非常感谢您@moken的回答。非常感谢!