xlwings--excel多按钮调用python

xlwings中文文档: https://docs.xlwings.org/zh_CN/latest/

目录

  • 环境配置
  • 单按钮调用python
  • 添加第2、第3个按钮
  • 调用其它py文件的函数
  • 调用其他路径下的py文件

环境配置

安装xlwings

pip install "xlwings[all]"

更新xlwings 时,需要保持Python 包的版本和Excel 插件的版本一致。因此在更新
xlwings 时需要执行两条命令:一条用于Python 包,另一条用于Excel 插件。

pip install --upgrade xlwings
xlwings addin install

此时excel中会出现xlwings, 注意安装时须关闭excel。
xlwings--excel多按钮调用python_第1张图片
如果菜单栏未显示“开发工具”,需要把“开发工具”添加到功能区,因为后面要用到宏。步骤如下,

  1. 在"文件"选项卡上,转到"自定义>选项"。
  2. 在“自定义功能区”和“主选项卡”下,选中“开发工具”复选框。
    xlwings--excel多按钮调用python_第2张图片xlwings--excel多按钮调用python_第3张图片

单按钮调用python

在命令行输入以下代码,创建.xlsm和.py两个文件,在.py文件里写python代码,在.xlsm文件里点击执行,即可完成excel与python的交互。

xlwings quickstart ProjectName

ProjectName可以自定义,是创建后文件的名字。
xlwings--excel多按钮调用python_第4张图片
打开.xlsm文件,这是一个excel宏文件,xlwings已经提前帮你写好了调用Python的VBA代码。
按快捷键Alt + F11,就能调出VBA编辑器。
xlwings--excel多按钮调用python_第5张图片
上图代码主要执行两个步骤:
1、在.xlsm文件相同位置查找相同名称的.py文件
2、调用.py脚本里的main()函数
创建好的.py里会生成默认代码,具体如下

import xlwings as xw

def main():
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
    if sheet["A1"].value == "Hello xlwings!":
        sheet["A1"].value = "Bye xlwings!"
    else:
        sheet["A1"].value = "Hello xlwings!"

@xw.func
def hello(name):
    return f"Hello {name}!"

if __name__ == "__main__":
    xw.Book("first_project.xlsm").set_mock_caller()
    main()

在.xlsm文件sheet1中创建一个按钮,并设置默认的宏,变成一个触发按钮。
xlwings--excel多按钮调用python_第6张图片
xlwings--excel多按钮调用python_第7张图片
xlwings--excel多按钮调用python_第8张图片
之后,在xlwings 插件的最左边点击 按钮,“Hello xlwings!”会被写入第一张工作表
的A1 单元格中。再次点击按钮,单元格内容会变成“Bye xlwings!”
xlwings--excel多按钮调用python_第9张图片

添加第2、第3个按钮

按钮2在A10打印“I am button2", 按钮3负责清空A10内容
py文件如下,

import xlwings as xw

def main():
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
    if sheet["A1"].value == "Hello xlwings!":
        sheet["A1"].value = "Bye xlwings!"
    else:
        sheet["A1"].value = "Hello xlwings!"

def button2():
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
    sheet["A10"].value = "I am button2"
    
def button3():
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
    sheet["A10"].value = ""

if __name__ == "__main__":
    xw.Book("first_project.xlsm").set_mock_caller()
    main()
    button3()

快捷键Alt + F11,调出VBA编辑器,修改如下

Sub SampleCall()
    mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    RunPython "import " & mymodule & ";" & mymodule & ".main()"
End Sub

Sub button2()
    mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    RunPython "import " & mymodule & ";" & mymodule & ".button2()"
End Sub

Sub button3()
    mymodule = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    RunPython "import " & mymodule & ";" & mymodule & ".button3()"
End Sub

在这里插入图片描述

调用其它py文件的函数

在first_projet目录下新建second_project.py函数

import xlwings as xw

def button4():
    wb = xw.Book.caller()
    sheet = wb.sheets[0]
    if sheet["A20"].value == "I am button4":
        sheet["A20"].value = "clear"
    else:
        sheet["A20"].value = "I am button4"
    
if __name__ == "__main__":
    xw.Book("first_project.xlsm").set_mock_caller()
    button4()

快捷键Alt + F11,调出VBA编辑器,修改如下
xlwings--excel多按钮调用python_第10张图片

调用其他路径下的py文件

如果调用其他文件夹中的py文件,需要将py文件路径添加至
xlwings--excel多按钮调用python_第11张图片

你可能感兴趣的:(python,excel,python,开发语言)