Text 使用Open XML WordprocessingDocument删除MS Word文档部分

Text 使用Open XML WordprocessingDocument删除MS Word文档部分,text,openxml,Text,Openxml,我正在使用C#和OpenXMLDLL修改现有的MS Word文档。我能够成功地替换文档中的一些标记,然后保存修改,但我还不能删除部分文本 例如,我的文档有许多标题(Heading1文本样式),后跟正文,我希望通过编程删除给定的标题和所有后续文本,直到下一个标题 原始文件示例: Heading 1 Body text 1 ... ... Heading 2 Body text 2 ... ... Heading 3 Body text 3 ... ... 如果用户希望删除标题2,则输出文档应

我正在使用C#和OpenXMLDLL修改现有的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;

    }

}
bool remove=false;
foreach(body.subjects()中的p段){
如果(删除)
{
p、 删除();
移除=!移除;
继续;
}
如果(p.InnerText.Contains(“标题2”)){
p、 删除();
移除=!移除;
}
}

我包括我用来解决问题的代码:

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

        }
List element stodeleteList=new List();
bool IsParagraphsToDelete=false;
...
//执行标题删除
使用(WordprocessingDocument wordDoc=WordprocessingDocument.Open(sOutputFileName,true))
{
foreach(wordDoc.MainDocumentPart.RootElement.subjections()中的OpenXmlElement元素)
{
if(element.GetType()==typeof(段落))
{
段落=(段落)要素;
如果(paragraph.ParagraphProperties!=null&&ParagraphProperties.ParagraphStyleId!=null&&
ParagraphProperties.ParagraphStyleId.Val!=null&&ParagraphProperties.ParagraphStyleId.Val.Value!=null)
{
如果(段落.ParagraphProperties.ParagraphStyleId.Val.Value.ToLower())包含(MainHeaderStyleName.ToLower())||
ParagraphProperties.ParagraphStyleId.Val.Value.ToLower()包含(SecondaryHeaderStyleName.ToLower())
{
StringBuilder sb=新的StringBuilder();
foreach(var在段落.Elements()中运行)
sb.Append(run.InnerText);
字符串ChapterTitle=sb.ToString().Trim().ToUpper();
IsParagraphsToDelete=ListOfDocumentTests.Where(x=>x.Title.ToUpper().Trim()==ChapterTitle&&x.IsIncluded==false)。FirstOrDefault()!=null;
if(string.IsNullOrEmpty(ChapterTitle)&&&!IsParagraphsToDelete)
元素删除列表。添加(段落);
}
}
}
if(IsParagraphsToDelete&(element.GetType()==typeof(段落)| | element.GetType()==typeof(表格)))
{
ElementsToDeleteList.Add(元素);
}
}
foreach(ElementsToDeleteList中的OpenXmlElement elemToDelete)
{
elemToDelete.RemoveAllChildren();
elemToDelete.Remove();
}
wordDoc.MainDocumentPart.Document.Save();
}

亲爱的Skymorth,感谢您的帮助。最后,我采纳了与你的建议类似的建议。我发布了我使用的代码Daer Skymorth,谢谢你的帮助。最后,我采纳了与你的建议类似的建议。我已经发布了我使用的代码。请注意,由于您正在修改循环中的主体,因此这对多个元素不起作用。只需在循环初始值设定项中调用
ToList
,即可获得一个独立的集合进行循环。