2

我想要做的就是使用 OpenXML SDK 将一些幻灯片合并到一个主演示文稿中,我不想使用 Introp,因为它在服务器环境中并不理想,我尝试了很多代码示例,但合并的演示文稿总是向我显示修复消息,当我将损坏的文件与修复的文件进行比较时,我发现没有正确生成 id。

是否有任何真正有效的开源库或示例代码。我听说过 Aspose,但它是一个付费图书馆。

4

3 回答 3

2

The Microsoft MSDN article

http://msdn.microsoft.com/en-us/library/office/ee361883(v=office.12).aspx

gives a step by step instruction on how to merge powerpoint presentations together.

It takes care of ensuring the ID's are unique. The only disadvantage is that it also copies the slide masters for each and every slide, making the final powerpoint file larger than expected.

于 2012-10-03T06:06:08.030 回答
-1

在http://openxmldeveloper.org/尝试演示生成器代码。

于 2013-05-11T22:37:53.687 回答
-2

是的,如果 id 不是唯一的,你会遇到问题,下面是我正在使用的工作代码。我知道它的旧线程,但如果有人正在寻找答案,

public static void MergeSlides(string presentationFolder, string sourcePresentation, string destPresentation)
{
    int id = 0;

    // Open the destination presentation.
    using (PresentationDocument myDestDeck = PresentationDocument.Open(presentationFolder + destPresentation, true))
    {
        PresentationPart destPresPart = myDestDeck.PresentationPart;

        // If the merged presentation does not have a SlideIdList element yet, add it.
        if (destPresPart.Presentation.SlideIdList == null)
            destPresPart.Presentation.SlideIdList = new SlideIdList();

        // Open the source presentation. This will throw an exception if the source presentation does not exist.
        using (PresentationDocument mySourceDeck = PresentationDocument.Open(presentationFolder + sourcePresentation, false))
        {
            PresentationPart sourcePresPart = mySourceDeck.PresentationPart;

            // Get unique ids for the slide master and slide lists for use later.
            uniqueId = GetMaxSlideMasterId(destPresPart.Presentation.SlideMasterIdList);

            uint maxSlideId = GetMaxSlideId(destPresPart.Presentation.SlideIdList);

            // Copy each slide in the source presentation, in order, to the destination presentation.
            foreach (SlideId slideId in sourcePresPart.Presentation.SlideIdList)
            {
                SlidePart sp;
                SlidePart destSp;
                SlideMasterPart destMasterPart;
                string relId;
                SlideMasterId newSlideMasterId;
                SlideId newSlideId;

                // Create a unique relationship id.
                id++;
                sp = (SlidePart)sourcePresPart.GetPartById(slideId.RelationshipId);

                relId = sourcePresentation.Remove(sourcePresentation.IndexOf('.')) + id;

                // Add the slide part to the destination presentation.
                destSp = destPresPart.AddPart<SlidePart>(sp, relId);

                // The slide master part was added. Make sure the relationship between the main presentation part and
                // the slide master part is in place.
                destMasterPart = destSp.SlideLayoutPart.SlideMasterPart;
                destPresPart.AddPart(destMasterPart);

                // Add the slide master id to the slide master id list.
                uniqueId++;
                newSlideMasterId = new SlideMasterId();
                newSlideMasterId.RelationshipId = destPresPart.GetIdOfPart(destMasterPart);
                newSlideMasterId.Id = uniqueId;

                destPresPart.Presentation.SlideMasterIdList.Append(newSlideMasterId);

                // Add the slide id to the slide id list.
                maxSlideId++;
                newSlideId = new SlideId();
                newSlideId.RelationshipId = relId;
                newSlideId.Id = maxSlideId;

                destPresPart.Presentation.SlideIdList.Append(newSlideId);
            }

            // Make sure that all slide layout ids are unique.
            FixSlideLayoutIds(destPresPart);
        }

        // Save the changes to the destination deck.
        destPresPart.Presentation.Save();
    }
}

   public static void FixSlideLayoutIds(PresentationPart presPart)
    {
        //Need to make sure 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();
        }
    }
于 2016-02-24T07:14:19.737 回答