xlwings中文文档: https://docs.xlwings.org/zh_CN/latest/
安装xlwings
pip install "xlwings[all]"
更新xlwings 时,需要保持Python 包的版本和Excel 插件的版本一致。因此在更新
xlwings 时需要执行两条命令:一条用于Python 包,另一条用于Excel 插件。
pip install --upgrade xlwings
xlwings addin install
此时excel中会出现xlwings, 注意安装时须关闭excel。
如果菜单栏未显示“开发工具”,需要把“开发工具”添加到功能区,因为后面要用到宏。步骤如下,
在命令行输入以下代码,创建.xlsm和.py两个文件,在.py文件里写python代码,在.xlsm文件里点击执行,即可完成excel与python的交互。
xlwings quickstart ProjectName
ProjectName可以自定义,是创建后文件的名字。
打开.xlsm文件,这是一个excel宏文件,xlwings已经提前帮你写好了调用Python的VBA代码。
按快捷键Alt + F11,就能调出VBA编辑器。
上图代码主要执行两个步骤:
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 插件的最左边点击 按钮,“Hello xlwings!”会被写入第一张工作表
的A1 单元格中。再次点击按钮,单元格内容会变成“Bye xlwings!”
按钮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
在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()