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

用户向我提供了一个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对迭代形状的build议使我朝着正确的方向前进。 但使用下面的代码,我得到空例外:

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

看完Quickwatch中的对象后,我注意到了这个形状的一些奇怪的东西。 它是msoOLEControlObjecttypes的。 事实certificate,这个Excel文档的值是从一个网页剪切和粘贴到Excel中。 Excel不是创build文本框,而是OLE框。 OLE框确实有一个“Value”属性,所以我可以像这样访问文本框的值:

 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()); } } } 

所以确保你是否处理粘贴的对象,你检查值属性,而不是TextRange属性。

如果你知道文本框的名字,你可以这样引用它:

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

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

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

 Dim shp As Shape Dim myText As String For Each shp In ActiveSheet.Shapes myText = shp.TextFrame2.TextRange.Characters.Text Next 

虽然我看到你正在使用C#,但是上面的代码会有点不同,但是它至less会给你一个对象模型来获取TextBox

那么,TextBox实际上不在任何单元格内(虽然它可能是)。

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