簡體   English   中英

使用Open XML WordprocessingDocument刪除MS Word文檔部分

[英]Delete MS Word document portion using Open XML WordprocessingDocument

我正在使用C#和OpenXml DLL來修改現有的MS 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 ... ...

我是否正確地這樣做? 有誰知道怎么做?

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

如果標題和段落彼此相鄰,只需在段落中循環,找到帶有標題的段落並刪除下一段。

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;

    }

}

我包含了用於解決問題的代碼:

        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();

        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM