Text 使用Open XML WordprocessingDocument删除MS Word文档部分
我正在使用C#和OpenXMLDLL修改现有的MS Word文档。我能够成功地替换文档中的一些标记,然后保存修改,但我还不能删除部分文本 例如,我的文档有许多标题(Heading1文本样式),后跟正文,我希望通过编程删除给定的标题和所有后续文本,直到下一个标题 原始文件示例: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,则输出文档应
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
,即可获得一个独立的集合进行循环。