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

问题描述 投票:0回答:1

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

有一个公式适用于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
c# excel spreadsheetgear
1个回答
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 /等的方式更新它。

© www.soinside.com 2019 - 2024. All rights reserved.