Lotus Notes 資料庫中附件的批量導出

火星人 @ 2014-03-04 , reply:0


Lotus Notes 資料庫中附件的批量導出

Notes 資料庫是一種文檔型資料庫,其中文檔的富文本域中往往嵌入許多附件(如 Word 文檔、PDF 文檔、Excel 文檔等)。

這些附件常常是工作的重要資料,用戶時常需要導出這些附件到其他系統中進行處理,如圖 1 所示,用戶可以將所選中的附件或者該文檔中的所有附件保存到本地系統。有時用戶還需要導出多個文檔中的附件,如圖 2 所示,每個文檔中都嵌入了附件,用戶需要將所選中的所有文檔中的附件全部導出。

在這種情況下,用戶只能手動逐個打開各個文檔並將附件導出到系統本地,然後再將附件導入到其他系統中,這大大降低了效率。下文分析了若干附件批量導出的需求以及相應的解決方案。
圖 1. Notes 文檔中附件的導出
http://www.ibm.com/developerworks/cn/lotus/notes-attachment-export/image001.png

圖 2. 多 Notes 文檔中附件的導出
http://www.ibm.com/developerworks/cn/lotus/notes-attachment-export/image002.png


附件批量導出的需求及其解決方案
1. 導出到本地系統中
舉一例說明。某公司用 Excel 表單作為公司的報表管理系統,它們的業務流程是:首先,公司定期下發 Excel 報表模板供全公司使用。然後,基層的業務人員在每個周期的期末要定期填寫報表,即在模板裡面填寫數據,然後新建一個 Notes 文檔,把這個 Excel 文件嵌入到這個文檔中提交。

最後,公司的信息收集人員需要從每個 Notes 文檔中導出 Excel 文件,再對這些報表進行手工匯總和處理。顯然,如果業務人員數量大,那麼 Notes 文檔就會很多,這種手工導出附件的方式最終將不堪重負。本文開發了一個 SaveToLocalSystem Agent 程序,它可以將 Notes 資料庫中被選中的文檔中的附件批量導出到指定的系統目錄下。

這個 agent 是用 LotusScript 編寫的,見代碼清單 1,也可以使用 Java API 編寫。本文附件 attachment.nsf 中包含 SaveToLocalSystem Agent 程序及測試數據。
清單 1. 多 Notes 文檔中附件批量導出到本地系統

                                 Type BROWSEINFO  hOwner As Long  pidlRoot As Long  pszDisplayName As String  lpszTitle As String  ulFlags As Long  lpfn As Long  lParam As Long  iImage As Long  End Type  Const BIF_RETURNONLYFSDIRS = &H1  Const BIF_DONTGOBELOWDOMAIN = &H2  Const BIF_STATUSTEXT = &H4  Const BIF_RETURNFSANCESTORS = &H8  Const BIF_BROWSEFORCOMPUTER = &H1000  Const BIF_BROWSEFORPRINTER = &H2000  Const MAX_PATH = 260  Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDListA"      (ByVal pidl As Long, ByVal pszPath As String) As Long  Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolderA"      (lpBrowseInfo As BROWSEINFO) As Long  Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long)  Declare Function GetDesktopWindow Lib "user32" () As Long  Sub Initialize()     Dim session As New NotesSession  Dim db As NotesDatabase  Dim collection As NotesDocumentCollection  Dim doc As NotesDocument    Dim rtitem As Variant  Dim NotesItem As NotesItem     Dim bi As BROWSEINFO  Dim pidl As Long  Dim path As String  Dim pos As Integer     bi.hOwner = GetDesktopWindow()  bi.pidlRoot = 0&  bi.lpszTitle = "Select directory to save the attachments" bi.ulFlags = BIF_RETURNONLYFSDIRS  pidl = SHBrowseForFolder(bi)  path = Space$(MAX_PATH)  If SHGetPathFromIDList(ByVal pidl, ByVal path) Then  pos = InStr(path, Chr$(0))  End If  Call CoTaskMemFree(pidl)    Set db = session.CurrentDatabase    Set collection = db.UnprocessedDocuments    Set doc = collection.GetFirstDocument()     While Not(doc Is Nothing)        // 此處假定附件是嵌入在 Body 域當中,當然也可以循環文檔所有的域,然後對於富文本域進行處理,提取附件           Set rtitem = doc.GetFirstItem( "Body" )      If ( rtitem.Type = RICHTEXT ) Then           ForAll o In rtitem.EmbeddedObjects                                 If ( o.Type = EMBED_ATTACHMENT ) Then                   Call o.ExtractFile( Left(path, pos - 1) & "\" & o.Name  )           End If                   End ForAll      End If     Set doc = collection.GetNextDocument(doc)    Wend  End Sub


使用操作說明:將 SaveToLocalSystem Agent 添加到任意 Notes 資料庫中,然後在任意的 view 中選擇需要導出附件的文檔,再點擊菜單 Actions 當中的 SaveToLocalSystem,這時會彈出一個對話框來選擇存儲目錄,如圖 3 所示,選好後點擊確定,所選文檔中的附件就會被導出到所選目錄下了。
圖 3. 多 Notes 文檔中附件批量導出到本地系統
http://www.ibm.com/developerworks/cn/lotus/notes-attachment-export/image003.png

