使用C#OpenXml SDK对MS Word中的所有项目符号应用删除

时间:2016-11-28 18:24:29

标签: c# ms-word openxml openxml-sdk

我需要在MS Word文档中将样式应用于项目符号。 我可以使用docx阅读完整的OpenXML,然后使用Run节点为段落应用样式

enter image description here

这就是我根据条件在其他区域应用样式的方法

private void StrikeAndUnderline(Run run)
        {
            if (run.RunProperties == null)
            {
                run.RunProperties = new RunProperties();
            }
            run.RunProperties.Strike = new Strike();
            run.RunProperties.Strike.Val = true;
            run.RunProperties.Underline = new Underline();
            run.RunProperties.Underline.Val = UnderlineValues.Single;
        }

但我没有获得子弹的Run属性

enter image description here

<w:p>
  <w:pPr>
    <w:pStyle w:val="ListParagraph"/>
    <w:numPr>
      <w:ilvl w:val="0"/>
      <w:numId w:val="1"/>
    </w:numPr>
  </w:pPr>
  <w:r>
    <w:t>Paragraph one.</w:t>
  </w:r>
</w:p>

2 个答案:

答案 0 :(得分:0)

这并不明显,但是文档部分仅包含对编号部分中存储的编号单元(具有所有格式和编号样式)的引用。

- 文件部分。 因此,在Document部分中,您必须同时对NumberingLevelReference(w:ilvl)和NumberingId(w:numId)进行grub。

- 编号部分。 下一步是打开Numbering部分并使用NumberID属性搜索NumberingInstance(w:num),该属性与您在Document part中看到的NumberingId相同。 现在,一旦你想要NumberingInstance,在它的孩子中寻找AbstractNumId并记住它的价值。 现在搜索具有您刚刚记住的相同ID的AbstractNum节点。

干杯!现在您拥有当前编号的属性。属性由编号级别分隔。所以现在搜索所需的level(),你在Document部分的编号属性中看到的那个。 一旦找到意味着正确编号级别的节点,就应该像

那样
<w:lvl w:ilvl="0" w:tplc="BBD6A362" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:start w:val="1" />
  <w:numFmt w:val="decimal" />
  <w:lvlText w:val="%1." />
  <w:lvlJc w:val="left" />
  <w:pPr>
    <w:ind w:left="720" w:hanging="360" />
  </w:pPr>
  <w:rPr>
    <w:strike />
  </w:rPr>
</w:lvl>

答案 1 :(得分:0)

基于@Shelest提供的解释,这里是快速&amp;使用OpenXML SDK实现引人注目的子弹

public static void ReadAndStrikeBulletsWithOpenXml()
        {
            var sourcePath = @"C:\temp\test.docx";
            var destinationPath = @"C:\temp\new-test.docx";
            File.Copy(sourcePath, destinationPath);
            using (var document = WordprocessingDocument.Open(destinationPath, true))
            {
                Numbering numbering = document.MainDocumentPart.NumberingDefinitionsPart.Numbering;
                var abstractNum = numbering.ChildElements.FirstOrDefault(x => x.LocalName.Equals("abstractNum"));
                if (abstractNum?.ChildElements != null)
                {
                    foreach (var child in abstractNum.ChildElements)
                    {
                        if (child.OuterXml.Contains("<w:lvl"))
                        {
                            XmlDocument levelXml = new XmlDocument();
                            levelXml.LoadXml(child.OuterXml);

                            XmlNamespaceManager namespaceManager = new XmlNamespaceManager(levelXml.NameTable);
                            namespaceManager.AddNamespace("w",
                                "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

                            XmlNode runProperty = levelXml.SelectSingleNode("w:lvl/w:rPr", namespaceManager);
                            if (runProperty == null)
                            {
                                // Need to uncomment this if you prefer to strike all bullets at all levels
                                //child.InnerXml = child.InnerXml +
                                //                 "<w:rPr><w:strike w:val\"1\"/></w:rPr>";
                            }
                            else if (runProperty.InnerXml.Contains("w:strike"))
                            {
                                XmlDocument runXml = new XmlDocument();
                                runXml.LoadXml(runProperty.OuterXml);

                                XmlNamespaceManager runNamespaceManager = new XmlNamespaceManager(runXml.NameTable);
                                runNamespaceManager.AddNamespace("w",
                                    "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

                                XmlNode strikeNode = runXml.SelectSingleNode("w:rPr/w:strike", namespaceManager);
                                if (strikeNode?.Attributes != null)
                                {
                                    if (strikeNode.Attributes["w:val"] == null)
                                    {
                                        // do nothing
                                    }
                                    else if (strikeNode.Attributes["w:val"].Value == "0")
                                    {
                                        child.InnerXml = child.InnerXml.Replace("w:strike w:val=\"0\"", "w:strike w:val=\"1\"");
                                    }
                                }
                            }
                        }
                    }
                }
                document.MainDocumentPart.Document.Save();
                document.Close();
            }
        }