Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Open XML SDK将幻灯片从一个演示文稿复制到另一个演示文稿_C#_Ms Office_Powerpoint_Openxml_Openxml Sdk - Fatal编程技术网

C# 使用Open XML SDK将幻灯片从一个演示文稿复制到另一个演示文稿

C# 使用Open XML SDK将幻灯片从一个演示文稿复制到另一个演示文稿,c#,ms-office,powerpoint,openxml,openxml-sdk,C#,Ms Office,Powerpoint,Openxml,Openxml Sdk,对不起,我的英语:) 有一个密码 using (var sourceDoc = PresentationDocument.Open(@"d:\source.pptx", false)) { using (var destDoc = PresentationDocument.Open(@"d:\dest.pptx", true)) { } } 我尝试复制幻灯片№2从sourceDoc粘贴到destDoc位置4。 有些文章有相同的标题和标题,但不幸的是我不能应用。我只是

对不起,我的英语:)

有一个密码

using (var sourceDoc = PresentationDocument.Open(@"d:\source.pptx", false))
{
    using (var destDoc = PresentationDocument.Open(@"d:\dest.pptx", true))
    {

    }
}
我尝试复制幻灯片№2从
sourceDoc
粘贴到
destDoc
位置4。


有些文章有相同的标题和标题,但不幸的是我不能应用。我只是糊涂了。例如:

uniqueId = GetMaxIdFromChild(destPresPart.Presentation.SlideMasterIdList);
什么意思?编译时说错误


更新#1 我创建了将幻灯片复制到另一个演示文稿的方法

