从文档中的两个富文本字段中提取附件

时间:2013-05-23 13:42:08

标签: lotus-notes lotusscript

我使用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 mismatch上引发ForAll o In richTextItem.Embeddedobjects错误,反之亦然在该富文本项中没有嵌入对象。另外doc.Embeddedobjects不起作用,因为附件存在于富文本项中。并且NotesRichTextItem类没有Hasembedded属性,可用于检查其中是否存在附件。

这会有什么办法?

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:2)

如果你想要提取文件的所有附件,这是一个简短的代码,无论它们存储在何处:

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

答案 2 :(得分:1)

更新回答

不是直接在EmbeddedObjects中访问forall属性,而是将其分配给variant并首先检查它,使用TypeName函数确保返回value实际上是一个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