2016-11-28 99 views
0

所有的子彈,我需要樣式應用到子彈在MS Word文檔透。 我能夠使用OpenXML然後使用Run節點使用C#的OpenXML SDK適用於在MS Word

enter image description here

這是我如何在對基於狀態了其他一些應用樣式申請段落樣式docx閱讀全

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> 

回答

0

基於@Shelest提供,這裏是驚人的子彈使用的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(); 
      } 
     } 
0

這不是顯而易見的,但是文獻部分只包含參照編號單元(與所有格式和編號樣式),其存儲在編號部分。

--Document一部分。 所以在文件部分,你必須grub的兩個NumberingLevelReference(W:ILVL)和NumberingId(W:numId)。

--Numbering一部分。 下一步是開放的編號組成部分,搜索NumberingInstance(W:NUM)與NumberID屬性,是NumberingId你在文檔部分看到的一樣。 現在,一旦你想要的NumberingInstance,尋找AbstractNumId它的子項中,並記住它的價值。 現在搜索AbstractNum節點,您只需記住相同的ID。

乾杯!現在你有當前編號的屬性。這些屬性由編號級別分隔。因此,現在搜索所需的級別(),您在文檔部分編號屬性中看到的級別()。 一旦你找到節點,這意味着正確的編號級別,你應該讓它像

<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> 
+0

當我從OpenXml SDK加載MainDocument時,我沒有得到編號部分,我是否需要明確地執行某些操作來構建此對象? – HaBo

+0

@HaBo請確保您的文檔包含編號,以便先敲打。 – Shelest

+0

我該如何確定?我從docx路徑加載XML。 – HaBo

相關問題