从演示文稿中删除幻灯片版式



>我有以下代码用于删除幻灯片版式部分:

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

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

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

对于任何想知道的人,我在这个 github 问题中附上了一个 Powerpoint: 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

最新更新