【发布时间】: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 属性。
【问题讨论】: