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

时间:2017-07-04 11:10:36

标签: c# openxml

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

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++;
    }
}

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

从我所看到的(通过解压缩pptx),这可能是因为只有一个幻灯片布局,但它的内部URI就像是&#39; slideLayout2.xml&#39;。有没有办法刷新内部URI?

对于任何想知道我在这个github问题上附加了一个powerpoint的人: https://github.com/OfficeDev/Open-XML-SDK/issues/218

1 个答案:

答案 0 :(得分:1)

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

您可以通过更改行

来解决此问题
var slideLayoutId = slideLayoutIds[i];

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

根据slideLayoutId选择正确的RelationshipId