我试图通过电子表格齿轮库在单元格中获取文本。
有一个公式适用于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
就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 /等的方式更新它。