OpenXML:如何获取Excel工作表中选中的checkbox的列表?

我正在尝试阅读Excel文档以获取已选中的checkbox列表。

  • 我在这里find了一个解决scheme,使用OpenXML在Word文档中查找checkbox,但是无法在Excel中checkbox。 看来CheckBox类是为WordProcessing文档而不是Excel保留的。

下面的代码显示了所有checkbox的列表,但无论我做什么,我都无法访问它们的值。 有任何想法吗?

C#代码:

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(@"C:\test.xlsx", false)) { WorkbookPart workBookPart = spreadsheetDocument.WorkbookPart; foreach (Sheet s in workBookPart.Workbook.Descendants<Sheet>()) { if (s.Name.ToString().Equals("Sheet1")) { WorksheetPart wsPart = workBookPart.GetPartById(s.Id) as WorksheetPart; foreach (DocumentFormat.OpenXml.Spreadsheet.Control cb in wsPart.Worksheet.Descendants<DocumentFormat.OpenXml.Spreadsheet.Control>()) { if (cb.Name.ToString().IndexOf("CheckBox") > -1) { textBox1.AppendText(cb.Name + "\n"); } } } } } 

更新:

事实certificate,我们正在使用Active X控件。 以下代码能够正确定位checkbox,这是一个性能非常低的解决scheme,但不能使用OpenXML:

 var xlApp = new Excel.Application(); var xlWorkbook = xlApp.Workbooks.Open(xlFileName); var xlSheet = xlWorkbook.Worksheets["Sheet1"] as Excel.Worksheet; StringBuilder x = new StringBuilder(); try { Excel.OLEObjects oleObjects = xlSheet.OLEObjects() as Excel.OLEObjects; foreach (Excel.OLEObject item in oleObjects) { if (item.progID == "Forms.CheckBox.1") { VBE.CheckBox xlCB = item.Object as VBE.CheckBox; if (xlCB.get_Value()) x.Append(item.Name + ": checked"); else x.Append(item.Name + ": not checked"); Marshal.ReleaseComObject(xlCB); xlCB = null; } } Marshal.ReleaseComObject(oleObjects); oleObjects = null; } catch (Exception ex){ } Marshal.ReleaseComObject(xlSheet); xlSheet = null; xlWorkbook.Close(false, Missing.Value, Missing.Value); Marshal.ReleaseComObject(xlWorkbook); xlWorkbook = null; if (xlApp != null) xlApp.Quit(); Marshal.ReleaseComObject(xlApp); xlApp = null; 

还有什么build议?

假设你正在使用表单控件checkbox这些行中的东西应该有所帮助:

 //s is the Sheet WorksheetPart wsPart = workBookPart.GetPartById(s.Id) as WorksheetPart; foreach (var control in wsPart.ControlPropertiesParts) { string ctrlId = wsPart.GetIdOfPart(control); Console.Write("Control Id: {0}", ctrlId); if (control.FormControlProperties.Checked != null) Console.Write("Checked"); Console.WriteLine(); } 

与MS Word不同,Excel具有表单控件Active X控件 。 你可以阅读这里的差异