Последняя активность 1741317080

利用visual basic将PPT中的所有文本提取出来

main.bas Исходник
1Sub ExportText()
2 Dim oPres As Presentation
3 Dim oSlides As Slides
4 Dim oSld As Slide 'Slide Object
5 Dim oShp As Shape 'Shape Object
6 Dim iFile As Integer 'File handle for output
7 iFile = FreeFile 'Get a free file number
8 Dim PathSep As String
9 Dim FileNum As Integer
10 Dim sTempString As String
11 Dim fd() As String
12
13 #If Mac Then
14 PathSep = "/"
15 #Else
16 PathSep = "\"
17 #End If
18
19 fd = Split(FileDialogOpen, vbLf)
20 If Left(fd(0), 1) = "-" Then
21 Debug.Print "Canceled"
22 Exit Sub
23 End If
24
25 For n = LBound(fd) To UBound(fd)
26 Set oPres = Presentations.Open(FileName:=fd(n), ReadOnly:=msoTrue, WithWindow:=msoTrue)
27 Set oSlides = oPres.Slides
28
29 FileNum = FreeFile
30
31 'Open output file
32 ' NOTE: errors here if file hasn't been saved
33 Open oPres.Path & PathSep & oPres.Name & ".txt" For Output As FileNum
34
35 num_slides = oPres.Slides.Count
36
37 For i = 1 To num_slides
38 Set oSld = oPres.Slides(i)
39 Print #iFile, "Slide:" & vbTab & CStr(oSld.SlideNumber)
40 For Each oShp In oSld.Shapes
41 'Check to see if shape has a text frame and text
42 If oShp.HasTextFrame And oShp.TextFrame.HasText Then
43 If oShp.Type = msoPlaceholder Then
44 Select Case oShp.PlaceholderFormat.Type
45 Case Is = ppPlaceholderTitle, ppPlaceholderCenterTitle
46 Print #iFile, "标题:" & vbTab & oShp.TextFrame.TextRange
47 Case Is = ppPlaceholderBody
48 Print #iFile, "正文:" & vbTab & oShp.TextFrame.TextRange
49 Case Is = ppPlaceholderSubtitle
50 Print #iFile, "副标题:" & vbTab & oShp.TextFrame.TextRange
51 Case Else
52 Print #iFile, "其他占位符:" & vbTab & oShp.TextFrame.TextRange
53 End Select
54 Else
55 Print #iFile, vbTab & oShp.TextFrame.TextRange
56 End If ' msoPlaceholder
57 Else ' it doesn't have a textframe - it might be a group that contains text so:
58 If oShp.Type = msoGroup Then
59 sTempString = TextFromGroupShape(oShp)
60 If Len(sTempString) > 0 Then
61 Print #iFile, sTempString
62 End If
63 ElseIf oShp.Type = msoSmartArt Then
64 sTempString = TextFromSmartArtNode(oShp.SmartArt.Nodes, 0)
65 If Len(sTempString) > 0 Then
66 Print #iFile, sTempString
67 End If
68 End If
69 End If ' Has text frame/Has text
70 Next oShp
71
72 Print #iFile, vbCrLf
73 Next i
74 Close #iFile
75 oPres.Close
76 Next n
77
78 MsgBox "已处理 " & UBound(fd) - LBound(fd) + 1 & " 个文件"
79End Sub
80
81Function TextFromGroupShape(oSh As Shape) As String
82' Returns the text from the shapes in a group
83' and recursively, text within shapes within groups within groups etc.
84
85 Dim oGpSh As Shape
86 Dim sTempText As String
87
88 If oSh.Type = msoGroup Then
89 For Each oGpSh In oSh.GroupItems
90 With oGpSh
91 If .Type = msoGroup Then
92 sTempText = sTempText & TextFromGroupShape(oGpSh)
93 Else
94 If .HasTextFrame Then
95 If .TextFrame.HasText Then
96 sTempText = sTempText & "(Gp:) " & .TextFrame.TextRange.Text & vbCrLf
97 End If
98 End If
99 End If
100 End With
101 Next
102 End If
103
104 TextFromGroupShape = sTempText
105
106NormalExit:
107 Exit Function
108
109Errorhandler:
110 Resume Next
111
112End Function
113
114
115Function TextFromSmartArtNode(oSh As SmartArtNodes, depth As Long) As String
116' Returns the text from the shapes in a SmartArt shape recursively
117
118 Dim sTempText As String
119 For i = 1 To oSh.Count
120 With oSh(i)
121 If .TextFrame2.TextRange.Text <> "" Then
122 If depth = 0 Then
123 sTempText = sTempText & "(SmartArt:)" & .TextFrame2.TextRange & vbCrLf
124 Else
125 sTempText = sTempText & Space(depth * 4) & .TextFrame2.TextRange & vbCrLf
126 End If
127 sTempText = sTempText & TextFromSmartArtNode(.Nodes, depth + 1)
128 End If
129 End With
130 Next i
131
132 TextFromSmartArtNode = sTempText
133
134End Function
135
136
137Function FileDialogOpen() As String
138
139 #If Mac Then
140 ' 默认路径
141 mypath = MacScript("return (path to desktop folder) as String")
142
143 sMacScript = "set applescript's text item delimiters to "","" " & vbNewLine & _
144 "try " & vbNewLine & _
145 "set theFiles to (choose file of type {""ppt"", ""pptx""}" & _
146 "with prompt ""请选择要处理的一个或多个 PowerPoint 文档"" default location alias """ & _
147 mypath & """ multiple selections allowed true)" & vbNewLine & _
148 "set applescript's text item delimiters to """" " & vbNewLine & _
149 "on error errStr number errorNumber" & vbNewLine & _
150 "return errorNumber " & vbNewLine & _
151 "end try " & vbNewLine & _
152 "repeat with i from 1 to length of theFiles" & vbNewLine & _
153 "if i = 1 then" & vbNewLine & _
154 "set fpath to POSIX path of item i of theFiles" & vbNewLine & _
155 "else" & vbNewLine & _
156 "set fpath to fpath & """ & vbNewLine & _
157 """ & POSIX path of item i of theFiles" & vbNewLine & _
158 "end if" & vbNewLine & _
159 "end repeat" & vbNewLine & _
160 "return fpath"
161
162 FileDialogOpen = MacScript(sMacScript)
163
164 #Else
165 With Application.FileDialog(msoFileDialogOpen)
166 .AllowMultiSelect = True
167 .Title = "请选择要处理的一个或多个 PowerPoint 文档"
168 .Filters.Add "PowerPoint 文档", "*.ppt; *.pptx", 1
169 If .Show = -1 Then
170 FileDialogOpen = ""
171 For i = 1 To .SelectedItems.Count
172 If i = 1 Then
173 FileDialogOpen = .SelectedItems.Item(i)
174 Else
175 FileDialogOpen = FileDialogOpen & vbLf & .SelectedItems.Item(i)
176 End If
177 Next
178 Else
179 FileDialogOpen = "-"
180 End If
181 End With
182
183 #End If
184End Function
185
186