从演示文稿中删除幻灯片布局
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
。
我有以下用于删除幻灯片布局部分的代码:
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
。