我正在为excel创建插件,我想知道如何创建新行来显示列表或数组
我创建了一个示例函数:
[ExcelFunction(Description = "Split string", Category = "STRING")]
public static object[] StringSplit([ExcelArgument(Name = "TEXT", Description = "text to split")] string text)
{
return text.Split(' ').ToArray();
}
在此示例中,该函数返回具有不同关键字的数组。但是当我通过excel使用它时,它只显示我单元格中的第一个单词。 我想知道的是创建新闻列或行,并在其中显示我的数组的每个元素。 感谢
修改 我尝试了@CaioProiete bellow发布的解决方案,所以它可以正常使用这段代码:
Page page = new Page();
WebResponse resp = page.Download(url);
List<string> res = page.GetAllFromXpath(resp.content, xpath);
object[,] result = new object[1, res.Count];
for (int j = 0; j < res.Count; j++)
{
result[0, j] = res.ElementAt(j);
}
return Resizer.Resize(result);
但是当我尝试使用asyncrohous方法时,会抛出一个未处理的异常:
return ExcelAsyncUtil.Run("DownloadAsync", url,
delegate
{
Page page = new Page();
WebResponse resp = page.Download(url);
List<string> res = page.GetAllFromXpath(resp.content, xpath);
object[,] result = new object[1, res.Count];
for (int j = 0; j < res.Count; j++)
{
result[0, j] = res.ElementAt(j);
}
return Resizer.ResizeMe(result);
});
抛出的异常是:
ExcelDna.Integration.XlCallException' occurred in ExcelDna.Integration.dll but was not handled in user code
以下是Reizer类中抛出它的行:
ExcelReference caller = XlCall.Excel(XlCall.xlfCaller) as ExcelReference;
答案 0 :(得分:2)
考虑到您正在返回一个数组,您可以通过在数组模式下输入公式来跨越列跨越结果。
水平选择单元格,输入公式,然后按CTRL
+ SHIFT
+ ENTER
。
例如,选择A1:C1
并键入=StringSplit("a b c")
作为数组公式,将在所选的三个单元格中显示数组的三个元素。
您需要预先知道将返回多少元素,并适当选择正确数量的单元格。
如果您不知道将返回多少元素,那么您可能需要查看 Resizing Excel UDF result arrays ,但这是一个黑客攻击,如果可能应该避免。
帮助宏的Here is an example implementation,它会将结果数组的大小调整为正确的大小。
如果要返回行和列,只需返回object[,]
[ExcelFunction(Description = "Returns 2x2 matrix")]
public static object GetValues()
{
return new object[,]
{
{1, 2},
{3, 4},
};
}
其他一切都保持不变。您应该返回与用户选择的单元格数相对应的元素数量,除非您按照上面的说明使用** resizing result arrays。