在 OpenXml 复选框 word2013 中设置值

Posted

技术标签:

【中文标题】在 OpenXml 复选框 word2013 中设置值【英文标题】:Setting the value in OpenXml checkbox word2013 【发布时间】:2015-08-19 16:39:53 【问题描述】:

所以我有一个正在通过 WPF(C#) 应用程序编辑的文档。 我已成功编辑纯文本内容控件,但现在我卡住了选中/取消选中表单中的复选框。

我成功找到了复选框并设置了值并保存了文档,但是当我打开它时,设置为 true 的复选框从未在 word 文档中被选中。

这是我用来操作复选框的代码。 注意:我在标签级别访问复选框,因此 field.parent.parent

private static void SetCheckBox(OpenXmlElement field, bool isChecked)

    var checkBox = field.Parent.Parent.Descendants<SdtContentCheckBox>().ToList();
    foreach (var check in checkBox)
    
        if (isChecked)
        
            check.Checked.Val = OnOffValues.True;
        
        else
        
            check.Checked.Val = OnOffValues.False;
        
        MessageBox.Show(check.Checked.Val);
    

当我在 MessageBox 中显示值时,它们显示 0/1 表示真/假。所以它们实际上正在设置中。

我这样做正确吗?

【问题讨论】:

【参考方案1】:

看来不仅必须设置复选框的Checked 值,还必须更改Text 值。

所以我最近的代码也有一些改动,但它改变了复选框的麻烦方面。

代码:

private static void SetCheckBox(OpenXmlElement field, bool isChecked)

    if (isChecked)
    
        field.Parent.Parent.FirstChild.GetFirstChild<SdtContentCheckBox>().Checked.Val = OnOffValues.True;
        field.Parent.Parent.Descendants<Run>().First().GetFirstChild<Text>().Text = "☒";
    
    else
    
        field.Parent.Parent.FirstChild.GetFirstChild<SdtContentCheckBox>().Checked.Val = OnOffValues.False;
        field.Parent.Parent.Descendants<Run>().First().GetFirstChild<Text>().Text = "☐";
    

浓缩:

private static void SetCheckBox(OpenXmlElement field, bool isChecked)

    field.Parent.Parent.FirstChild.GetFirstChild<SdtContentCheckBox>().Checked.Val = isChecked ? OnOffValues.True : OnOffValues.False;
    field.Parent.Parent.Descendants<Run>().First().GetFirstChild<Text>().Text = isChecked ? "☒" : "☐";

【讨论】:

这能解决你的问题吗? @MaximePorté 是的 如果此代码解决了问题,请将其标记为答案。【参考方案2】:

解决问题的另一个版本的代码:

    private void ResetFile(string filePath)
    
        using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
        
            try
            
                string uncheckValue = "☐";
                string checkValue = "☒";

                foreach (SdtContentCheckBox ctrl in doc.MainDocumentPart.Document.Body.Descendants<SdtContentCheckBox>())
                
                    if (ctrl.Checked.Val == OnOffValues.One)
                    
                        ctrl.Checked.Val = OnOffValues.Zero;
                        if (ctrl.Parent.Parent.Descendants<SdtContentRun>().ToList().Count > 0)
                        
                            SdtContentRun text = (SdtContentRun)ctrl.Parent.Parent.Descendants<SdtContentRun>().ToList()[0];
                            text.InnerXml = text.InnerXml.Replace(checkValue, uncheckValue);
                        
                    
                

                doc.MainDocumentPart.Document.Save();
            
            catch  
        
    

【讨论】:

以上是关于在 OpenXml 复选框 word2013 中设置值的主要内容,如果未能解决你的问题,请参考以下文章

将多个word文档合并为一个Open Xml

如何使用openxml C#在word文档中添加形状?

OpenXML - 将书签应​​用于 Word 文档中的段落

使用 OpenXML 和 Regex 在 Word Docx 中查找和替换撇号(')的问题

在Word2007中,如何通过Range.InsertXML方法将一个OpenXML插入到空白文档中?

使用openxml sdk 操作word 无法刷新域信息