确定excel单元格是否包含公式(VSTO:C#或VB)

确定excel单元格是否包含公式(VSTO:C#或VB),c#,excel,vsto,C#,Excel,Vsto,我有一张桌子: 应用程序需要识别公式并以特殊方式处理它们(例如,不重写它们)。 每一行的内容如下: object[,] formulas = (object[,])worksheet.Range["A2:C2"].Formula; if (((string)formulas[1,3]).StartsWith("=")) { //handle formula } 这个解决方案有一个重要的bug。似乎无法“看到”单引号符号,即: “=A1”由公

我有一张桌子:

应用程序需要识别公式并以特殊方式处理它们(例如,不重写它们)。 每一行的内容如下:

object[,] formulas = (object[,])worksheet.Range["A2:C2"].Formula;

if (((string)formulas[1,3]).StartsWith("="))
{
    //handle formula
}
这个解决方案有一个重要的bug。似乎无法“看到”单引号符号,即:

  • “=A1”
    由公式属性读取为
    “=A1”
    ,识别工作正常
  • “'=A1”
    由公式属性读取为
    “=A1”
    ,因此即使它不是公式,也会被识别为公式
我还探讨了另一个解决方案,显式HasFormula范围属性

if ((bool)worksheet.Range["C5"].HasFormula == true)
{
    //handle formula
}
HasFormula不返回数组,因此必须测试每个单元格。这有一个巨大的性能缺陷,也是我读取整行而不是单个单元格的主要原因

因此,第一种解决方案不可靠,第二种解决方案效率低下,现在我没有选择了。

还有什么我可以试试的吗?

前面的单引号是传统的简写,用于强制单元格进入文本模式

可以使用.PrefixCharacter方法将其作为VBA/C++中单个单元格的属性进行访问,如果前缀存在,该方法将返回单个字符串或null

HasPrefixString = Range("B2").PrefixCharacter 

C应该有一个类似于VBA或类似于C++的方法(或更好)。SpecialCells可以生成一个非矩形区域,该区域仅包含内容为公式的单元格,这在单个COM调用中完成。然后,我必须检查我的每个单元格是否包含在SpecialCells返回范围内。这必须在不使用诸如Intersect之类的excel函数的情况下完成,因为这将是对每个单元格的COM调用,这样我们将回到一个大的性能问题。我认为这个解决方案不是很简单但可行,我现在正在尝试实现类似的东西。但希望有更好的解决方案。这很有趣,不幸的是它不能用于范围,只能逐个单元,这是每个单元的COM调用,效率非常低。一个包含10*1000个单元格的表格可以在一秒钟内读取,而一个单元格一个单元格的读取可能需要15秒。