【问题标题】:Getting Shape Type from Excel Shapes从 Excel 形状中获取形状类型
【发布时间】:2014-06-29 20:25:57
【问题描述】:

我有一个 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

【问题讨论】:

    标签: c# excel com office-interop ole


    【解决方案1】:

    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 的便利等)。如果你想知道;

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

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

    【讨论】:

    • 谢谢,是的,这个枚举 XlFormControl。我一直在寻找,您的回答为我指明了正确的方向。
    • @Pankaj 对最初的混乱感到抱歉,但我很高兴现在已经解决了:)
    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 2016-09-27
    • 2012-07-27
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多