2012-11-21 59 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(); 

     }