Share via


Anleitung: Verschieben einer Folie an eine neue Position in einer Präsentation

Letzte Änderung: Donnerstag, 14. Oktober 2010

Gilt für: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

Inhalt dieses Artikels
Abrufen eines Presentation-Objekts
Grundlegende Präsentationsdokumentstruktur
Funktionsweise des Beispielcodes
Berechnen der Anzahl der Folien
Verschieben einer Folie von einer Position an eine andere
Beispielcode

In diesem Thema wird erklärt, wie Sie mithilfe der Klassen im Open XML SDK 2.0 für Microsoft Office in einer Präsentation programmgesteuert eine Folie an eine andere Position verschieben.

Die folgenden Assemblydirektiven sind zum Kompilieren des Codes in diesem Thema erforderlich.

using System;
using System.Linq;
using DocumentFormat.OpenXml.Presentation;
using DocumentFormat.OpenXml.Packaging;
Imports System
Imports System.Linq
Imports DocumentFormat.OpenXml.Presentation
Imports DocumentFormat.OpenXml.Packaging

Abrufen eines Presentation-Objekts

Im Open XML SDK stellt die PresentationDocument-Klasse ein Präsentationsdokumentpaket dar. Zur Verwendung eines Präsentationsdokuments müssen Sie zuerst eine Instanz der PresentationDocument-Klasse erstellen und anschließend mit dieser Instanz arbeiten. Rufen Sie zum Erstellen der Klasseninstanz anhand des Dokuments die Open(String, Boolean)-Methode auf, die einen Dateipfad und als zweiten Parameter einen booleschen Wert verwendet, um anzugeben, ob ein Dokument bearbeitet werden kann. Wenn Sie die Anzahl von Folien in einer Präsentation zählen möchten, können Sie die Datei am besten mit Schreibschutz öffnen, um das versehentliche Schreiben in die Datei zu verhindern. Geben Sie hierzu den Wert false für den booleschen Parameter an, wie in der folgenden using-Anweisung gezeigt. In diesem Code handelt es sich bei dem presentationFile-Parameter um eine Zeichenfolge, die den Pfad zu der Datei darstellt, aus der Sie das Dokument öffnen möchten.

// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
    // Insert other code here.
}                                                                                                                                                                                                                                                                                                                                                                                     
' Open the presentation as read-only.
Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationFile, False)
    ' Insert other code here.
End Using

Die using-Anweisung ist eine empfohlene Alternative zur herkömmlichen Reihenfolge ".Open, .Save, .Close". Sie stellt sicher, dass die Dispose-Methode (vom Open XML SDK verwendete interne Methode zum Bereinigen von Ressourcen) bei Erreichen der schließenden Klammer automatisch aufgerufen wird. Der auf die using-Anweisung folgende Block richtet einen Bereich für das Objekt ein, das in der using-Anweisung erstellt oder benannt wird, in diesem Fall presentationDocument.

Grundlegende Präsentationsdokumentstruktur

Die grundlegende Dokumentstruktur eines PresentationML-Dokuments besteht aus vielen Teilen, darunter der Hauptteil mit der Präsentationsdefinition. Im folgenden Text aus der ISO/IEC 29500-Spezifikation wird das Gesamtformat eines PresentationML-Pakets erläutert.

Der Hauptteil eines PresentationML-Pakets beginnt mit dem Stammelement der Präsentation. Dieses Element enthält eine Präsentation, die wiederum auf eine Folienliste, eine Folienmasterliste, eine Notizenmasterliste und eine Handzettelmasterliste verweist. Die Folienliste verweist auf alle Folien in der Präsentation. Die Folienmasterliste verweist auf sämtliche in der Präsentation verwendeten Folienmaster. Der Notizenmaster enthält Informationen zur Formatierung der Notizenseiten. Und der Handzettelmaster beschreibt das Aussehen eines Handzettels.

Ein Handzettel ist ein gedruckter Foliensatz, der an eine Zielgruppe zur späteren Bezugnahme verteilt werden kann.

Neben Text und Grafiken kann jede Folie Kommentare und Notizen enthalten, ein Layout aufweisen und Teil mindestens einer zielgruppenorientierten Präsentation sein. Ein Kommentar ist eine Anmerkung der Person, die die Foliengruppe der Präsentation verwaltet. Eine Notiz ist eine Erinnerung oder eine kurze Textstelle, die für den Präsentator oder die Zielgruppe bestimmt ist.

Andere Features, die in einem PresentationML-Dokument enthalten sein können, sind Animationen, Audio, Video und Überblendungen zwischen den Folien.

