我发现xlwings是一个非常特殊的项目,是Excel和Python之间的桥梁。所以我将它应用到我的excel插件开发中。
但我遇到了一些问题。
当excel addin调用python模块时,Workbook.caller()不返回Workbook对象(addin工作簿本身)!只是错误!
而不是Workbook.caller(),我使用' Workbook()传递当前的ActiveWorkbook的名字'。但在那种情况下,我担心“Optimize_connection = true'可能引发内存垃圾问题!
(如果VBA中的IsAddin'属性已关闭,那么它运行得非常好)
有人帮我吗?
提前谢谢。
答案 0 :(得分:0)
我没有对此进行测试,但解决方案可能就像使用xlwings VBA模块作为加载项时将ThisWorkbook
替换为ActiveWorkbook
一样简单。无论如何,我已经创建了一个问题来解决这个问题:https://github.com/ZoomerAnalytics/xlwings/issues/153
答案 1 :(得分:0)
这是一个解决方法,可以获得调用Python代码的Excel加载项:
import mock
import platform
import xlwings
from xlwings import Workbook
def get_add_in():
if platform.system() == 'Windows':
# Workbook.caller crashers instead of returning the add-in
get_add_in_caller_on_windows()
else:
return Workbook.caller()
@mock.patch('xlwings.Sheet.active')
def get_addin_caller_on_windows(mock_active):
# The xlwings.Sheet.active method is mocked because the add-in has no
# active worksheet.
xl_app = xlwings.xlplatform.get_xl_apps()[0]
return Workbook(xl_workbook=xl_app.ThisWorkbook)
它适用于Python 3.4和xlwings 0.6.4 on: