【发布时间】:2011-03-08 19:07:40
【问题描述】:
我有一张使用 Office 2010(和 2007)构建的 PowerPoint 幻灯片,我需要以编程方式从中提取文本。我猜 Office 在某个地方创建了一个 xml 文件,其中可能包含我需要的所有文本。
有没有办法做到这一点,我该如何解决?
我有可用于工具的 VS2010、SharePoint Designer 2007。
谢谢,
理庄
【问题讨论】:
标签: xml powerpoint
我有一张使用 Office 2010(和 2007)构建的 PowerPoint 幻灯片,我需要以编程方式从中提取文本。我猜 Office 在某个地方创建了一个 xml 文件,其中可能包含我需要的所有文本。
有没有办法做到这一点,我该如何解决?
我有可用于工具的 VS2010、SharePoint Designer 2007。
谢谢,
理庄
【问题讨论】:
标签: xml powerpoint
是的,使用 Linq-to-XML 有一个艰难的方法,一种简单甚至更简单的方法。请注意,我不使用 Open XML SDK - 我只是使用带有 XML Literals 和 System.IO.Packaging 的 VB.NET。您当然可以使用 SDK、C# 等以更复杂的方式执行此操作 - 取决于您的环境/偏好。
这是你将如何做#2(简单的方法):
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\Todd\Desktop\yourpresentation.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>
For i = 0 To slideList.Count - 1
Dim slideReference As String = slideList(i).@r:id.ToString
slidePart = pptPackage.GetPart(PackUriHelper.ResolvePartUri(documentPart.Uri, documentPart.GetRelationship(slideReference).TargetUri))
slide = XElement.Load(New StreamReader(slidePart.GetStream))
Dim rawText = From e In slide...<a:t>
For Each t In rawText
Console.WriteLine(t.Value)
Next
Next
End Using
Console.ReadLine()
End Sub
End Module
【讨论】: