C#中的PowerPoint笔记

5
我想在C#中阅读PowerPoint幻灯片的注释。 以下代码段适用于我。
slide.NotesPage.Shapes[2].TextFrame.TextRange.Text

然而,这对于某些演示文稿并不起作用。然后会抛出“超出范围”的异常。

索引2的含义是什么?有其他替代方法吗?

3个回答

8

您不能假设笔记文本占位符将在任何特定索引处,甚至不能假设它具有特定名称。以下是一个简单的VBA函数,用于返回幻灯片的笔记文本占位符:

Function NotesTextPlaceholder(oSl As Slide) As Shape

Dim osh As Shape

For Each osh In oSl.NotesPage.Shapes

    If osh.Type = msoPlaceholder Then
        If osh.PlaceholderFormat.Type = ppPlaceholderBody Then
            ' we found it
            Set NotesTextPlaceholder = osh
            Exit Function
        End If
    End If

Next

结束函数


1

这意味着您正在尝试访问slide.NotesPage.Shapes集合的第三个元素。如果集合有2个或更少的元素,则会抛出异常,因为无法访问指定索引2处的元素,因为它不存在 - 如果集合没有第三个元素,则无法检索集合的第三个元素。

(索引是从零开始的,这意味着第一个元素被赋予索引0,第二个元素被赋予索引1,依此类推。因此,具有N个元素的集合的最大可能索引是N-1。)


好的,这是合乎逻辑的。有可能笔记不在第三个元素中,而在另一个元素中吗? - Julian Hinderer
请参考以下网址:http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/2d629b60-a21c-4f58-9aaf-05561917df61:“您可以使用以下代码向相应幻灯片添加演讲者说明。`Slide.NotesPage.Shapes.PlaceHolders[2]`始终代表每个[幻灯片]的SpeakerNotes框架。” - Marius Schulz

0

在尝试访问索引对象之前未进行存在性检查是很危险的,因为这可能会抛出异常。您可以使用幻灯片对象的 HasNotesPage 属性来检查幻灯片是否有备注页:

if(slide.HasNotesPage == Microsoft.Office.Core.MsoTriState.msoTrue) {

}

如果您想要一次性获取所有的注释,您可能需要使用NotesPage属性来检索包含所有注释的范围。


我的Slide类中不存在HasNotesPage...主要问题是,有些演示文稿具有NotesPage,但由于索引的原因,我无法访问它们。如果我在调试器中检查NotesPage Shapes,我会得到计数3,但我无法访问形状索引2。 - Julian Hinderer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接