C#SpreadSheetGear:#NAME?如果公式应用于单元格,则为文本

时间:2018-06-12 13:17:00

标签: c# excel spreadsheetgear

我正在尝试通过电子表格齿轮库获取单元格中的文本。

有一个公式应用于C1 =GETURL(I2)列,它正在评估类似“https://loremipsum.com/2345/view”的文字

我有另一列C2,其公式输出'View'作为文本

=HYPERLINK(CONCATENATE("https://loremipsum.com/",[@[Customer CID]],"/view"), "View")

现在,当我尝试通过C2列中的单元格的C#代码获取Text时,当我运行以下语句并且“#Name?”时,我得到“View”对于C1列中的细胞。

worksheet.Cells[i, j].Text; //Outputs = "#NAME?"

我尝试在excel中使用=TEXT(GETURL(I2), ""),但仍输出#Name! 我也试过worksheet.Cells[i, j].Value //Output = Name

为什么即使两个单元格都应用了公​​式,相同的语句也会给出不同的结果。

Function GETURL(cell As Range, Optional default_value As Variant)
  With cell.Range("A1")
    If .Hyperlinks.Count = 1 Then
      GETURL = .Hyperlinks(1).Address
    Else
      If Left$(Replace(Replace(Replace(.Formula, " ", ""), vbCr, ""), vbLf, ""), 11) = "=HYPERLINK(" Then
        Dim indexFirstArgument As Long: indexFirstArgument = InStr(.Formula, "(") + 1
        GETURL = Application.Evaluate(Mid$(.Formula, indexFirstArgument, InStrRev(.Formula, ",") - indexFirstArgument))
      Else
        GETURL = default_value
      End If
    End If
  End With
End Function

1 个答案:

答案 0 :(得分:0)

就SpreadsheetGear而言,请注意SpreadsheetGear无法执行VBA代码(尽管它确实在现有的XLS或XLSM文件中保留了VBA)。 SpreadsheetGear支持添加您自己的自定义函数,但您必须通过.NET应用程序中的SpreadsheetGear。CustomFunctions API实现此功能。如果没有可用的自定义函数,SpreadsheetGear将返回#NAME!只要遇到像GETURL这样的函数就会出错,我怀疑这就是你的情况。

要在SpreadsheetGear中实现自定义函数,您基本上必须对Function类进行子类化并覆盖其Evaluate(...)方法,这是每当SpreadsheetGear遇到您的自定义函数时调用的方法在公式中。该文档包含示例,但您也可以在此处找到功能齐全的ASP.NET示例:

https://www.spreadsheetgear.com/support/samples/asp.net.sample.aspx?sample=customfunctions

重要:SpreadsheetGear自定义函数有许多必须遵守的规则。我强烈建议您查看这些规则,如上面链接中提供的Function.Evaluate(...)方法文档的“备注”部分所述。其中一条规则是必须通过IArguments参数提供给Evaluate(...)的参数来完成对单元格的所有访问。

您的GETURL函数似乎可以访问Range,其超链接集合和公式等.SpreadsheetGear的自定义函数API中不允许执行这些操作。您可以访问的是IArguments提供的内容,在将范围传入自定义函数的情况下,这些单元格的基础计算值。换句话说,上面实现的GETURL函数无法移植到SpreadsheetGear自定义函数。您需要以不访问IRange / IRange.Hyperlinks / etc的方式更新它。