从演示文稿中删除幻灯片布局

Removing Slide Layouts from Presentation

我有以下用于删除幻灯片布局部分的代码:

var presentation = output.PresentationPart;

var usedSlideLayouts = presentation.SlideParts.Select(it => it.SlideLayoutPart).ToList();
foreach (var sm in presentation.SlideMasterParts)
{
    var slideLayoutIds = sm.SlideMaster.SlideLayoutIdList.Elements<SlideLayoutId>().ToList();
    var slideLayoutParts = sm.SlideLayoutParts.ToList();

    var i = 0;
    foreach (var slp in slideLayoutParts)
    {
        var isUsed = usedSlideLayouts.Any(usl => usl == slp);

        if (!isUsed)
        {
            var slideLayoutId = slideLayoutIds[i];
            slideLayoutId.Remove();
            sm.DeletePart(slp);
        }

        i++;
    }
}

当我在 运行 之后保存演示文稿时,我的演示文稿已损坏(需要在打开 PowerPoint 之前恢复)。

据我所见(通过解压缩 pptx),这可能是因为只有一个幻灯片布局,但它的内部 URI 类似于 'slideLayout2.xml'。有没有办法刷新该内部 URI?

对于任何想知道我在本期 github 中附上幻灯片的人: https://github.com/OfficeDev/Open-XML-SDK/issues/218

你的slideLayoutId是错误的。 SlideLayoutParts 不一定按与 SlideLayoutId 相同的顺序返回。

你可以通过改变行来解决这个问题

var slideLayoutId = slideLayoutIds[i];

var slideLayoutId = slideLayoutIds.Where(sid => sid.RelationshipId == sm.GetIdOfPart(slp)).FirstOrDefault();

这会根据 RelationshipId 选择正确的 slideLayoutId