Ein PresentationML-Dokument wird nicht als ein großer Textkörper in einem einzelnen Teil gespeichert. Die Elemente, mit deren Hilfe bestimmte Funktionsgruppierungen erfolgen, sind stattdessen in mehreren Teilen gespeichert. Beispielsweise sind alle Kommentare in einem Dokument in einem Kommentarteil gespeichert, wobei jede Folie über einen eigenen Teil verfügt.

© ISO/IEC29500: 2008.

Dieses XML-Codesegment stellt eine Präsentation dar, die zwei Folien mit den IDs 267 und 256 enthält.

<p:presentation xmlns:p="…" … > 
   <p:sldMasterIdLst>
      <p:sldMasterId
         xmlns:rel="http://…/relationships" rel:id="rId1"/>
   </p:sldMasterIdLst>
   <p:notesMasterIdLst>
      <p:notesMasterId
         xmlns:rel="http://…/relationships" rel:id="rId4"/>
   </p:notesMasterIdLst>
   <p:handoutMasterIdLst>
      <p:handoutMasterId
         xmlns:rel="http://…/relationships" rel:id="rId5"/>
   </p:handoutMasterIdLst>
   <p:sldIdLst>
      <p:sldId id="267"
         xmlns:rel="http://…/relationships" rel:id="rId2"/>
      <p:sldId id="256"
         xmlns:rel="http://…/relationships" rel:id="rId3"/>
   </p:sldIdLst>
       <p:sldSz cx="9144000" cy="6858000"/>
   <p:notesSz cx="6858000" cy="9144000"/>
</p:presentation>

Mithilfe des Open XML SDK 2.0 können Sie eine Dokumentstruktur und Inhalte erstellen, indem Sie stark typisierte Klassen verwenden, die PresentationML-Elementen entsprechen. Diese Klassen sind im DocumentFormat.OpenXml.Presentation-Namespace enthalten. Die folgende Tabelle enthält die Namen der Klassen, die den Elementen sld, sldLayout, sldMaster und notesMaster entsprechen.

PresentationML-Element

Open XML SDK 2.0-Klasse

Beschreibung

sld

Slide

Präsentationsfolie. Das SlidePart-Stammelement.

sldLayout

SlideLayout

Das Folienlayout. Das SlideLayoutPart-Stammelement.

sldMaster

SlideMaster

Der Folienmaster. Das SlideMasterPart-Stammelement.

notesMaster

NotesMaster

Notizenmaster (oder Handzettelmaster). Das NotesMasterPart-Stammelement.

Funktionsweise des Beispielcodes

Wenn Sie eine bestimmte Folie in einer Präsentationsdatei an eine neue Position verschieben möchten, muss Ihnen zunächst die Anzahl von Folien in der Präsentation bekannt sein. Daher ist der Code in diesem Thema in zwei Teile unterteilt. Im ersten Teil wird die Anzahl der Folien berechnet, und im zweiten Teil wird eine Folie an eine neue Position verschoben.

Berechnen der Anzahl der Folien

Der Beispielcode zum Berechnen der Anzahl von Folien besteht aus zwei Überladungen der CountSlides-Methode. Die erste Überladung verwendet einen Parameter vom Typ string und die zweite einen PresentationDocument-Parameter. Bei der ersten CountSlides-Methode öffnet der Beispielcode das Präsentationsdokument in der using-Anweisung. Dann wird das PresentationDocument-Objekt an die zweite CountSlides-Methode übergeben, die eine ganze Zahl zurückgibt, mit der die Anzahl der Folien in der Präsentation dargestellt wird.

// Pass the presentation to the next CountSlides method
// and return the slide count.
return CountSlides(presentationDocument);
' Pass the presentation to the next CountSlides method
' and return the slide count.
Return CountSlides(presentationDocument)

In der zweiten CountSlides-Methode überprüft der Code, ob das übergebene PresentationDocument-Objekt ungleich null ist. Falls nicht, wird ein PresentationPart-Objekt aus dem PresentationDocument-Objekt abgerufen. Durch Verwendung von SlideParts ruft der Code slideCount ab und gibt dieses Element zurück.

// Check for a null document object.
if (presentationDocument == null)
{
    throw new ArgumentNullException("presentationDocument");
}

int slidesCount = 0;

// Get the presentation part of document.
PresentationPart presentationPart = presentationDocument.PresentationPart;

