3 回答
TA贡献1836条经验 获得超5个赞
您应该直接从输入参数中获取值,而不是获取 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对象的类型,并基于此做一些不同的事情。object[,]从 Excel-DNA 传递的数组可以包含以下类型的项目:
double
string
bool
ExcelDna.Integration.ExcelError
ExcelDna.Integration.ExcelEmpty
ExcelDna.Integration.ExcelMissing
(如果不带参数调用该函数,则为=Concat2()
)。
如果您将签名更改为具有单个类型的参数object
(而不是object[,]
),如下所示:
public static object Concat2(object value)
然后,根据函数的调用方式,您可能会获得上述类型之一作为 the ,value
或者您可能获得一个object[,]
数组作为 the value
,因此在进行迭代之前,您的类型检查看起来会有所不同。
TA贡献1840条经验 获得超5个赞
在我的 F# 插件中,我有一个执行此操作的函数(我使用此函数主要是为了提取日期的显示值):
[<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
应用程序在哪里:
let app()= ExcelDnaUtil.Application :?> Excel.Application
TA贡献1946条经验 获得超3个赞
这个怎么样?
[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];
}
- 3 回答
- 0 关注
- 321 浏览
添加回答
举报