当Excel插件运行' RunPython()'时,Workbook.caller()引发错误

时间:2015-02-15 00:07:37

标签: python excel xlwings

我发现xlwings是一个非常特殊的项目,是Excel和Python之间的桥梁。所以我将它应用到我的excel插件开发中。

但我遇到了一些问题。

当excel addin调用python模块时,Workbook.caller()不返回Workbook对象(addin工作簿本身)!只是错误!

而不是Workbook.caller(),我使用' Workbook()传递当前的ActiveWorkbook的名字'。但在那种情况下,我担心“Optimize_connection = true'可能引发内存垃圾问题!

(如果VBA中的IsAddin'属性已关闭,那么它运行得非常好)

有人帮我吗?

提前谢谢。

2 个答案:

答案 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:

  • Windows 8.1 with Excel 2013
  • 使用Excel for Mac 2011的OS X 10.10(优胜美地)