【问题标题】:Returning Data Frame to excel through xlwings UDF通过xlwings UDF将数据框返回到excel
【发布时间】: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 单元格调用的函数),不适用于从事件调用的完全相同的代码。
  • 明白。我认为我的想法无法实现。你回答了我的问题。如果您愿意,请发布此解决方案,我会接受答案。

标签: python excel vba user-defined-functions xlwings


【解决方案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 标签
    猜你喜欢
    • 2020-09-03
    • 2022-11-20
    • 2019-05-21
    • 2013-02-15
    • 1970-01-01
    • 2018-10-19
    • 2023-03-15
    • 2020-03-30
    • 2019-04-17
    相关资源
    最近更新 更多