[英]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.