c#:ExcelDNA在excel中显示一个数组

时间:2018-01-17 15:54:15

标签: arrays excel-dna

我正在为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;

1 个答案:

答案 0 :(得分:2)

考虑到您正在返回一个数组,您可以通过在数组模式下输入公式来跨越列跨越结果。

水平选择单元格,输入公式,然后按CTRL + SHIFT + ENTER

例如,选择A1:C1并键入=StringSplit("a b c")作为数组公式,将在所选的三个单元格中显示数组的三个元素。

enter image description here

您需要预先知道将返回多少元素,并适当选择正确数量的单元格。

如果您不知道将返回多少元素,那么您可能需要查看 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