如何使用带有动态数组的 xlwings 异步模式?
How to use xlwings asynchronous mode with dynamic arrays?
使用 async_mode='threading'
时,我注意到以下行为:
@xw.func(async_mode='threading')
@xw.ret(expand='table')
def test_fun():
time.sleep(2)
return [[0], [1], [2]]
上面的代码将正确输出 0, 1, 2 但这将输出一个数组(即 excel 公式将有 {} 括号)并且它会覆盖它下面的任何内容,即不会使用该溢出警告,如果不编辑整个数组就无法编辑它。
@xw.func(async_mode='threading')
def test_fun():
time.sleep(2)
return [[0], [1], [2]]
然而,这似乎更可取,因为它输出一个动态数组(如果我删除 async_mode)只输出 0,公式变成 @test_fun(),因此只有 returns第一个值。
在 v0.15.8 上遇到此行为
你的第二个例子是正确的做法并且对我有用。第一个版本仅适用于您特别希望使用旧版 CSE 数组的情况,通常只有当您的 Excel 版本不支持动态数组时才会出现这种情况。
只需确保完全删除公式的 CSE 版本,然后重新导入函数并简单地从 Excel.
中的单元格调用 =test_fun()
这应该从 v0.19.0 版本开始工作 - 这是遇到的问题。 OP 有 v0.15.8.
使用 async_mode='threading'
时,我注意到以下行为:
@xw.func(async_mode='threading')
@xw.ret(expand='table')
def test_fun():
time.sleep(2)
return [[0], [1], [2]]
上面的代码将正确输出 0, 1, 2 但这将输出一个数组(即 excel 公式将有 {} 括号)并且它会覆盖它下面的任何内容,即不会使用该溢出警告,如果不编辑整个数组就无法编辑它。
@xw.func(async_mode='threading')
def test_fun():
time.sleep(2)
return [[0], [1], [2]]
然而,这似乎更可取,因为它输出一个动态数组(如果我删除 async_mode)只输出 0,公式变成 @test_fun(),因此只有 returns第一个值。
在 v0.15.8 上遇到此行为
你的第二个例子是正确的做法并且对我有用。第一个版本仅适用于您特别希望使用旧版 CSE 数组的情况,通常只有当您的 Excel 版本不支持动态数组时才会出现这种情况。
只需确保完全删除公式的 CSE 版本,然后重新导入函数并简单地从 Excel.
中的单元格调用=test_fun()
这应该从 v0.19.0 版本开始工作 - 这是遇到的问题。 OP 有 v0.15.8.