我有以下用于删除幻灯片布局部分的代码:
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
答案 0 :(得分:1)
您的slideLayoutId
是错误的。 SlideLayoutParts
不一定按照与SlideLayoutId
s相同的顺序返回。
您可以通过更改行
来解决此问题var slideLayoutId = slideLayoutIds[i];
到
var slideLayoutId = slideLayoutIds.Where(sid => sid.RelationshipId == sm.GetIdOfPart(slp)).FirstOrDefault();
根据slideLayoutId
选择正确的RelationshipId
。