通过xlwings UDF将数据框返回到excel
Posted
技术标签:
【中文标题】通过xlwings UDF将数据框返回到excel【英文标题】:Returning Data Frame to excel through xlwings UDF 【发布时间】:2017-09-12 22:14:04 【问题描述】:我正在尝试使用 Python、Xlwings 库和 Excel 创建用户定义函数。
目标是使用一个函数,让我们调用 ret_data_frames 不仅填充 A1 单元格,还填充所有需要的单元格以返回整个数据帧。
如上图:
我使用的数据框是通过网络抓取获得的,并且尺寸很大,所以我让我们使用一个简单的数据框,如果可行,我将想法替换为我的原始代码
import numpy as np
import pandas as pd
def get_data_frame(data):
dates = pd.date_range(data,periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
之后,需要创建UDF函数
import xlwings as xw
from test import get_data_frame
@xw.func
def ret_data_frame(data):
return get_data_frame(data)
这个想法行不通,所以,问题是:
可以使用 UDF 来重现数据帧吗?
谢谢
【问题讨论】:
如果 UDF 作为数组公式输入(例如选择单元格 A1:D5,然后在单元格 A1 中键入=ret_data_frame()
并按 Ctrl-Shift-Enter 而不是仅 Enter)然后 UDF 可以返回一个数组(在本例中为 5x4 二维数组)。无论如何,这就是它与 VBA 一起工作的方式——它可能与 xlwings 一起工作,也可能不工作。
这个数据框的维度是动态的。我虽然关于使用数组公式,但是如何创建一个粘贴整个数据框的 UDF?使用数组的想法我不知道数据框的维度是多少。
在不使用数组公式的情况下,UDF 理论上只能向包含函数调用的单元格返回单个值。它理论上不能以任何其他方式修改 Excel 环境。 (“理论上”——因为有一些 [相当危险的] 方法可以绕过它。)
您能否添加一个工作表事件(可能是Worksheet_SelectionChange
或Worksheet_Calculate
或Worksheet_BeforeDoubleClick
)来调用您的函数。仅更新单个单元格的限制仅适用于 UDF(即从 Excel 单元格调用的函数),不适用于从事件调用的完全相同的代码。
明白。我认为我的想法无法实现。你回答了我的问题。如果您愿意,请发布此解决方案,我会接受答案。
【参考方案1】:
这对我有用:
@xw.func
@xw.arg('x', pd.DataFrame, index=False, header=True)
@xw.ret(header=True)
def get_my_df(x):
return x
你可以通过多种方式返回dataFrame,用这个
@xw.ret(header=True, index=True, expand='table')
您可以立即将 dataFrame 返回到 Excel 中,而无需将其包装到 Excel 数组公式中。
【讨论】:
【参考方案2】:你需要有正确的 xlwings reutrn
@xw.ret(index=False, header=True, expand='table')
函数顶部的装饰器
@xw.func
@xw.ret(index=False, header=True, expand='table')
def ret_data_frame(data):
return get_data_frame(data)
【讨论】:
嗨,我知道这是一个旧线程......在这种情况下,“数据”是数据帧的名称? 嗨,数据只是示例参数,它可以是任何东西。你甚至可以删除它。这个例子非常抽象。重点是你需要有@xw.ret 标签以上是关于通过xlwings UDF将数据框返回到excel的主要内容,如果未能解决你的问题,请参考以下文章
使用xlwings在excel中的函数调用之间保留python全局变量
通过 python 中的 xlwings 调整 Excel 中的数字格式