如何使用OpenXML SDK访问Excel工作表中的FormControl复选框

时间:2016-06-14 14:37:29

标签: excel checkbox openxml-sdk

我有一个电子表格,在工作表上的各个单元格中有多个复选框,我需要从c#程序中获取(已选中/未选中)的值。

我正在使用OpenXML SDK v2.5和相关的工具箱。

使用工具箱我可以看到复选框控件作为AlternateControlParts集合的一部分。这些不是ActiveX复选框,而是通过Excel中的开发人员选项卡添加的表单控件。

当我使用SDK时,我也可以看到WorkSheetPart,其上有一个ControlPropertiesParts集合,其中列出了所有复选框。

我的问题是,如何找到哪个复选框位于哪个单元格中,或者至少与哪个单元格相关?

我也找到了这个系列 wsPart.ControlPropertiesParts.First()。DrawingsPart .WorkSheetDrawing.DrawingsPart.WorkSheetDrawing

此集合似乎具有每个复选框的备用内容,如果我进一步向下钻取,我可以找到似乎给出相对于工作表上的单元格的复选框位置的锚点。但是,col和行Id看起来并不完全匹配,我怀疑Offset值也可能与它有关。

如果有人能指出我如何将复选框映射到正确的行/单元格,我将非常感激。

感谢您的帮助。

此致 保罗

1 个答案:

答案 0 :(得分:1)

我有一个解决方案,它只包含逻辑(自Office 2010以来,属性FormControlProperties可用:

        SpreadsheetDocument document;
        string sheetName = "sheetName";
        string controlName = "Option Button 5";
        ...
        var wbPart = document.WorkbookPart;
        var theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName);
        var wsPart = (WorksheetPart)wbPart.GetPartById(theSheet.Id);
        var control = wsPart.Worksheet.Descendants<DocumentFormat.OpenXml.Spreadsheet.Control>().FirstOrDefault(c => c.Name == controlName);
        var controlProperies = (ControlPropertiesPart)wsPart.GetPartById(control.Id);
        bool isChecked = controlProperies.FormControlProperties.Checked == "Checked";

但是,如果可以编辑excel文件,将FormControl值映射到单元格并读取单元格值会更简单。