提取两个富文本字段附件的文档中(Extracting attachments from two ri

2019-10-18 03:43发布

我使用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它可以用于检查它的附件存在性能。

这将是一个出路呢?

Answer 1:

试试这个:

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

您可能还需要冗余的逻辑提取到一个子程序。



Answer 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


Answer 3:

更新答案

而不是访问EmbeddedObjects直接在财产forall ,将其分配给一个variant ,并首先检查它使用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


文章来源: Extracting attachments from two rich text fields in a document