2012-08-02 92 views
2

我想使用C#和Open XML SDK以編程方式將特定文本分成兩部分。 我爲第一部分所做的工作是刪除所有段落,直到包含所需文本的段落。這工作得很好。 然後在原始文檔的副本上,我只做了相同的操作,只是從包含所需文本的文檔中刪除所有段落。 由於某種原因,第二部分原來是無效的文檔,不能用word打開。 使用「Open XML SDK 2.0生產力工具」打開損壞的文檔並進行驗證,不會檢測到任何文檔問題。如何使用C#和Open XML SDK通過特定文本分割Word文檔?

這是所希望的文本之前移除所述部分的代碼(正常工作):

public static void DeleteFirstPart(string docName) 
    { 
     using (WordprocessingDocument document = WordprocessingDocument.Open(docName, true)) 
     { 
      DocumentFormat.OpenXml.Wordprocessing.Document doc = document.MainDocumentPart.Document; 

      List<Text> textparts = document.MainDocumentPart.Document.Body.Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>().ToList(); 
      foreach (Text textfield in textparts) 
      { 
       if (!textfield.Text.Contains("split here")) 
       { 
        RemoveItem1(textfield); 
       } 
       else 
       { 
        break; 
       } 
      } 
     } 
    } 

我嘗試了兩種不同的刪除項目的方法,均與相同的結果:

private static void RemoveItem1(Text item) 
    { 
     // Need to go up at least two levels to get to the run. 
     if ((item.Parent != null) && 
      (item.Parent.Parent != null) && 
      (item.Parent.Parent.Parent != null)) 
     { 
      var topNode = item.Parent.Parent; 
      var topParentNode = item.Parent.Parent.Parent; 
      if (topParentNode != null) 
      { 
       topNode.Remove(); 
       // No more children? Remove the parent node, as well. 
       if (!topParentNode.HasChildren) 
       { 
        topParentNode.Remove(); 
       } 
      } 
     } 
    } 


private static void RemoveItem2(Text textfield) 
    { 
     if (textfield.Parent != null) 
     { 
      if (textfield.Parent.Parent != null) 
      { 
       if (textfield.Parent.Parent.Parent != null) 
       { 
        textfield.Parent.Parent.Remove(); 
       } 
       else 
       { 
        textfield.Parent.Remove(); 
       } 
      } 
      else 
      { 
       textfield.Remove(); 
      } 
     } 
    } 

這是代碼刪除從所需文本開始的部分(損壞文檔):

public static void DeleteSecondPart(string docName) 
    { 
     using (WordprocessingDocument document = WordprocessingDocument.Open(docName, true)) 
     { 
      DocumentFormat.OpenXml.Wordprocessing.Document doc = document.MainDocumentPart.Document; 

      List<Text> textparts = document.MainDocumentPart.Document.Body.Descendants<DocumentFormat.OpenXml.Wordprocessing.Text>().ToList(); 
      bool remove = false; 
      foreach (Text textfield in textparts) 
      { 
       if (textfield.Text.Contains("split here")) 
       { 
        remove = true; 
       } 

       if(remove) 
       { 
        RemoveItem1(textfield); 
        //Using this commented code line, instead of the one above, removes only the text field itself, it works fine, the document is valid, but it leaves empty paragraphs that could be pages long. 
        //textfield.Remove(); 

       } 
      } 
     } 
    } 
+0

好了,它似乎適用於某些文件,並且未能別人,所以我想一個特定的文檔部分造成這種失敗的(或許表...) 。需要進一步調查......但我會爲任何線索感到高興。 – RonyK 2012-08-02 10:19:12

回答

2

A rew該RemoveItem方法的儀式的伎倆:

private static void RemoveItem3(Text textfield) 
    { 
     OpenXmlElement element = textfield; 
     while (!(element.Parent is DocumentFormat.OpenXml.Wordprocessing.Body) && element.Parent != null) 
     { 
      element = element.Parent; 
     } 

     if (element.Parent != null) 
     { 
      element.Remove(); 
     } 
    } 
相關問題