2012-11-21 139 views
1

我正在使用C#和OpenXml DLL修改現有的MS Word文檔。我成功地能夠替換文檔中的一些標籤,然後保存修改,但我還無法刪除部分文本。使用Open XML刪除MS Word文檔部分Word處理文檔

例如,我的文檔有許多標題(Heading1文本樣式),後面是正文文本,我想以編程方式刪除給定標題和所有以下文本,直到下一個標題。

例原稿:

Heading 1 Body text 1 ... ... 

Heading 2 Body text 2 ... ... 

Heading 3 Body text 3 ... ... 

如果用戶想要刪除的標題2,輸出文檔應導致:

Heading 1 Body text 1 ... ... 

Heading 3 Body text 3 ... ... 

我該怎麼做的正確方法?有沒有人有一個想法如何做到這一點?

+0

親愛Skymorth,感謝你的幫助。最後,我遵循了類似於您的建議的內容。我發佈了我使用的代碼 – user1841294

回答

2

這取決於數據(段落)的組織方式。

如果標題和段落彼此相鄰,則循環瀏覽段落,找到具有標題的段落並刪除下一段落。

bool remove = false; 

foreach(Paragraph p in body.Descendants<Paragraph>()) { 

    if (remove) 
    { 
     p.Remove(); 
     remove = !remove; 
     continue; 
    } 

    if(p.InnerText.Contains("Heading 2")) { 

     p.Remove(); 
     remove = !remove; 

    } 

} 
+0

親愛的Skymorth,謝謝你的幫助。最後,我遵循了類似於您的建議的內容。我已經發布了我使用的代碼。 – user1841294

+0

請注意,由於您正在修改循環中的主體,因此這不會對多個元素起作用。只要在循環初始化器中調用'ToList'就可以得到一個獨立的集合來循環。 –

1

我包括我用來解決該問題的代碼:

 List<OpenXmlElement> ElementsToDeleteList = new List<OpenXmlElement>(); 
     bool IsParagraphsToDelete = false; 
     ... 
     // Execute headings removal 
     using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(sOutputFileName, true)) 
     { 
      foreach (OpenXmlElement element in wordDoc.MainDocumentPart.RootElement.Descendants()) 
      { 
       if (element.GetType() == typeof(Paragraph)) 
       { 
        Paragraph paragraph = (Paragraph)element; 
        if (paragraph.ParagraphProperties != null && paragraph.ParagraphProperties.ParagraphStyleId != null && 
         paragraph.ParagraphProperties.ParagraphStyleId.Val != null && paragraph.ParagraphProperties.ParagraphStyleId.Val.Value != null) 
        { 
         if (paragraph.ParagraphProperties.ParagraphStyleId.Val.Value.ToLower().Contains(MainHeaderStyleName.ToLower()) || 
          paragraph.ParagraphProperties.ParagraphStyleId.Val.Value.ToLower().Contains(SecondaryHeaderStyleName.ToLower())) 
         { 
          StringBuilder sb = new StringBuilder(); 
          foreach (var run in paragraph.Elements<Run>()) 
           sb.Append(run.InnerText); 

          string ChapterTitle = sb.ToString().Trim().ToUpper(); 
          IsParagraphsToDelete = ListOfDocumentTests.Where(x => x.Title.ToUpper().Trim() == ChapterTitle && x.IsIncluded == false).FirstOrDefault() != null; 

          if (string.IsNullOrEmpty(ChapterTitle) && !IsParagraphsToDelete) 
           ElementsToDeleteList.Add(paragraph); 
         } 
        } 
       } 

       if (IsParagraphsToDelete && (element.GetType() == typeof(Paragraph) || element.GetType() == typeof(Table))) 
       { 
        ElementsToDeleteList.Add(element); 
       } 

      } 

      foreach (OpenXmlElement elemToDelete in ElementsToDeleteList) 
      { 
       elemToDelete.RemoveAllChildren(); 
       elemToDelete.Remove(); 
      } 


      wordDoc.MainDocumentPart.Document.Save(); 

     }