lotus notes 数据库中附件的批量导出 2

Lotus Notes 数据库中附件的批量导出

Lotus Notes 数据库是一种文档型数据库,其中文档的富文本域中往往嵌入许多附件(如 Word 文档、PDF 文档、Excel 文档等)。用户时常需要将这些附件导出到其他系统中进行使用处理。然而当需要导出许多文档中的附件时,只能手动逐个打开各个文档并将附件导出,然后再将附件导入到其他系统中,那么,当附件数量很大时则会大大降低效率。本文从用户角度出发,分析了若干附件批量导出的需求并给出了相应的解决方案。

引言

Notes 数据库是一种文档型数据库,其中文档的富文本域中往往嵌入许多附件(如 Word 文档、PDF 文档、Excel 文档等)。这些附件常常是工作的重要资料,用户时常需要导出这些附件到其他系统中进行处理,如图 1 所示,用户可以将所选中的附件或者该文档中的所有附件保存到本地系统。有时用户还需要导出多个文档中的附件,如图 2 所示,每个文档中都嵌入了附件,用户需要将所选中的所有文档中的附件全部导出。在这种情况下,用户只能手动逐个打开各个文档并将附件导出到系统本地,然后再将附件导入到其他系统中,这大大降低了效率。下文分析了若干附件批量导出的需求以及相应的解决方案。

图 1. Notes 文档中附件的导出

图 2. 多 Notes 文档中附件的导出

回页首

附件批量导出的需求及其解决方案

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 文档中附件批量导出到本地系统

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 文档中

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 数据库中附件批量导出的需求及相应的解决方法,并给出了前两种解决方案的具体实现代码。

在近二十年间,Lotus 的一些客户往往都积累了大量的 Domino 应用,并且大多都在稳定的运行中。但是,随着新兴技术的不断涌现,这些企业迫切的需要重用这些已有的 IT 资产,最大程度地分析和挖掘其中存储的宝贵数据,并期望和其它新兴的技术进行有效的集成。除了上述三种需求外,用户还可能将附件批量导入到其他一些系统中,比如 FileNet 及一些非结构化数据库等。如果读者有兴趣,可以参考本文的方法来实现其他 Agent,使用相应的 API 将附件批量导入到其他系统中。

出处:

http://www.ibm.com/developerworks/cn/lotus/notes-attachment-export/

时间: 2024-08-07 00:09:37

lotus notes 数据库中附件的批量导出 2的相关文章

lotus notes 数据库中附件的批量导出

Public Class getAllNotesEmObject'-------------------------------------------------------------------'******功能: 可以在视图中直接提取文档中RTF域附件的类 *******'-------------------------------------------------------------------    Private filenum As Integer    Private

用C# ASP.net将数据库中的数据表导出到Excel中

需要用到组件GridView和一个button即可. 给GridView添加一个数据源, 选择你想要的数据库中的表的字段,添加成功后GridView中就显示数据. 再添加一个button,双击控件添加相对应的功能代码 功能代码如下: protected void Button1_Click(object sender, EventArgs e) { string FileName = "得分表 " + DateTime.Now + ".xls"; Response.

如何实现EndNote中的PDF批量导出

如果在EndNote数据库中已建立大量的参考文献,且每条文献都有PDF文件对应,怎样将需要的某十几条甚至几十条参考文献对应的PDF文件从数据库导出另存在新建的文件夹 1. 按住“Ctrl”键,逐条选中所有需要导出pdf的文献. 2. 右键,“Copy Reference To”—“New Library...”  选中路径保存在电脑桌面,这样就生成了一个文件“My EndNote Library”和一个文件夹“My EndNote Library.Data” 3. 打开文件夹“My EndNot

Android数据库中数据文件的导出与查看

当Android开发过程中涉及到数据库的操作,我们通常需要将App的数据库文件(即*.db文件)导出查看,以验证对数据库的增删改查是否正确. 由于真机在没有root的情况下,没有权限访问受保护的数据存储区域,所以为了简单起见,可以选择在模拟器上进行数据文件的导出工作.本文用来验证 一个ContentProvider示例是否成功的进行了数据库插入操作,开发工具为Eclipse ADT(Android API 18),详细的步骤如下:  (1)首先New一个模拟器,具体步骤如下图所示(红框标出操作选

SQL大圣之路笔记——把数据库中表里的数据导出成Excel(Copy时,会因分隔符问题导致许多数据存放在一个单元格中)

1.选中DB, 右击选择"Tasks",选中"Export Data" 点击. 2.点击"Next", Authentication 选择使用 "Windows 用户名认证" or "SQL Server 用户名,密码认证",点击"Next".    3.保存文件格式:"Excel", 选择保存文件的路径.Excel 版本,点击"Next".-&g

安装sqoop,并将Mysql中的表数据导出到HDFS下的文本文件

首先是安装mysql数据库.使用 sudo apt-get install mysql-server命令即可安装完成.然后进行表的创建和插入数据.如图. 然后下载sqoop和连接mysql数据库的jar包.接下来是安装sqoop.首先是配置sqoop-env.sh文件.如图. 然后将config-sqoop文件中不需要检查的注释掉.如图. 然后接下来是将sqoop-1.4.4.jar包和连接mysql的jar包copy到hadoop目录下的lib目录中,同时把hadoop-core-1.2.1.

把QQ聊天记录插入数据库中

最近在做毕设,其中一个环节是分析qq聊天记录,在分析之前需要先把qq聊天记录导出,然后存入数据库中,qq聊天记录导出后是文本文档,导出方式: 1.登录qq后,点击任意一个好友,查看与他的聊天记录,点击聊天记录界面的小喇叭图标. 2.点击小喇叭图标后就可以选择自己要导出的聊天记录了,在要导出的人名或者群名上右键单击,选择导出聊天记录,导出格式为文本文档. 导出的文本文档格式性非常强,看下图: 我们大致分析一下这个格式,最上面那几行说明性的文字直接删去,主要看聊天记录部分,先是日期,然后一个空格,然

MySQL数据库批量修改数据库中的表

问题:今天工作遇到这样一个问题,需要把数据库中的所有表,每个表加入四个字段,如果表少,我们可以手动去添加或者修改,如果是成千上百万张表的话,我们如何去修改,现记录下来. 解决方法: 找到数据库的建模资料,就是PDM文件.发个截图 下面我们就要用一个工具了,就是powerdesign,我们将用这个工具批量修改数据库表中的字段.需要用vb脚本. 我们打开powerdesign,点开脚本运行栏,方法,工具--如图 点击后的运行脚本框如下写好的脚本放在上面运行即可. vb语法 Option Explic

Extjs4.0+HSSFWorkbook+SpringMVC实现将数据库中的记录导出到本地Excel格式

Extjs4.0+HSSFWorkbook+SpringMVC实现将数据库中的记录导出到本地Excel格式 自己封装的JS类Share.js var Share = {}; Share.ExportByExcel = function(url) { var appWindow = Share.getWin(); appWindow.open(url); appWindow.focus(); }; 调用的前端js buttons : [{ text : '查询', handler : queryS