// Get the slide count from the SlideParts.
if (presentationPart != null)
{
    slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
' Check for a null document object.
If presentationDocument Is Nothing Then
    Throw New ArgumentNullException("presentationDocument")
End If

Dim slidesCount As Integer = 0

' Get the presentation part of document.
Dim presentationPart As PresentationPart = presentationDocument.PresentationPart

' Get the slide count from the SlideParts.
If presentationPart IsNot Nothing Then
    slidesCount = presentationPart.SlideParts.Count()
End If
' Return the slide count to the previous method.
Return slidesCount

Verschieben einer Folie von einer Position an eine andere

Zum Verschieben einer Folie an eine neue Position ist das Öffnen der Datei für den Lese-/Schreibzugriff erforderlich, indem der Wert true für den booleschen Parameter wie in der folgenden using-Anweisung gezeigt verwendet wird. Der Code für das Verschieben einer Folie besteht aus zwei Überladungen der MoveSlide-Methode. Die erste überladene MoveSlide-Methode verwendet drei Parameter: eine Zeichenfolge, die den Dateinamen und Pfad der Präsentation darstellt, sowie zwei ganze Zahlen, welche die aktuelle Indexposition der Folie und die Indexposition darstellen, an welche die Folie verschoben werden soll. Sie öffnet die Präsentationsdatei, ruft ein PresentationDocument-Objekt ab und übergibt dieses Objekt und die beiden ganzen Zahlen, from und to, anschließend an die zweite überladene MoveSlide-Methode, die die tatsächliche Verschiebung ausführt.

// Move a slide to a different position in the slide order in the presentation.
public static void MoveSlide(string presentationFile, int from, int to)
{
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        MoveSlide(presentationDocument, from, to);
    }
}
' Move a slide to a different position in the slide order in the presentation.
Public Shared Sub MoveSlide(ByVal presentationFile As String, ByVal [from] As Integer, ByVal [to] As Integer)
    Using presentationDocument As PresentationDocument = PresentationDocument.Open(presentationFile, True)
        MoveSlide(presentationDocument, From, [to])
    End Using
End Sub

In der zweiten überladenen MoveSlide-Methode wird die CountSlides-Methode zum Abrufen der Anzahl der Folien in der Präsentation aufgerufen. Vom Code wird dann überprüft, ob sich die nullbasierten Indizes, from und to, innerhalb des Bereichs befinden und unterschiedlich sind.

public static void MoveSlide(PresentationDocument presentationDocument, int from, int to)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    // Call the CountSlides method to get the number of slides in the presentation.
    int slidesCount = CountSlides(presentationDocument);

    // Verify that both from and to positions are within range and different from one another.
    if (from < 0 || from >= slidesCount)
    {
        throw new ArgumentOutOfRangeException("from");
    }

    if (to < 0 || from >= slidesCount || to == from)
    {
        throw new ArgumentOutOfRangeException("to");
    }
Public Shared Sub MoveSlide(ByVal presentationDocument As PresentationDocument, ByVal [from] As Integer, ByVal [to] As Integer)
    If presentationDocument Is Nothing Then
        Throw New ArgumentNullException("presentationDocument")
    End If

    ' Call the CountSlides method to get the number of slides in the presentation.
    Dim slidesCount As Integer = CountSlides(presentationDocument)

    ' Verify that both from and to positions are within range and different from one another.
    If
        From < 0 OrElse
        From >= slidesCount Then
        Throw New ArgumentOutOfRangeException("from")
    End If

    If [to] < 0 OrElse
        From >= slidesCount OrElse [to] =
        From Then
        Throw New ArgumentOutOfRangeException("to")
    End If

Ein PresentationPart-Objekt wird deklariert und entsprechend dem Präsentationsteil des übergebenen PresentationDocument-Zielobjekts festgelegt. Das PresentationPart-Objekt wird zum Erstellen eines Presentation-Objekts verwendet, und dann wird ein SlideIdList-Objekt erstellt, das die Liste der Folien in der Präsentation aus dem Presentation-Objekt darstellt. Es wird eine Folien-ID der Quellfolie (der zu verschiebenden Folie) zurückgegeben, und dann wird die Position der Zielfolie identifiziert (der Folie, hinter die die Quellfolie in der Folienreihenfolge verschoben werden soll).

// Get the presentation part from the presentation document.
PresentationPart presentationPart = presentationDocument.PresentationPart;

// The slide count is not zero, so the presentation must contain slides.            
Presentation presentation = presentationPart.Presentation;
SlideIdList slideIdList = presentation.SlideIdList;

