Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过XLF将数据框返回excel_Python_Excel_Vba_User Defined Functions_Xlwings - Fatal编程技术网

Python 通过XLF将数据框返回excel

Python 通过XLF将数据框返回excel,python,excel,vba,user-defined-functions,xlwings,Python,Excel,Vba,User Defined Functions,Xlwings,我正在尝试使用Python、Xlwings库和Excel创建一个用户定义的函数 我们的目标是使用一个函数,让我们调用ret_data_frames,不仅填充A1单元格,而且填充所有需要的单元格以返回整个数据帧 如上图所示: 我使用的数据框是通过网页抓取获得的,并且尺寸很大,所以我让我们使用一个简单的数据框,如果这样做有效,我会将这个想法替换为我的原始代码 import numpy as np import pandas as pd def get_data_frame(data):

我正在尝试使用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复制数据帧吗


谢谢

您需要正确的XLN

@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)

您需要有正确的XLTRN

@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.func
@xw.arg('x', pd.DataFrame, index=False, header=True)
@xw.ret(header=True)
def get_my_df(x):
    return x
有多种方法可以返回数据帧,使用这个

@xw.ret(header=True,index=True,expand='table')


您可以将dataFrame立即返回到Excel中,而无需将其包装到Excel数组公式中

这对我来说很有用:

@xw.func
@xw.arg('x', pd.DataFrame, index=False, header=True)
@xw.ret(header=True)
def get_my_df(x):
    return x
有多种方法可以返回数据帧,使用这个

@xw.ret(header=True,index=True,expand='table')


您可以将dataFrame立即返回到Excel中,而无需将其包装到Excel数组公式中

如果UDF作为数组公式输入(例如,选择单元格A1:D5,然后在单元格A1中键入
=ret\u data\u frame()
,然后按Ctrl-Shift-Enter键,而不是按Enter键),则UDF可以返回数组(在本例中为5x4二维数组)。这就是它如何与VBA一起工作-它可能与xlwings一起工作,也可能与xlwings不一起工作。此数据帧的尺寸是动态的。我想使用数组公式,但如何创建粘贴整个数据帧的UDF?使用数组思想,我不知道数据帧的维数是多少。如果不使用数组公式,UDF理论上只能向包含函数调用的单元格返回单个值。从理论上讲,它不能以任何其他方式修改Excel环境。(“理论上”-因为有一些[相当危险的]方法可以绕过它。)您可以添加一个工作表事件(可能是
工作表\u选择更改
工作表\u计算
工作表\u双击之前
)来调用您的函数吗。仅更新单个单元格的限制仅适用于UDF(即从Excel单元格调用的函数),而不适用于从事件调用的完全相同的代码。我认为我的想法无法实现。你回答了我的问题。如果您愿意,发布此解决方案,我将接受答案。如果UDF是作为数组公式输入的(例如,选择单元格A1:D5,然后在单元格A1中键入
=ret\u data\u frame()
,然后按Ctrl-Shift-Enter键,而不是按Enter键),则UDF可以返回数组(在本例中为5x4二维数组)。这就是它如何与VBA一起工作-它可能与xlwings一起工作,也可能与xlwings不一起工作。此数据帧的尺寸是动态的。我想使用数组公式,但如何创建粘贴整个数据帧的UDF?使用数组思想,我不知道数据帧的维数是多少。如果不使用数组公式,UDF理论上只能向包含函数调用的单元格返回单个值。从理论上讲,它不能以任何其他方式修改Excel环境。(“理论上”-因为有一些[相当危险的]方法可以绕过它。)您可以添加一个工作表事件(可能是
工作表\u选择更改
工作表\u计算
工作表\u双击之前
)来调用您的函数吗。仅更新单个单元格的限制仅适用于UDF(即从Excel单元格调用的函数),而不适用于从事件调用的完全相同的代码。我认为我的想法无法实现。你回答了我的问题。如果您愿意,发布此解决方案,我将接受答案。嗨,我知道这是一个旧线程…在这种情况下,“数据”是数据帧的名称?嗨,数据只是示例参数,它可以是任何内容。你甚至可以移除它。这个例子非常抽象。主要的一点是,你需要@xw.ret tagHi,我知道这是一个旧线程…在这种情况下,“数据”是数据帧的名称?嗨,数据只是示例参数,它可以是任何东西。你甚至可以移除它。这个例子非常抽象。要点是您需要有@xw.ret标记