【问题标题】:Extracting attachments from two rich text fields in a document从文档中的两个富文本字段中提取附件
【发布时间】:2013-05-23 13:42:08
【问题描述】:

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

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 有,那么上面的代码会在语句ForAll o In richTextItem.Embeddedobjects 上抛出Type mismatch 的错误,反之亦然,因为富文本中没有嵌入对象物品。 doc.Embeddedobjects 也不起作用,因为附件存在于富文本项目中。而NotesRichTextItem 类没有Hasembedded 属性,可用于检查其中是否存在附件。

有什么办法可以解决这个问题?

【问题讨论】:

    标签: lotus-notes lotusscript


    【解决方案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
    

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

    【讨论】:

    • 谢谢肯!我想我可能应该开始更详细地查看NotesRichTextXXXXX 类:)
    【解决方案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
    

    【讨论】:

    • 这是我的原始代码。但是我的一些文件名包含外来字符(准确地说是中文),因此变量sAttachmentName 将无法正确存储它们并最终在ExtractFile 函数上引发错误。但感谢您的代码。希望对其他人有所帮助。
    【解决方案3】:

    更新答案

    不要直接在forall 中访问EmbeddedObjects 属性,而是将其分配给variant 并首先检查它,使用TypeName 函数确保返回的值确实是@987654325 的数组@对象,像这样:

    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
    

    【讨论】:

    • 对不起,代码 sn -p 抛出与Type mismatch 相同的错误。
    • 嗯...在Java中我用过这个:theObjects = rtBody.getEmbeddedObjects(); if ( (theObjects != null) && (!theObjects.isEmpty()) ) { for (Iterator iter = theObjects.iterator(); iter.hasNext();) { ... 等等。所以我知道我有我猜这是正确的想法,但不是正确的语法。看看我是否有任何等效的 LotusScript 代码。
    • 啊哈!我在一些生产代码中发现了一个 LotusScript 构造,所以我知道它已经过很好的测试。这不仅仅是测试 Nothing 或使用 DataType 函数(尽管我相信后者会起作用)。它使用 TypeName 函数。更新我的答案,记录在案......
    • 您的代码需要更正。应该是If TypeName(objectArray) = "NOTESEMBEDDEDOBJECT( )" Then。我将 &lt;&gt; 替换为 =。并且代码完美运行。此外,如果您可以删除旧代码会更好,因为它可能会使其他人感到困惑。谢谢:)
    • 我进行了更正。感谢您指出。我已经删除了不起作用的代码。 (不过,我确实喜欢保留一些东西作为记录,即使是我的错误。但你说得对,它可能会使人们感到困惑。
    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 1970-01-01
    • 2014-11-09
    • 2021-06-19
    相关资源
    最近更新 更多