1

我正在使用 LotusScript 将文档中的附件提取到用户的本地计算机。该文档有两个富文本字段Body1Body2而且很多时候只有其中一个有附件。我正在使用以下代码片段:

Dim doc As NotesDocument
Dim richTextItem As NotesRichTextItem
.....
.....
If doc.Hasembedded Then
    Set richTextItem = doc.Getfirstitem("Body1")
    ForAll o In richTextItem.Embeddedobjects
        Call o.ExtractFile(dirName + "\" + o.Name)
    End ForAll

    Set richTextItem = doc.Getfirstitem("Body2")
    ForAll o In richTextItem.Embeddedobjects
        Call o.ExtractFile(dirName + "\" + o.Name)
    End ForAll
End If

问题在于,如果其中Body1没有附件并且Body2确实如此,则上述代码会引发Type mismatchon 语句错误,ForAll o In richTextItem.Embeddedobjects反之亦然,因为该富文本项中没有嵌入对象。也doc.Embeddedobjects不起作用,因为附件存在于富文本项目中。并且NotesRichTextItem该类没有Hasembedded可用于检查其中是否存在附件的属性。

有什么办法摆脱这种情况?

4

3 回答 3

3

试试这个:

Dim doc As NotesDocument
.....
.....
If doc.Hasembedded Then
    Set richTextItem = doc.Getfirstitem("Body1")
    Set rtnav = richTextItem.CreateNavigator

    If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
        Do
            Set att = rtnav.GetElement()
            filepath$ = dirName + "\" + att.Source
            Call att.ExtractFile(filepath$)      
        Loop While rtnav.FindNextElement()
    End If

    Set richTextItem = doc.Getfirstitem("Body2")
    Set rtnav = richTextItem.CreateNavigator

    If rtnav.FindFirstElement(RTELEM_TYPE_FILEATTACHMENT) Then
        Do
            Set att = rtnav.GetElement()
            filepath$ = dirName + "\" + att.Source
            Call att.ExtractFile(filepath$)      
        Loop While rtnav.FindNextElement()
    End If
End If

您可能还希望将冗余逻辑提取到子例程中。

于 2013-05-23T14:28:33.617 回答
3

如果您想提取文档的所有附件,无论它们存储在哪里,这是一个短代码:

Dim vAttachmentList As Variant
vAttachmentList = Evaluate("@AttachmentNames", doc)
If vAttachmentList(0) <> "" then
    ForAll sAttachmentName In vAttachmentList
        Call doc.Getattachment(sAttachmentName).ExtractFile(dirName + "\" + sAttachmentName)
    End ForAll
End if
于 2013-05-23T18:08:02.027 回答
1

更新的答案

与其EmbeddedObjects直接在 中访问属性forall,不如将其分配给 avariant并首先检查它,使用该TypeName函数确保返回的值确实是一个NotesEmbeddedObject对象数组,如下所示:

dim objectArray as variant
If doc.Hasembedded Then
    Set richTextItem = doc.Getfirstitem("Body1")
    Set objectArray = richTextItem.Embeddedobjects
    If TypeName(objectArray) = "NOTESEMBEDDEDOBJECT( )" Then
        ForAll o In objectArray
            Call o.ExtractFile(dirName + "\" + o.Name)
        End ForAll
    End If
End If
于 2013-05-23T15:43:42.773 回答