如何从文档中成功删除具有给定 ID 的 altChunk。我遵循的过程是 -
MainDocumentPart mainPart = theDoc.MainDocumentPart;
mainPart.DeletePart(mainPart.GetPartById("AltChunkIdA1"));
我在给定的 sdt 之后添加 altChunk。为了添加一个 altChunk,我有以下代码 -
string altSchedChunkId = "AltChunkIdA1";
AlternativeFormatImportPart schedChunk = mainPart.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.WordprocessingML, altSchedChunkId);
schedChunk.FeedData(File.Open(FileA12, FileMode.Open));
AltChunk altSchedChunk = new AltChunk();
altSchedChunk.Id = altSchedChunkId;
OpenXmlElement parent = sdtRunSchedTerms.Parent;
parent.InsertAfter(altSchedChunk, sdtRunSchedTerms);
但似乎并没有成功。每次我尝试编辑文档时,都会添加一个具有相同 ID 的新 altChunk,而不是删除 altChunk。
提前致谢
你好
最佳答案
我对 block 有同样的问题,但我想我已经解决了。
如果仔细查看添加 block 的代码,您会发现它实际上做了两件事:
- 创建一个 block (
AddAlternativeFormatImportPart
)
和
- 在文档中的某处添加对 chunck 的引用 (
InsertAfter
)。
删除 block 的代码不会删除对该 block 的引用。如果您随后添加一个具有相同 ID 的新 block 并添加一个引用,您最终将看到您的 block 出现两次。
参见 AltChunk class documentation on MSDN了解更多详情。
我使用此代码删除对 block 的任何现有引用。
var altChunks = mainPart.RootElement.Descendants<AltChunk>().Where(e => e.Id == altChunkId);
foreach (var altChunk in altChunks)
{
altChunk.Remove();
}
之后,您可以使用 DeletePart()
删除 block 本身。
我必须承认我是通过反复试验发现的,所以我不能 100% 确定这是推荐的方法,但它似乎有效。
为了更好地了解 block 实际上是什么,我解压缩了一个 .docx 文件(7-zip 愿意这样做)并找到了一个包含 block 的目录 word作为一个目录_rels,里面有一个文件document.xml.rels。后者列出了对 block 的引用,即它们应该插入的位置。
关于c# - 删除一个 altChunk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40481265/