从Excel形状获取形状类型

时间:2014-05-12 12:53:34

标签: c# excel com office-interop ole

我有一张Excel表格,里面有一些组合框和复选框。

我正在尝试阅读他们选择的值。如果Checkbox上有组合框和崩溃,我的代码工作正常,因为它们中没有ListFillRange。

如何获取形状的形状类型,以便我的函数GetControlValue可以返回所有控件类型的值。

foreach (Excel.Shape s in ws.Shapes)
{
    string value = GetControlValue(ws, s.Name);
}


private string GetControlValue(Excel.Worksheet ws, String shapeName)
{
    var selValue = ws.Shapes.Item(shapeName).ControlFormat.Value;

    //the fill range
    var r = ws.Shapes.Item(shapeName).ControlFormat.ListFillRange;
    var oRng = ws.Range[r];
    var selectedValue = oRng.get_Item(selValue).Value;
    return selectedValue;

}

还有一个MsoShapeType枚举,但它总是返回msoFormControl

1 个答案:

答案 0 :(得分:2)

MSForms控件

foreach (Shape s in ws.Shapes)
{
    //s.FormControlType.ToString();
}

<小时/> <击> ActiveX控件

foreach (Shape s in ws.Shapes)
{
    //s.OLEFormat.progID.ToString();
}

即使它们是Excel中的形状,它们实际上也是C#的所有OLEObjects,并且它也更好地对待它们(更少的转换因为COM最初将它们视为Ole对象,Shape是Excel&#39; s便利等)。万一你想知道;

foreach (OLEObject obj in ws.OLEObjects())
{
    // obj.progID.ToString();
}

你可能接下来需要一个switch语句,所以你知道你正在处理哪个控件,因为你已经恰当地注意到该复选框没有ListFillRange属性但是Value和Labels有Caption而不是价值等