2. 匯總到 Notes 文檔中
對於上面的例子,管理員也可能需要將不同文檔中的附件匯總到該 Notes 資料庫的一個文檔中,又或者匯總到其他資料庫的一個文檔中。本文開發了另外一個 SaveToNotesDatabase Agent,它可以在指定的 Notes 資料庫中新建一個文檔,並將選中的文檔中的附件批量匯總到該文檔中。這個 Agent 也是用 LotusScript 編寫的,見代碼清單 2,也可以使用 Java API 編寫。本文附件 attachment.nsf 中包含 SaveToNotesDatabase Agent 程序及測試數據。
清單 2. 多 Notes 文檔中附件批量匯總到 Notes 文檔中

                                 Sub Initialize()       Dim session As New NotesSession    Dim db As NotesDatabase    Dim collection As NotesDocumentCollection    Dim doc As NotesDocument      Dim rtitem As Variant    Dim doc2 As NotesDocument    Dim NotesRichTextItem As NotesRichTextItem    Dim NotesItem As NotesItem    Dim workspace As New NotesUIWorkspace    Dim result As Variant     result = workspace.Prompt( 13, "Choose database to save the attachments", "")       Set db = session.CurrentDatabase    Set collection = db.UnprocessedDocuments    Set doc = collection.GetFirstDocument()       If result(0) = "" & result(1) = db.Filename Then          Set doc2 = db.Createdocument()     Else          Dim db2 As NotesDatabase          Set db2 = session.GetDatabase( result(0), result(1), False )          Set doc2 = db2.Createdocument()    End If       // 此處假定新建文檔基於表單「Main Topic」,並將附件匯總到 Body 富文本域中   doc2.Form = "Main Topic"   doc2.Subject = "New Attachment"   Set NotesRichTextItem = New NotesRichTextItem( doc2, "Body" )       While Not(doc Is Nothing)              // 此處假定附件是嵌入在 Body 域當中,當然也可以循環文檔所有的域,然後對於富文本域進行處理,提取附件     Set rtitem = doc.GetFirstItem( "Body" )      If ( rtitem.Type = RICHTEXT ) Then      ForAll o In rtitem.EmbeddedObjects         If ( o.Type = EMBED_ATTACHMENT ) Then              Call o.ExtractFile( "c:\temp\" & o.Name )          Call notesRichTextItem.EmbedObject( EMBED_ATTACHMENT ,"", "c:\temp\" & o.Name)          Kill "c:\temp\" & o.Name         End If              End ForAll       End If    Set doc = collection.GetNextDocument(doc)    Wend       Call doc2.Save(False, True )       End Sub


使用操作與上面類同,只是這次彈出的對話框是用來選擇存儲資料庫的,如圖 4 所示,可以選擇本地的 Notes 資料庫,也可以選擇其他伺服器上的 Notes 資料庫,選好後點擊確定,然後 SaveToNotesDatabase 會在該資料庫中新建一個文檔,並將所選文檔中的附件匯總到該文檔中。
圖 4. 多 Notes 文檔中附件批量匯總到 Notes 文檔中
http://www.ibm.com/developerworks/cn/lotus/notes-attachment-export/image004.png

3. 導出到 Lotus Quickr 場所中
作為新一代的文檔協作平台,Lotus Quickr 提供了功能強大的文檔管理功能,並為客戶提供了一系列功能強大的連接器(Connectors),這些連接器可以以插件的形式被安裝到常用的桌面應用軟體中,從而實現基於這些軟體對 Quickr 伺服器中文檔數據的訪問。另外,Quickr 為用戶提供了一套完備的文檔管理 API 以供用戶定製和擴展,即 Content Public API,其中包括 WebService API 和 REST API 兩部分。

在安裝了 Quickr Notes 連接器后,用戶可以將 Notes 資料庫中的附件添加到 Quickr 場所中,如圖 1 所示,這與保存到本地系統的情況類似。如果需要添加多個文檔中的附件時,同樣需要依次打開各個文檔,將其中的附件添加到某個 Quickr 場所中。

那麼與上面兩種情況類似,也可以開發一個 Agent 程序,將所有選中的文檔中的附件批量添加到某個 Quickr 場所中。這個 Agent 可以使用 Java API 編寫以獲取附件,並使用 WebService API 編寫程序將獲取的附件添加到 Quickr 的某個場所中。
《解決方案》

在我做的多數項目中,用戶的需求都是導出到本地。
郵件正文和附件分別導出。以便用戶備份和脫離notes系統查看。
《解決方案》

希望對附件單獨處理的話,IBM的ICC產品提供了備份,存檔等一系列服務




[火星人 via ] Lotus Notes 資料庫中附件的批量導出已經有407次圍觀

http://www.coctec.com/docs/service/show-post-15292.html