c# - 如何从 Word 文档中复制富文本内容控件的内容并使用 Open XML SDK 删除控件本身
问题描述
我正在尝试将富文本内容控件的内容从一个复制到另一个 Word 文档。每个富文本内容控件都包含一个文本块和一些纯文本内容控件。下面的代码似乎工作......
using (WordprocessingDocument doc = WordprocessingDocument.Open(destinationFile, true))
{
MainDocumentPart mainPart = doc.MainDocumentPart;
Dictionary<string, SdtBlock> sdtBlocks = getContentControlsFromDocument(sourceFile);
foreach (KeyValuePair<string, SdtBlock> sdtBlock in sdtBlocks)
{
SdtElement control = mainPart.Document.Body.Descendants<SdtElement>().Where(r =>
{
var tag = r.SdtProperties.GetFirstChild<Tag>();
return tag != null && tag.Val == sdtBlock.Key.ToLower();
}).FirstOrDefault();
SdtContentBlock cloneSdtContentBlock = (SdtContentBlock)sdtBlock.Value.Descendants<SdtContentBlock>().FirstOrDefault().Clone();
control.Parent.InsertAfter(cloneSdtContentBlock, control);
control.Remove();
}
mainPart.Document.Save();
}
但是当我尝试destinationFile
使用下面的代码找到所有内容控件时
string key = "tag_name";
List<SdtElement> controls = mainPart.Document.Body.Descendants<SdtElement>().Where(r =>
{
var tag = r.SdtProperties.GetFirstChild<Tag>();
return tag != null && tag.Val == key.ToLower();
}).ToList();
我找不到从sourceFile
. 换句话说,我只想复制富文本内容控件的内容,而不复制控件本身。
更新:
为了简化问题。我有一个富文本内容控件,它可能有纯文本和几个纯文本内容控件。我只需要复制(仅)这个富文本内容控件中的内容,它将整个内容包装到另一个 Word 文档中。
解决方案
与此同时,我自己设法解决了这个问题。这是解决方案,因此它可能对其他人有用。
using (WordprocessingDocument doc = WordprocessingDocument.Open(@"C:\tmp\test-1.docx", true))
{
MainDocumentPart mainPart = doc.MainDocumentPart;
foreach (var conditialTemplate in conditionalTemplates)
{
List<SdtElement> controls = mainPart.Document.Body.Descendants<SdtElement>().Where(r =>
{
var tag = r.SdtProperties.GetFirstChild<Tag>();
return tag != null && tag.Val == conditialTemplate.ToLower();
}).ToList();
foreach (var control in controls)
{
if (control != null)
{
SdtProperties props = control.Elements<SdtProperties>().FirstOrDefault();
Tag tag = props.Elements<Tag>().FirstOrDefault();
Console.WriteLine("Tag: " + tag.Val);
string theRightBlock = "A";
SdtBlock theRightSdtBlock = GetTheRightConditionalSdtBlock(theRightBlock, tag.Val);
if (theRightSdtBlock != null)
{
OpenXmlElement parent = control.Parent;
SdtBlock clone = new SdtBlock();
clone = (SdtBlock)theRightSdtBlock.Clone();
var elements = clone.GetFirstChild<SdtContentBlock>().ChildElements.ToList();
elements.Reverse();
elements.ForEach(child =>
{
parent.InsertAfter(child.Clone() as OpenXmlElement, control);
});
control.Remove();
}
}
}
}
mainPart.Document.Save();
}
推荐阅读
- php - 在 PHP PDO 语句中使用多个参数
- python - 如何检查列表中的每个项目是否出现在另一个列表中的任何项目中?
- python - Python中的递归函数在Excel工作表中找不到日期
- java - 使用 PreAuthenticated 请求的 Oracle Cloud MultiPartUpload
- javascript - 允许 HTML 表单验证,但一旦完成就停止提交
- java - 用 XML 替换 yaml 时表已存在错误
- vue.js - 使用dayjs提前将服务器默认时间转换为用户未知的时区?
- android - 如何在 Chrome OS 上启用 ADB 调试?
- c# - 有没有办法为运算符使用变量?
- sql - BigQuery 中是否有数字版本的 SUBSTR?