删除altChunk

时间:2016-11-08 07:29:50

标签: 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。

提前致谢,

NEHA

1 个答案:

答案 0 :(得分:0)

我对块有同样的问题,但我想我解决了它。

如果仔细查看代码以添加块,您会发现它实际上做了两件事:

  1. 创建一个块(AddAlternativeFormatImportPart
    1. 在文档中的某处(InsertAfter)添加对chunck的引用。
    2. 删除块的代码不会删除对块的引用。如果您随后添加一个具有相同ID 的新块添加引用,则最终会出现两次显示的块。

      有关详细信息,请参阅AltChunk class documentation on MSDN

      我使用此代码删除对块的任何现有引用。

      var altChunks = mainPart.RootElement.Descendants<AltChunk>().Where(e => e.Id == altChunkId);
      
      foreach (var altChunk in altChunks)
      {
          altChunk.Remove();
      }
      

      之后,您可以使用DeletePart()删除块本身。

      我必须承认我是通过反复试验找到的,所以我并不是100%确定这是推荐的方法,但它似乎有用。

      为了更好地了解块实际上是什么,我解压缩.docx文件(7-zip愿意这样做)并找到一个包含块的目录 word ,以及一个目录 _rels ,里面有一个文件 document.xml.rels 。后者列出了对chuncks的引用,即它们应插入的位置。