如何将对象从UDF参数转换为Excel-DNA中的Excel范围?

时间:2018-08-09 04:26:20

标签: c# excel-dna

我正在使用Excel-DNA开发一个简单的Addin。我已经编写了一个below函数,但是在将其转换为Range对象时遇到了困难。尝试使用谷歌搜索,无法弄清楚。有人可以帮我吗

[ExcelFunction(Description = "Excel Range")]
public static string Concat2([ExcelArgument(AllowReference = true)] object rng)
{
    try
    {
       // Assuming i am calling this from Excel cell A5 as =Concat2(A1:A2)
        var app = (Excel.Application)ExcelDnaUtil.Application;
        var r = app.Range[rng, Type.Missing];

        return r.Cells[1,1] + r.Cells[2,2]
    }

    catch (Exception e)
    {
        return "Error";
    }
}

3 个答案:

答案 0 :(得分:0)

您应该直接从输入参数获取值,而不要获取Range COM对象。这样一来,效率也更高。

您的简单函数可能看起来像这样:

    public static object Concat2(object[,] values)
    {
        string result = "";
        int rows = values.GetLength(0);
        int cols = values.GetLength(1);
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                object value = values[i, j];
                result += value.ToString();
            }
        }
        return result;
    }

通常,您需要检查value对象的类型,然后根据该对象执行其他操作。从Excel-DNA传递的object[,]数组可以具有以下类型的项目:

  • double
  • string
  • bool
  • ExcelDna.Integration.ExcelError
  • ExcelDna.Integration.ExcelEmpty
  • ExcelDna.Integration.ExcelMissing(如果不带参数调用该函数,则为=Concat2())。

如果将签名更改为具有类型object(而不是object[,])的单个参数,如下所示:

    public static object Concat2(object value)

然后,根据函数的调用方式,您可能会获得以上类型之一作为value,或者可能会获得object[,]数组作为value,因此您的类型在进行迭代之前,检查会有所不同。

答案 1 :(得分:0)

在我的F#插件中,有一个函数可以做到这一点(我主要使用该函数来提取显示的日期值):

class Data(): 
     def __init__(self, data): 
         for name, val in [item.split(':', maxsplit=1) for item in data.strip("{}").split(",")]: 
             setattr(self, name, val)

obj = Data(data)
print(obj.featured)

应用程序在哪里:

[<ExcelFunction(Description="Returns what is currently displayed as text.", IsMacroType=true)>]
let DISPLAYEDTEXT ([<ExcelArgument(Description="Cell", AllowReference=true)>] rng : obj) =
    app().get_Range(XlCall.Excel(XlCall.xlfReftext, rng, true)).Text

答案 2 :(得分:0)

这个怎么样?

[ExcelFunction(IsMacroType = true)]
public static double GetBackColor([ExcelArgument(AllowReference=true)] object cell)
{
    ExcelReference rng = (ExcelReference)cell;
    Excel.Range refrng = ReferenceToRange(rng);
    return refrng.Interior.Color;
}

这是辅助函数

private static Excel.Range ReferenceToRange(ExcelReference xlRef)
{    
    Excel.Application app = (Excel.Application)ExcelDnaUtil.Application;
    string strAddress = XlCall.Excel(XlCall.xlfReftext, xlRef, true).ToString();
    return app.Range[strAddress];
}