通过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_SelectionChangeWorksheet_CalculateWorksheet_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的主要内容,如果未能解决你的问题,请参考以下文章

如何将UDF应用于数据框?

通过python,将excel中的数据写入二维列表

使用xlwings在excel中的函数调用之间保留python全局变量

通过 python 中的 xlwings 调整 Excel 中的数字格式

2019-12-13 (一)使用Xlwings从Excel,取数至Pandas的DataFrame和Series

使用 R 中的多参数用户定义函数将列添加到数据框中