// Get the slide ID of the source slide.
SlideId sourceSlide = slideIdList.ChildElements[from] as SlideId;

SlideId targetSlide = null;

// Identify the position of the target slide after which to move the source slide.
if (to == 0)
{
    targetSlide = null;
}
if (from < to)
{
    targetSlide = slideIdList.ChildElements[to] as SlideId;
}
else
{
    targetSlide = slideIdList.ChildElements[to - 1] as SlideId;
}
' Get the presentation part from the presentation document.
Dim presentationPart As PresentationPart = presentationDocument.PresentationPart

' The slide count is not zero, so the presentation must contain slides.            
Dim presentation As Presentation = presentationPart.Presentation
Dim slideIdList As SlideIdList = presentation.SlideIdList

' Get the slide ID of the source slide.
Dim sourceSlide As SlideId = TryCast(slideIdList.ChildElements(From), SlideId)

Dim targetSlide As SlideId = Nothing

' Identify the position of the target slide after which to move the source slide.
If to = 0 Then
    targetSlide = Nothing
End If
If From < to Then
    targetSlide = TryCast(slideIdList.ChildElements(to), SlideId)
Else
    targetSlide = TryCast(slideIdList.ChildElements(to - 1), SlideId)
End If

Die Remove-Methode des SlideID-Objekts wird zum Entfernen der Quellfolie von der aktuellen Position verwendet, und dann wird die InsertAfter-Methode des SlideIdList-Objekts verwendet, um die Quellfolie an der Indexposition hinter der Zielfolie einzufügen. Schließlich wird die geänderte Präsentation gespeichert.

// Remove the source slide from its current position.
sourceSlide.Remove();

// Insert the source slide at its new position after the target slide.
slideIdList.InsertAfter(sourceSlide, targetSlide);

// Save the modified presentation.
presentation.Save();
' Remove the source slide from its current position.
sourceSlide.Remove()

' Insert the source slide at its new position after the target slide.
slideIdList.InsertAfter(sourceSlide, targetSlide)

' Save the modified presentation.
presentation.Save()

Beispielcode

Es folgt der vollständige Beispielcode, den Sie zum Verschieben einer Folie von einer Position an eine andere Position in derselben Präsentationsdatei verwenden können. Sie können z. B. den folgenden Aufruf im Programm verwenden, um eine Folie von Position 0 an Position 1 in einer Präsentationsdatei mit dem Namen Myppt11.pptx zu verschieben.

MoveSlide(@"C:\Users\Public\Documents\Myppt11.pptx", 0, 1);
MoveSlide("C:\Users\Public\Documents\Myppt11.pptx", 0, 1)

Überprüfen Sie nach Ausführung des Programms die neuen Positionen der Folien in der Präsentationsdatei.

Es folgt der vollständige Beispielcode in C# und Visual Basic.

// Counting the slides in the presentation.
 public static int CountSlides(string presentationFile)
{
    // Open the presentation as read-only.
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
    {
        // Pass the presentation to the next CountSlides method
        // and return the slide count.
        return CountSlides(presentationDocument);
    }
}

// Count the slides in the presentation.
public static int CountSlides(PresentationDocument presentationDocument)
{
    // Check for a null document object.
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    int slidesCount = 0;

    // Get the presentation part of document.
    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // Get the slide count from the SlideParts.
    if (presentationPart != null)
    {
        slidesCount = presentationPart.SlideParts.Count();
    }

    // Return the slide count to the previous method.
    return slidesCount;
}

