从Excel单元格中获取文本框值

时间:2014-02-10 16:08:47

标签: c# excel interop

用户向我提供了一个Excel文档,其中包含几个单元格中的文本框。我有通常的设置代码来加载Excel应用程序,获取工作表,然后开始迭代使用的范围。当我尝试获取包含文本框的单元格的值时,该值为null。

foreach (Range row in usedRange.Rows) {
    object[,] valueArray = (object[,])row.get_Value(XlRangeValueDataType.xlRangeValueDefault);
    var value = valueArray[1,10];  // This is null for textbox cells
}

我是否应该使用特殊方法来获取Excel工作表中显示的文本框的值?

使用修复和解释进行修改

Stewbob关于迭代形状的建议让我朝着正确的方向前进。但是使用以下代码,我得到了空例外:

for (int i=1; i<shapes.Count;i++){
    var item = shapes.Range[i].Item(1);
    string myString = item.TextFrame2.TextRange.Characters.Text.ToString();
}

在Quickwatch中查看对象后,我注意到形状有些奇怪。它的类型为msoOLEControlObject。事实证明,此Excel文档中的值将从网页剪切并粘贴到Excel中。 Excel不是创建文本框而是创建OLE框。 OLE框确实有一个'Value'属性,所以我可以这样访问textboxes值:

var shapes = ws.Shapes;
    for (int i=1; i<shapes.Count;i++){
        var item = shapes.Range[i].Item(1);
        var myText = item.OLEFormat.Object;
        if (myText.Object != null) {
            if (myText.Object.Value != null) {
                Console.WriteLine(myText.Object.Value.ToString());
            }
        }
    }

因此,请确保您正在处理粘贴的对象,并检查value属性而不是TextRange属性。

2 个答案:

答案 0 :(得分:3)

如果您知道文本框的名称,可以这样引用:

ActiveSheet.Shapes.Range(Array("TextBox 1")).Select

如果您不知道名称,可以使用ActiveSheet.Shapes遍历工作表上的所有形状。

在VBA中获取TextBox中的实际文本并不是非常简单。以下代码遍历活动工作表上的所有Shape个对象:

Dim shp As Shape
Dim myText As String

For Each shp In ActiveSheet.Shapes
    myText = shp.TextFrame2.TextRange.Characters.Text
Next

虽然我发现您使用的是C#,但上面的代码会有所不同,但它至少会为您提供对象模型以获取TextBox内的文本。

答案 1 :(得分:1)

好吧,TextBox实际上并不在任何单元格内(尽管看起来似乎如此)。

相反,您必须从WorkSheet中的Shapes集合中获取它。