Можно ли обновить слайд PowerPoint новыми данными (в C #)? - PullRequest
3 голосов
/ 11 октября 2010

Существуют ли примеры того, как обновить слайд PowerPoint (очистив текст в определенном текстовом поле и обновив его новым содержимым)?

У меня есть ежемесячный отчет для генерации в PowerPoint, и яесть все данные в базе данных.Я пытаюсь определить, могу ли я просто автоматически сгенерировать слайды, имея пустой шаблон PowerPoint с тремя текстовыми полями, и данные будут заполняться из моего кода C #.

Другие примеры, которые я бы искал:

  • маркированные списки
  • таблицы

Любая помощь в правильном направлении приветствуется.Я вижу несколько вопросов по SOF, которые похожи, но ни один из них не отвечает на этот вопрос.

Я предполагаю, что проще всего было бы использовать формат OpenXML (.pptx), так как я работаю на веб-сервере, который может неесть PowerPoint на машине.

Ответы [ 3 ]

3 голосов
/ 22 декабря 2010

Извините за действительно позднюю задержку, надеюсь, вы все еще ищете это. Обратите внимание, что НЕ использует SDK - он просто использует System.IO.Packaging и Linq (и литералы XML). В любом случае, вот что нужно сделать:

  1. Создать презентацию. На слайде 3 добавить 4 текстовых поля.
  2. Поместите текст в три из них и назовите их "Sample1", "Sample2" и "Sample3".
  3. В последнем текстовом поле поставить две строки текста, а затем делает эти строки отверстия от пуль. Назовите его «ListSample1».

Это все, что тебе нужно. Затем сохраните файл и запишите путь и измените переменную filePath ниже, чтобы отразить путь вашей презентации.

Запустите приведенное ниже в консольном приложении:

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

Извините, я знаю, что это сильно зависит от литералов VB и XML, но C # должен уметь делать то же самое с некоторой работой по конвертации.

2 голосов
/ 21 октября 2010

Да, это возможно, и здесь - это учебное пособие о том, как сделать это онлайн. В этом блоге также есть пример кода для проекта, который должен помочь.

1 голос
/ 11 октября 2010

Возможно, вы захотите взглянуть на API автоматизации Office. Позволит вам программно изменять, создавать и т. Д. Документы PowerPoint.

Этот документ предназначен для более старой версии PowerPoint, но тот же процесс работает для более новых версий. http://support.microsoft.com/default.aspx?scid=kb;EN-US;303718

Слово предупреждения, хотя, если вы используете API автоматизации офиса, убедитесь, что вы строите его в соответствии с самой низкой версией офиса, которую вы хотите поддерживать с помощью этого инструмента, который вы создаете в c #.

...