// Move a slide to a different position in the slide order in the presentation.
public static void MoveSlide(string presentationFile, int from, int to)
{
    using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
    {
        MoveSlide(presentationDocument, from, to);
    }
}
// Move a slide to a different position in the slide order in the presentation.
public static void MoveSlide(PresentationDocument presentationDocument, int from, int to)
{
    if (presentationDocument == null)
    {
        throw new ArgumentNullException("presentationDocument");
    }

    // Call the CountSlides method to get the number of slides in the presentation.
    int slidesCount = CountSlides(presentationDocument);

    // Verify that both from and to positions are within range and different from one another.
    if (from < 0 || from >= slidesCount)
    {
        throw new ArgumentOutOfRangeException("from");
    }

    if (to < 0 || from >= slidesCount || to == from)
    {
        throw new ArgumentOutOfRangeException("to");
    }

    // Get the presentation part from the presentation document.
    PresentationPart presentationPart = presentationDocument.PresentationPart;

    // The slide count is not zero, so the presentation must contain slides.            
    Presentation presentation = presentationPart.Presentation;
    SlideIdList slideIdList = presentation.SlideIdList;

    // Get the slide ID of the source slide.
    SlideId sourceSlide = slideIdList.ChildElements[from] as SlideId;

    SlideId targetSlide = null;

    // Identify the position of the target slide after which to move the source slide.
    if (to == 0)
    {
        targetSlide = null;
    }
    if (from < to)
    {
        targetSlide = slideIdList.ChildElements[to] as SlideId;
    }
    else
    {
        targetSlide = slideIdList.ChildElements[to - 1] as SlideId;
    }

    // Remove the source slide from its current position.
    sourceSlide.Remove();

    // Insert the source slide at its new position after the target slide.
    slideIdList.InsertAfter(sourceSlide, targetSlide);

    // Save the modified presentation.
    presentation.Save();
}
' Count the slides in the presentation.
Public Function CountSlides(ByVal presentationFile As String) As Integer

    ' Open the presentation as read-only.
    Dim presentationDocument As PresentationDocument = presentationDocument.Open(presentationFile, False)
    Using (presentationDocument)

        ' Pass the presentation to the next CountSlide method
        ' and return the slide count.
        Return CountSlides(presentationDocument)
    End Using
End Function
' Count the slides in the presentation.
Public Function CountSlides(ByVal presentationDocument As PresentationDocument) As Integer

    ' Check for a null document object.
    If (presentationDocument Is Nothing) Then
        Throw New ArgumentNullException("presentationDocument")
    End If
    Dim slidesCount As Integer = 0

    ' Get the presentation part of the document.
    Dim presentationPart As PresentationPart = presentationDocument.PresentationPart
    If ((Not (presentationPart) Is Nothing) AndAlso (Not (presentationPart.Presentation) Is Nothing)) Then

        ' Get the Presentation object from the presentation part.
        Dim presentation As Presentation = presentationPart.Presentation
        If (Not (presentation.SlideIdList) Is Nothing) Then

            ' Get the slide count from the slide ID list.
            slidesCount = presentation.SlideIdList.Elements.Count()

        End If
    End If

    ' Return the slide count to the previous function.
    Return slidesCount
End Function
' Move a slide to a different position in the slide order in the presentation.
Public Sub MoveSlide(ByVal presentationFile As String, ByVal from As Integer, ByVal moveTo As Integer)
    Dim presentationDocument As PresentationDocument = presentationDocument.Open(presentationFile, True)

    Using (presentationDocument)
        MoveSlide(presentationDocument, from, moveTo)
    End Using

End Sub
' Move a slide to a different position in the slide order in the presentation.
Public Sub MoveSlide(ByVal presentationDocument As PresentationDocument, ByVal from As Integer, ByVal moveTo As Integer)
    If (presentationDocument Is Nothing) Then
        Throw New ArgumentNullException("presentationDocument")
    End If

    ' Use the CountSlides sample to get the number of slides in the presentation.
    Dim slidesCount As Integer = CountSlides(presentationDocument)

    ' Verify that both from and to positions are within range and different from one another.
    If ((from < 0) OrElse (from >= slidesCount)) Then
        Throw New ArgumentOutOfRangeException("from")
    End If

    If ((moveTo < 0) _
                OrElse ((from >= slidesCount) _
                OrElse (moveTo = from))) Then
        Throw New ArgumentOutOfRangeException("moveTo")
    End If

    ' Get the presentation part from the presentation document.
    Dim presentationPart As PresentationPart = presentationDocument.PresentationPart

    ' The slide count is not zero, so the presentation must contain slides. 
    Dim presentation As Presentation = presentationPart.Presentation
    Dim slideIdList As SlideIdList = presentation.SlideIdList

    ' Get the slide ID of the source slide.
    Dim sourceSlide As SlideId = CType(slideIdList.ChildElements(from), SlideId)
    Dim targetSlide As SlideId = Nothing

    ' Identify the position of the target slide after which to move the source slide.
    If (moveTo = 0) Then
        targetSlide = Nothing
    End If

    If (from < moveTo) Then
        targetSlide = CType(slideIdList.ChildElements(moveTo), SlideId)
    Else
        targetSlide = CType(slideIdList.ChildElements((moveTo - 1)), SlideId)
    End If

    ' Remove the source slide from its current position.
    sourceSlide.Remove()

    ' Insert the source slide at its new position after the target slide.
    slideIdList.InsertAfter(sourceSlide, targetSlide)

    ' Save the modified presentation.
    presentation.Save()

End Sub

Siehe auch

Referenz

Class Library Reference