3 Stimmen

Ist es möglich, eine PowerPoint-Folie mit neuen Daten zu aktualisieren (in C#)?

Gibt es Beispiele dafür, wie man eine PowerPoint-Folie aktualisieren kann (indem man den Text in einem bestimmten Textfeld löscht und ihn mit neuem Inhalt aktualisiert)?

Ich muss einen monatlichen Bericht in PowerPoint erstellen und habe alle Daten in einer Datenbank. Ich versuche festzustellen, ob ich die Folien einfach automatisch generieren kann, indem ich eine leere PowerPoint-Vorlage mit drei Textfeldern habe und die Daten von meinem C#-Code ausgefüllt werden.

Die anderen Beispiele, nach denen ich suchen würde, sind:

  • Aufzählungslisten
  • Tabellen

Für jede Hilfe, die in die richtige Richtung geht, wären wir dankbar. Ich sehe ein paar Fragen auf SOF, die ähnlich sind, aber keine scheint diese Frage zu beantworten.

Ich nehme an, dass es am einfachsten wäre, das OpenXML-Format (.pptx) zu verwenden, da ich auf einem Webserver arbeite, auf dem PowerPoint möglicherweise nicht installiert ist.

0 Stimmen

Muss es ein C#-Beispiel sein? Kann es auch vb.net sein?

0 Stimmen

@Otaku - vb.net ist in Ordnung ich kann immer konvertieren

0 Stimmen

Unter der Annahme, dass sich die Anzahl der Textfelder und die Anzahl der Aufzählungspunkte in jedem Feld nicht ändert, können Sie wahrscheinlich eine "Dummy"-PPTX mit Pseudo-Platzhaltertext erstellen, den Sie durch Live-Daten ersetzen werden. Zum Beispiel @Slide1_BulletPoint1@ oder @Slide3_TableCellR1C3@ (Tabelle auf Folie 3, die Zelle in Zeile 1, Spalte 3). Zum Aktualisieren suchen/ersetzen Sie die XML-Datei der Folie, wobei Sie die Pseudo-Platzhalter durch Ihre Live-Daten ersetzen, und speichern Sie sie dann unter einem neuen Dateinamen (damit Ihr Dummy-PPTX nicht durcheinander kommt).

3voto

Todd Main Punkte 31727

Entschuldigen Sie bitte die große Verspätung, ich hoffe, Sie suchen noch danach. Beachten Sie dies tut NICHT das SDK verwenden - es verwendet lediglich System.IO.Packaging und Linq (und XML-Literale). Wie auch immer, hier ist, was zu tun ist:

  1. Erstellen Sie eine Präsentation. Auf Folie 3, fügen Sie 4 Textboxen hinzu.
  2. Fügen Sie Text in drei von ihnen ein und benennen Sie sie "Probe1", "Probe2" und "Probe3".
  3. In das letzte Textfeld geben Sie zwei Zeilen ein Text ein und macht diese Zeilen dann zu Aufzählungspunkte. Nennen Sie es "ListSample1".

Das ist alles, was Sie brauchen. Speichern Sie dann die Datei und notieren Sie sich den Pfad, und ändern Sie die filePath Variable unten, um den Pfad Ihrer Präsentation wiederzugeben.

Führen Sie die folgenden Schritte in einer Konsolenanwendung aus:

Imports System.IO
Imports System.IO.Packaging ''# Add reference to WindowsBase for this
Imports <xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
Imports <xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
Imports <xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
Module Module1
    Public Const documentRelationshipType As String = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"
    Sub Main()
        Dim slide, document As XElement
        Dim pptPackage As Package = Nothing
        Dim slidePart, documentPart As PackagePart
        Dim filePath As String = "C:\Users\Me\Documents\visual studio 2010\Projects\FillPowerPoint\FillPowerPoint\sample.pptx"

        pptPackage = Package.Open(filePath, FileMode.Open, FileAccess.ReadWrite)
        Using pptPackage
            Dim documentRelationship As PackageRelationship = pptPackage.GetRelationshipsByType(documentRelationshipType).FirstOrDefault
            Dim documentUri As Uri = PackUriHelper.ResolvePartUri(New Uri("/", UriKind.Relative), documentRelationship.TargetUri)
            documentPart = pptPackage.GetPart(documentUri)
            document = XElement.Load(New StreamReader(documentPart.GetStream))

            Dim slideList = From e In document.<p:sldIdLst>.<p:sldId>
            Dim slideIndex As Integer = 3 ''# this is the slide number we want, 1-based
            Dim slideReference As String = slideList(slideIndex - 1).@r:id.ToString
            slidePart = pptPackage.GetPart(PackUriHelper.ResolvePartUri(documentPart.Uri, documentPart.GetRelationship(slideReference).TargetUri))
            slide = XElement.Load(New StreamReader(slidePart.GetStream))

            ''# Replace just text value in Sample1 textbox
            Dim Sample1 = From e In slide.<p:cSld>.<p:spTree>.<p:sp> Where e.<p:nvSpPr>.<p:cNvPr>.@name = "Sample1" Select e.<p:txBody>.<a:p>.<a:r>.<a:t>.SingleOrDefault
            Sample1.Value = "new text in sample 1"

            ''# Replace text and make bold inn Sample2 textbox
            Dim Sample2 = From e In slide.<p:cSld>.<p:spTree>.<p:sp> Where e.<p:nvSpPr>.<p:cNvPr>.@name = "Sample2" Select e.<p:txBody>.<a:p>.<a:r>.SingleOrDefault
            Sample2.<a:rPr>.SingleOrDefault.Add(New XAttribute("b", 1))
            Sample2.<a:t>.SingleOrDefault.Value = "new bold text in sample 2"

            ''# Replace text and make bold inn Sample2 textbox
            Dim Sample3 = From e In slide.<p:cSld>.<p:spTree>.<p:sp> Where e.<p:nvSpPr>.<p:cNvPr>.@name = "Sample3" Select e.<p:txBody>.SingleOrDefault
            Sample3.<a:p>.Remove()
            Dim newParagraphs As XElement = <placeholder>
                                                <a:p>
                                                    <a:r>
                                                        <a:rPr lang="en-US" dirty="0" smtClean="0"/>
                                                        <a:t>Sample3</a:t>
                                                    </a:r>
                                                </a:p>
                                                <a:p>
                                                    <a:r>
                                                        <a:rPr lang="en-US" smtClean="0"/>
                                                        <a:t>With a new paragraph</a:t>
                                                    </a:r>
                                                    <a:endParaRPr lang="en-US" dirty="0"/>
                                                </a:p>
                                            </placeholder>
            Sample3.SingleOrDefault.Add(newParagraphs.Elements)

            ''# Create a new list of bullets
            Dim s() As String = {"Bullet 1", "Bullet 2", "Bullet 3"}
            Dim ListSample1 = From e In slide.<p:cSld>.<p:spTree>.<p:sp> Where e.<p:nvSpPr>.<p:cNvPr>.@name = "ListSample1" Select e.<p:txBody>.SingleOrDefault
            ListSample1.<a:p>.Remove()
            ListSample1.SingleOrDefault.Add(From e In s Select <a:p>
                                                                   <a:pPr marL="285750" indent="-285750">
                                                                       <a:buFont typeface="Arial" pitchFamily="34" charset="0"/>
                                                                       <a:buChar char="•"/>
                                                                   </a:pPr>
                                                                   <a:r>
                                                                       <a:rPr lang="en-US" dirty="0" smtClean="0"/>
                                                                       <a:t><%= e %></a:t>
                                                                   </a:r>
                                                               </a:p>)
            slide.Save(slidePart.GetStream)
        End Using
    End Sub
End Module

Sorry, ich weiß, dies ist stark auf VB und XML-Literale gewichtet, aber C# sollte in der Lage sein, die gleiche Sache mit einigen Konvertierung Arbeit zu tun.

2voto

amurra Punkte 14781

Ja, das ist möglich und aquí ist eine Anleitung, wie man es online macht. Sie haben auch den Beispielcode für das Projekt in diesem Blog, die helfen sollten.

0 Stimmen

Der Link funktioniert nicht mehr, und die Wayback Machine hat keinen Snapshot. Das ist das Problem mit reinen Link-Antworten: Sie verrotten mit der Zeit, und manchmal können die Informationen, auf die sie verweisen, nicht wiederhergestellt werden.

1voto

Wil Punkte 514

Wahrscheinlich sollten Sie sich die Office Automation API ansehen. Damit können Sie PowerPoint-Dokumente programmatisch ändern, erstellen usw.

Dieses Dokument bezieht sich auf eine ältere Version von PowerPoint, aber das gleiche Verfahren funktioniert auch bei neueren Versionen. http://support.microsoft.com/default.aspx?scid=kb;DE-US;303718

Wort der Warnung aber, wenn Sie Office-Automation-Api verwenden, stellen Sie sicher, dass Sie es gegen die niedrigste Version von Office bauen, die Sie mit diesem Tool unterstützen möchten, die Sie in c# erstellen.

1 Stimmen

Ich würde davon ausgehen, dass ich die OpenXML-API verwenden würde, da dies nicht erfordert, dass ich Office auf dem Rechner installiert habe.

0 Stimmen

Der Link funktioniert nicht mehr, und die Wayback Machine hat keinen Snapshot. Das ist das Problem mit reinen Link-Antworten: Sie verrotten mit der Zeit, und manchmal können die Informationen, auf die sie verweisen, nicht wiederhergestellt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X