2

私がやりたいことは、OpenXML SDK を使用していくつかのスライドをマスター プレゼンテーションにマージすることだけです。サーバー環境では理想的ではないため、Introp を使用したくありません。多くのコード サンプルを試しましたが、マージされたプレゼンテーションには常に修復メッセージが表示されます。 、破損したファイルと修復されたファイルを比較すると、ID が正しく生成されていないことがわかりました。

実際に動作するオープン ソース ライブラリまたはサンプル コードはありますか。Aspose のことは聞いたことがありますが、これは有料のライブラリです。

4

3 に答える 3

2

Microsoft MSDN の記事

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

パワーポイント プレゼンテーションを結合する方法を順を追って説明します。

ID が一意であることを保証します。唯一の欠点は、すべてのスライドのスライド マスターもコピーするため、最終的なパワーポイント ファイルが予想よりも大きくなることです。

于 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 に答える