c# - 删除一个 altChunk

标签 c# openxml openxml-sdk

如何从文档中成功删除具有给定 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 的代码,您会发现它实际上做了两件事:

  1. 创建一个 block (AddAlternativeFormatImportPart)

  1. 在文档中的某处添加对 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/

相关文章:

c# - 如何使用 OpenXML C# 在 PowerPoint 中插入新的 SmartArt

c# - 我们是否需要安装 Office 才能使用 OpenXML?

.net - 如何指定正确的列?

c# - 使用 OpenXML SDK 2.0 在运行时累积 RunProperties

c# - 需要对 MVC3 应用程序进行哪些更改才能发送电子邮件?

c# - 将 List<Product> 拆分为 SubLists<Product>

c# - WPF 显示命令行选项

c# - 如何通过 EF Code First 使用遗留类?

c# - 如何定义数据类型?

c# - 将多个单元格添加到单个行