koc*_*ful 2 c# powerpoint openxml-sdk
我想克隆一张 PowerPoint 文档的幻灯片并使用 OpenXML 插入到同一个文档中。为此,我使用以下功能:
public static void AddNewSlide(PresentationPart parent, Slide _slideTemplate, string newId)
{
var newSlidePart = parent.AddNewPart<SlidePart>(newId);
newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open));
newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart));
newSlidePart.Slide.Save();
DocumentFormat.OpenXml.Presentation.SlideIdList slideIdList = parent.Presentation.SlideIdList;
uint maxSlideId = 1;
foreach (DocumentFormat.OpenXml.Presentation.SlideId slideId in slideIdList.ChildElements)
{
if (slideId.Id > maxSlideId) maxSlideId = slideId.Id;
}
DocumentFormat.OpenXml.Presentation.SlideId newSlideId = new DocumentFormat.OpenXml.Presentation.SlideId { Id = ++maxSlideId, RelationshipId = parent.GetIdOfPart(newSlidePart) };
slideIdList.Append(newSlideId);
}
Run Code Online (Sandbox Code Playgroud)
如果原始幻灯片只包含文本,它工作正常,但是当原始幻灯片也包含图像时,结果 PowerPoint 文档将被损坏。新幻灯片上的图像将不会显示,只会显示一条消息:“当前无法显示此图像。”
此代码正在生成损坏的幻灯片,因为它只复制数据和布局,而不是幻灯片中的图像。
newSlidePart.FeedData(_slideTemplate.SlidePart.GetStream(FileMode.Open));
newSlidePart.AddPart(_slideTemplate.SlidePart.SlideLayoutPart, _slideTemplate.SlidePart.GetIdOfPart(_slideTemplate.SlidePart.SlideLayoutPart));
Run Code Online (Sandbox Code Playgroud)
例如:上面的 2 行会说新幻灯片指的是一个图像,但该图像本身在新幻灯片中丢失了。因此,要解决这个问题,您还需要编写将图像从旧幻灯片复制到新幻灯片的代码。
//add all the image part from the source slide to the new one
List<ImagePart> imageParts = new List<ImagePart>();
sourceSlidePart.GetPartsOfType<ImagePart>(imageParts);
foreach (ImagePart img in imageParts)
{
string relID = sourceSlidePart.GetIdOfPart(img); // get relationship ID
ImagePart newImagePart = newSlidePart.AddImagePart(img.ContentType, relID);
newImagePart.FeedData(img.GetStream(FileMode.Open));
}
Run Code Online (Sandbox Code Playgroud)