c# - 是否可以用新数据更新 PowerPoint 幻灯片(在 C# 中)?

标签 c# powerpoint openxml

是否有关于如何更新 PowerPoint 幻灯片的示例(通过清除特定文本框中的文本并用新内容更新它)?

我有一份要在 PowerPoint 中生成的月度报告,所有数据都在数据库中。我正在尝试确定我是否可以通过使用一个包含三个文本框的空白 PowerPoint 模板来简单地自动生成幻灯片,并且数据将从我的 C# 代码中填充。

我会寻找的其他示例是:

  • 项目符号列表
  • 表格

如能提供正确方向的任何帮助,我们将不胜感激。我在 SOF 上看到一些类似的问题,但似乎没有一个能回答这个问题。

我认为最简单的方法是使用 OpenXML 格式 (.pptx),因为我在可能没有 PowerPoint 的网络服务器上运行。

最佳答案

很抱歉延迟这么久,希望你还在找这个。请注意,这使用 SDK - 它仅使用 System.IO.Packaging 和 Linq(和 XML Literals)。无论如何,这是要做的:

  1. 制作演示文稿。在幻灯片 3 上, 添加 4 个文本框。
  2. 在其中三个中输入文字并命名 它们是“Sample1”、“Sample2”和 “示例 3”。
  3. 在最后一个文本框中,放两行 文本,然后制作这些行 要点。将其命名为“ListSample1”。

这就是您所需要的。然后保存文件并记下路径,并更改下面的 filePath 变量以反射(reflect)演示文稿的路径。

在控制台应用程序中运行以下命令:

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# 应该能够通过一些转换工作来做同样的事情。

关于c# - 是否可以用新数据更新 PowerPoint 幻灯片(在 C# 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3903142/

相关文章:

vba - 在 Powerpoint VBA 中,如何使嵌入视频开始播放?

c# - 在 VSTO PowerPoint 中创建 map 图表

Openxml:添加的 ImagePart 未显示在 Powerpoint 中/缺少关系 ID

c# - 在 C# 中通过 OpenXML 在 word 文件中定义具有 RTL 方向的段落

c# - String[] 可以在其中保存 System.Object 吗?

c# - 使用 Linq to SQL,如何查找表中列的最小值和最大值?

c# - 如何解决 C# 中的 System.OutOfMemoryException?

c# - 数组的基本操作

vba - PowerPoint VBA 将图像添加到每张幻灯片

c# - 如何在 C# 中创建带有工作表的 excel 文件?