【问题标题】:Get textbox value from Excel cell从 Excel 单元格获取文本框值
【发布时间】:2014-02-11 01:25:53
【问题描述】:

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

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 框确实有一个“值”属性,因此我可以访问文本框的值:

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 属性。

【问题讨论】:

    标签: c# excel interop


    【解决方案1】:

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

    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 中的文本。

    【讨论】:

      【解决方案2】:

      好吧,TextBox 实际上并不在任何单元格内(尽管它可能看起来是)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多