/// <summary>
/// Copy one slide to another presentation
/// </summary>
/// <param name="sourcePresentationPath"></param>
/// <param name="slidePosition">
/// Slide number from source presentation which will be copy to destinition presentation
/// </param>
/// <param name="destPresentationPath"></param>
/// <remarks>Slide copy to end destinition presentation</remarks>
public static void CopySlideTo(string sourcePresentationPath, int slidePosition, string destPresentationPath)
{
    using (PresentationDocument sourcePresentationDocument = PresentationDocument.Open(sourcePresentationPath, false))
    {
        var sourcePresentationPart = sourcePresentationDocument.PresentationPart;
        var sourcePresentation = sourcePresentationPart.Presentation;
        SlideIdList sourceSlideIdList = sourcePresentation.SlideIdList;
        SlideId slideIdSelectedSlide = sourceSlideIdList.ChildElements[slidePosition - 1] as SlideId;
        SlidePart sourceSlidePart = sourcePresentationPart.GetPartById(slideIdSelectedSlide.RelationshipId) as SlidePart;

        SlidePart destSlidePart = null;
        SlideIdList destSlideIdList = null;
        PresentationPart destPresentationPart = null;
        using (PresentationDocument destPresentationDocument = PresentationDocument.Open(destPresentationPath, true))
        {
            var addedSlidePart = destPresentationDocument.PresentationPart.AddPart(sourceSlidePart);                    

            destSlideIdList = destPresentationDocument.PresentationPart.Presentation.SlideIdList;

            destPresentationPart = destPresentationDocument.PresentationPart;                   

            SlideId lastSlideIdInDestPresentation = destSlideIdList.ChildElements.Last() as SlideId;

            // Insert the new slide into the slide list after last slide 
            SlideId addedSlideId = destSlideIdList.InsertAfter(new SlideId(), lastSlideIdInDestPresentation);
            addedSlideId.Id = lastSlideIdInDestPresentation.Id++;
            addedSlideId.RelationshipId = destPresentationPart.GetIdOfPart(addedSlidePart);

            destPresentationPart.Presentation.Save();
        }
    }
public class Extensions
{
    static uint uniqueId;                       

    /// <summary>
    /// Copy one slide to another presentation
    /// </summary>
    /// <param name="sourcePresentationPath"></param>
    /// <param name="slidePosition">
    /// Slide number from source presentation which will be copy to destinition presentation
    /// </param>
    /// <param name="destPresentationPath"></param>
    /// <remarks>Slide is copied to end destinition presentation</remarks>
    [SuppressMessage("ReSharper", "SuggestVarOrType_SimpleTypes")]
    public static void CopySlideTo(string sourcePresentationPath, int slidePosition, string destPresentationPath)
    {
        using (PresentationDocument sourcePresentationDocument = PresentationDocument.Open(sourcePresentationPath, false))
        {
            var sourcePresentationPart = sourcePresentationDocument.PresentationPart;
            var sourcePresentation = sourcePresentationPart.Presentation;
            SlideIdList sourceSlideIdList = sourcePresentation.SlideIdList;
            SlideId slideIdSelectedSlide = sourceSlideIdList.ChildElements[slidePosition - 1] as SlideId;
            SlidePart sourceSlidePart = sourcePresentationPart.GetPartById(slideIdSelectedSlide.RelationshipId) as SlidePart;
            using (PresentationDocument destPresentationDocument = PresentationDocument.Open(destPresentationPath, true))
            {
                var addedSlidePart = destPresentationDocument.PresentationPart.AddPart(sourceSlidePart);                    

                var destSlideIdList = destPresentationDocument.PresentationPart.Presentation.SlideIdList;

                var destPresentationPart = destPresentationDocument.PresentationPart;                   

                SlideId lastSlideIdInDestPresentation = destSlideIdList.ChildElements.Last() as SlideId;

                // Insert the new slide into the slide list after last slide 
                SlideId addedSlideId = destSlideIdList.InsertAfter(new SlideId(), lastSlideIdInDestPresentation);
                addedSlideId.Id = lastSlideIdInDestPresentation.Id++;
                addedSlideId.RelationshipId = destPresentationPart.GetIdOfPart(addedSlidePart);

                // Get the existing slide master part.
                SlideMasterPart destPresPartSlideMasterPart = destPresentationPart.SlideMasterParts.ElementAt(0);
                string relationshipId = destPresentationPart.GetIdOfPart(destPresPartSlideMasterPart);

                // Get the new slide master part.
                SlideMasterPart sourcePresPartSlideMasterPart = sourcePresentationPart.SlideMasterParts.ElementAt(0);

                // Remove the existing theme part.
                destPresentationPart.DeletePart(destPresentationPart.ThemePart);

                // Remove the old slide master part.
                destPresentationPart.DeletePart(destPresPartSlideMasterPart);

                // Import the new slide master part, and reuse the old relationship ID.
                sourcePresPartSlideMasterPart = destPresentationPart.AddPart(sourcePresPartSlideMasterPart, relationshipId);

                // Change to the new theme part.
                destPresentationPart.AddPart(sourcePresPartSlideMasterPart.ThemePart);

                var newSlideLayouts = new Dictionary<string, SlideLayoutPart>();

                foreach (var slideLayoutPart in sourcePresPartSlideMasterPart.SlideLayoutParts)
                {
                    newSlideLayouts.Add(GetSlideLayoutType(slideLayoutPart), slideLayoutPart);
                }

                // Remove the slide layout relationship on all slides. 
                foreach (var slidePart in destPresentationPart.SlideParts)
                {                        
                    string layoutType = null;

                    if (slidePart.SlideLayoutPart != null)
                    {
                        // Determine the slide layout type for each slide.
                        layoutType = GetSlideLayoutType(slidePart.SlideLayoutPart);

                        // Delete the old layout part.
                        slidePart.DeletePart(slidePart.SlideLayoutPart);
                    }

                    SlideLayoutPart newLayoutPart = null;
                    if (layoutType != null && newSlideLayouts.TryGetValue(layoutType, out newLayoutPart))
                    {
                        // Apply the new layout part.
                        slidePart.AddPart(newLayoutPart);
                    }
                }
                FixSlideLayoutIds(destPresentationPart);
                destPresentationPart.Presentation.Save();                    
            }
        }
    }

    static void FixSlideLayoutIds(PresentationPart presPart)
    {
        // Make sure that all slide layouts have unique ids.
        foreach (SlideMasterPart slideMasterPart in presPart.SlideMasterParts)
        {
            foreach (SlideLayoutId slideLayoutId in slideMasterPart.SlideMaster.SlideLayoutIdList)
            {
                uniqueId++;
                slideLayoutId.Id = (uint)uniqueId;
            }

            slideMasterPart.SlideMaster.Save();
        }
    }

    /// <summary>
    /// Get the slide layout type.
    /// </summary>
    /// <param name="slideLayoutPart"></param>
    /// <returns></returns>
    private static string GetSlideLayoutType(SlideLayoutPart slideLayoutPart)
    {
        CommonSlideData slideData = slideLayoutPart.SlideLayout.CommonSlideData;

        return slideData.Name;
    }
}

// Client code
Extensions.CopySlideTo(@"D:\temp\source.pptx", 1, @"D:\temp\dest.pptx");
//
///将一张幻灯片复制到另一个演示文稿
/// 
/// 
/// 
///源演示文稿中的幻灯片编号,将复制到目标演示文稿
/// 
/// 
///幻灯片复制到最终目的演示文稿
公共静态void CopySlideTo(string sourcePresentationPath、int slidePosition、string destPresentationPath)
{
使用(PresentationDocument sourcePresentationDocument=PresentationDocument.Open(sourcePresentationPath,false))
{
var sourcePresentationPart=sourcePresentationDocument.PresentationPart;
var sourcePresentation=sourcePresentationPart.Presentation;
slidedlist sourceslidedlist=sourcePresentation.slidedlist;
SlideId slideideselectedslide=sourceslidedlist.ChildElements[slidePosition-1]作为SlideId;
SlidePart sourceSlidePart=sourcePresentationPart.GetPartById(SlidedSelectedSlide.RelationshipId)作为SlidePart;
SlidePart destlidepart=null;
slidedlist destlidedlist=null;
PresentationPart destPresentationPart=null;
使用(PresentationDocument destPresentationDocument=PresentationDocument.Open(destPresentationPath,true))
{
var addedSlidePart=destPresentationDocument.PresentationPart.AddPart(sourceSlidePart);
destSlideList=destPresentationDocument.PresentationPart.Presentation.SlideList;
destPresentationPart=destPresentationDocument.PresentationPart;
SlideId LastSlideIndestPresentation=destSlideList.ChildElements.Last()作为SlideId;
//在最后一张幻灯片之后将新幻灯片插入幻灯片列表
SlideId addedSlideId=destSlideList.InsertAfter(新SlideId(),LastSlideIndestPresentation);
addedSlideId.Id=LastSlideIndestPresentation.Id++;
addedSlideId.RelationshipId=destPresentationPart.GetIdOfPart(addedSlidePart);
destPresentationPart.Presentation.Save();
}
}
幻灯片已复制,但没有背景。如何移动背景


更新#2 我最终创建了将幻灯片复制到另一个演示文稿的方法

/// <summary>
/// Copy one slide to another presentation
/// </summary>
/// <param name="sourcePresentationPath"></param>
/// <param name="slidePosition">
/// Slide number from source presentation which will be copy to destinition presentation
/// </param>
/// <param name="destPresentationPath"></param>
/// <remarks>Slide copy to end destinition presentation</remarks>
public static void CopySlideTo(string sourcePresentationPath, int slidePosition, string destPresentationPath)
{
    using (PresentationDocument sourcePresentationDocument = PresentationDocument.Open(sourcePresentationPath, false))
    {
        var sourcePresentationPart = sourcePresentationDocument.PresentationPart;
        var sourcePresentation = sourcePresentationPart.Presentation;
        SlideIdList sourceSlideIdList = sourcePresentation.SlideIdList;
        SlideId slideIdSelectedSlide = sourceSlideIdList.ChildElements[slidePosition - 1] as SlideId;
        SlidePart sourceSlidePart = sourcePresentationPart.GetPartById(slideIdSelectedSlide.RelationshipId) as SlidePart;

        SlidePart destSlidePart = null;
        SlideIdList destSlideIdList = null;
        PresentationPart destPresentationPart = null;
        using (PresentationDocument destPresentationDocument = PresentationDocument.Open(destPresentationPath, true))
        {
            var addedSlidePart = destPresentationDocument.PresentationPart.AddPart(sourceSlidePart);                    

            destSlideIdList = destPresentationDocument.PresentationPart.Presentation.SlideIdList;

            destPresentationPart = destPresentationDocument.PresentationPart;                   

            SlideId lastSlideIdInDestPresentation = destSlideIdList.ChildElements.Last() as SlideId;

            // Insert the new slide into the slide list after last slide 
            SlideId addedSlideId = destSlideIdList.InsertAfter(new SlideId(), lastSlideIdInDestPresentation);
            addedSlideId.Id = lastSlideIdInDestPresentation.Id++;
            addedSlideId.RelationshipId = destPresentationPart.GetIdOfPart(addedSlidePart);

            destPresentationPart.Presentation.Save();
        }
    }
public class Extensions
{
    static uint uniqueId;                       

    /// <summary>
    /// Copy one slide to another presentation
    /// </summary>
    /// <param name="sourcePresentationPath"></param>
    /// <param name="slidePosition">
    /// Slide number from source presentation which will be copy to destinition presentation
    /// </param>
    /// <param name="destPresentationPath"></param>
    /// <remarks>Slide is copied to end destinition presentation</remarks>
    [SuppressMessage("ReSharper", "SuggestVarOrType_SimpleTypes")]
    public static void CopySlideTo(string sourcePresentationPath, int slidePosition, string destPresentationPath)
    {
        using (PresentationDocument sourcePresentationDocument = PresentationDocument.Open(sourcePresentationPath, false))
        {
            var sourcePresentationPart = sourcePresentationDocument.PresentationPart;
            var sourcePresentation = sourcePresentationPart.Presentation;
            SlideIdList sourceSlideIdList = sourcePresentation.SlideIdList;
            SlideId slideIdSelectedSlide = sourceSlideIdList.ChildElements[slidePosition - 1] as SlideId;
            SlidePart sourceSlidePart = sourcePresentationPart.GetPartById(slideIdSelectedSlide.RelationshipId) as SlidePart;
            using (PresentationDocument destPresentationDocument = PresentationDocument.Open(destPresentationPath, true))
            {
                var addedSlidePart = destPresentationDocument.PresentationPart.AddPart(sourceSlidePart);                    

                var destSlideIdList = destPresentationDocument.PresentationPart.Presentation.SlideIdList;

                var destPresentationPart = destPresentationDocument.PresentationPart;                   

                SlideId lastSlideIdInDestPresentation = destSlideIdList.ChildElements.Last() as SlideId;

                // Insert the new slide into the slide list after last slide 
                SlideId addedSlideId = destSlideIdList.InsertAfter(new SlideId(), lastSlideIdInDestPresentation);
                addedSlideId.Id = lastSlideIdInDestPresentation.Id++;
                addedSlideId.RelationshipId = destPresentationPart.GetIdOfPart(addedSlidePart);

                // Get the existing slide master part.
                SlideMasterPart destPresPartSlideMasterPart = destPresentationPart.SlideMasterParts.ElementAt(0);
                string relationshipId = destPresentationPart.GetIdOfPart(destPresPartSlideMasterPart);

                // Get the new slide master part.
                SlideMasterPart sourcePresPartSlideMasterPart = sourcePresentationPart.SlideMasterParts.ElementAt(0);

                // Remove the existing theme part.
                destPresentationPart.DeletePart(destPresentationPart.ThemePart);

                // Remove the old slide master part.
                destPresentationPart.DeletePart(destPresPartSlideMasterPart);

                // Import the new slide master part, and reuse the old relationship ID.
                sourcePresPartSlideMasterPart = destPresentationPart.AddPart(sourcePresPartSlideMasterPart, relationshipId);

                // Change to the new theme part.
                destPresentationPart.AddPart(sourcePresPartSlideMasterPart.ThemePart);

                var newSlideLayouts = new Dictionary<string, SlideLayoutPart>();

                foreach (var slideLayoutPart in sourcePresPartSlideMasterPart.SlideLayoutParts)
                {
                    newSlideLayouts.Add(GetSlideLayoutType(slideLayoutPart), slideLayoutPart);
                }

                // Remove the slide layout relationship on all slides. 
                foreach (var slidePart in destPresentationPart.SlideParts)
                {                        
                    string layoutType = null;

                    if (slidePart.SlideLayoutPart != null)
                    {
                        // Determine the slide layout type for each slide.
                        layoutType = GetSlideLayoutType(slidePart.SlideLayoutPart);

                        // Delete the old layout part.
                        slidePart.DeletePart(slidePart.SlideLayoutPart);
                    }

                    SlideLayoutPart newLayoutPart = null;
                    if (layoutType != null && newSlideLayouts.TryGetValue(layoutType, out newLayoutPart))
                    {
                        // Apply the new layout part.
                        slidePart.AddPart(newLayoutPart);
                    }
                }
                FixSlideLayoutIds(destPresentationPart);
                destPresentationPart.Presentation.Save();                    
            }
        }
    }

    static void FixSlideLayoutIds(PresentationPart presPart)
    {
        // Make sure that all slide layouts have unique ids.
        foreach (SlideMasterPart slideMasterPart in presPart.SlideMasterParts)
        {
            foreach (SlideLayoutId slideLayoutId in slideMasterPart.SlideMaster.SlideLayoutIdList)
            {
                uniqueId++;
                slideLayoutId.Id = (uint)uniqueId;
            }

            slideMasterPart.SlideMaster.Save();
        }
    }

    /// <summary>
    /// Get the slide layout type.
    /// </summary>
    /// <param name="slideLayoutPart"></param>
    /// <returns></returns>
    private static string GetSlideLayoutType(SlideLayoutPart slideLayoutPart)
    {
        CommonSlideData slideData = slideLayoutPart.SlideLayout.CommonSlideData;

        return slideData.Name;
    }
}

// Client code
Extensions.CopySlideTo(@"D:\temp\source.pptx", 1, @"D:\temp\dest.pptx");
公共类扩展
{
静态单位唯一性;
/// 
///将一张幻灯片复制到另一个演示文稿
/// 
/// 
/// 
///源演示文稿中的幻灯片编号,将复制到目标演示文稿
/// 
/// 
///幻灯片被复制到终点演示文稿
[SuppressMessage(“ReSharper”、“SuggestVarOrType_SimpleType”)]
公共静态void CopySlideTo(string sourcePresentationPath、int slidePosition、string destPresentationPath)
{
使用(PresentationDocument sourcePresentationDocument=PresentationDocument.Open(sourcePresentationPath,false))
{
var sourcePresentationPart=sourcePresentationDocument.PresentationPart;
var sourcePresentation=sourcePresentationPart.Presentation;
slidedlist sourceslidedlist=sourcePresentation.slidedlist;
SlideId slideideselectedslide=sourceslidedlist.ChildElements[slidePosition-1]作为SlideId;
SlidePart sourceSlidePart=sourcePresentationPart.GetPartById(SlidedSelectedSlide.RelationshipId)作为SlidePart;
使用(PresentationDocument destPresentationDocument=PresentationDocument.Open(destPresentationPath,true))
{
var addedSlidePart=destPresentationDocument.PresentationPart.AddPart(sourceSlidePart);
var destSlidedList=destPresentationDocument.PresentationPart.Presentation.SlidedList;
var destPresentationPart=destPresentationDocument.PresentationPart;
SlideId LastSlideIndestPresentation=destSlideList.ChildElements.Last()作为SlideId;
//在最后一张幻灯片之后将新幻灯片插入幻灯片列表
SlideId addedSlideId=destSlideList.InsertAfter(新SlideId(),LastSlideIndestPresentation);
addedSlideId.Id=LastSlideIndestPresentation.Id++;
addedSlideId.RelationshipId=destPresentationPart.GetIdOfPart(addedSlidePart);
//获取现有幻灯片母版零件。
SlideMasterPart DestPresPart SlideMasterPart=destPresentationPart.SlideMasterParts.ElementAt(0);
string relationshipId=destPresentationPart.GetIdOfPart(DestPressPartSlideMasterPart);
//获取新的幻灯片母版部件。
SlideMasterPart sourcePresPartSlideMasterPart=sourcePresentationPart.SlideMasterParts.ElementAt(0);
//删除现有的主题部分。
destPresentationPart.DeletePart(destPresentationPart.ThePart);
//卸下旧的幻灯片母版零件。
destPresentationPart.DeletePart(DestPrePartSlideMasterPart);
//导入新的幻灯片母版零件,并重用旧的关系ID。
sourcePresPartSlideMasterPart=destPresentationPart.AddPart(sourcePresPartSlideMasterPart,relationshipId);
//更改为新的主题部分。
destPresentationPart.AddPart(sourcePresPartSlideMasterPart.ThemePart);
var newSlideLayouts=新字典();
foreach(sourcePresPartSlideMasterPart.SlideLayoutParts中的var slideLayoutPart)
{
newSlideLayouts.Add(getlayouts)