我正在使用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";
}
}
答案 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];
}