技术开发 频道

LotusScript实现Excel报表自动生成和操作


业务逻辑实现

    在业务逻辑方面,首先,我们需要在这个 Notes 数据库里面新建一个视图(NotesView),名为 “byTime”,按照文档的创建时间从晚到早的排序所有的文档,这个视图的创建很简单,不用任何代码;随后,我们可以借助这个视图来得到按照创建时间排序的文档(NotesDocument),从最近的文件开始遍历,对所有一周以内创建的文档进行处理,将它们的内容写入新建好的 Excel 对象的对应单元格;完成以后将这个文件保存在硬盘,然后发送给指定的地址列表当中;最后在本地删除这个文件。这个简单业务逻辑的代码如下(关于 NotesView 和 NotesDocument 的概念和具体用法请参考相关资料):

Sub Initialize '定义 ExcelReport 类的实例,表示一个 Excel 对象 Dim report As ExcelReport Dim session As New NotesSession Dim db As NotesDatabase Dim view As NotesView Dim doc As NotesDocument Dim iRow As Integer Dim author As String '调用构造函数,初始化 Set report = New ExcelReport '写入 Excel 标题行(第一行) Call report.insertData(1,1,1,"创建时间") Call report.insertData(1,1,2,"题目") Call report.insertData(1,1,3,"作者") '得到按照日期排序的视图 Set db = session.CurrentDatabase Set view = db.GetView("byTime") Set doc = view.GetFirstDocument iRow = 2 While Not(doc Is Nothing) '按照创建日期排序,处理一周以内的所有文档 If (doc.Created > Today-7 ) Then '用 Cstr 函数转换时间到字符串 Call report.insertData(1,iRow,1,Cstr(doc.Created)) 'GetItemValue 返回的是一个字符串数组,我们要其中的第一个 Call report.insertData(1,iRow,2,doc.GetItemValue("Subject")(0)) '从 From 当中得到作者名字,然后转成简称 author = doc.GetItemValue("From")(0) Call report.insertData(1,iRow,3,session.CreateName(author).Abbreviated) '找到下一个文档 Set doc = view.GetNextDocument(doc) iRow = iRow + 1 Else '发现不是本周内的文档,退出循环 Goto BreakLoop End If Set doc = view.GetNextDocument(doc) Wend BreakLoop: '保存文件 Call report.saveFile ("C:\Docs Report This Week.xls") '释放资源 Call report.doQuit '发送邮件 Call SendMail("Rui R Hu/China/IBM","C:\Docs Report This Week.xls") '还可以发送更多地址...... '删除本地文件 Kill "C:\Docs Report This Week.xls" End Sub



用邮件发送报表

    其中,代码用到了一个自定义的方法 “SendMail”,它可以向一个地址发送一封带附件的邮件,两个参数分别是收件人地址和附件文件地址。代码如下(代码具体的解释已经超出了本文的讨论范围,请参考相关资料):

Sub SendMail(target As String,attachment As String) Dim session As New NotesSession Dim db As NotesDatabase Dim doc As NotesDocument Dim ritme As NotesRichTextItem Set db = session.CurrentDatabase Set doc = New NotesDocument( db ) doc.Form = "Memo" doc.SendTo = target doc.Subject = "Here's the document you wanted" Set ritem = doc.CreateRichTextItem("Attachment") ritem.EmbedObject EMBED_ATTACHMENT, "", attachment Call doc.Send( False ) End Sub

设置自动运行

    写好了代码,我们就可以让这个代理运行了,不同于本文前面提到的简单例子,这里,我们希望让这个代理在每周五下午运行,生成一周的报表发送给一些收件人,设置如下图所示:

定时运行代理
图4. 定时运行代理

    这样,每周五下午,相关收件人就会收到一封信,其中的附件就是一个 Excel 报表,如下图所示:

生成的 Excel 报告
图5. 生成的 Excel 报告

用Excel 宏取得更多操作代码

    读者一定对上图当中的 Excel 报告很不满意,因为这个 Excel 报表格式很难看,需要读者手工在每一列的分界处双击一下,来对齐单元格内容。有没有办法可以自动实现这个烦人的操作呢?

    答案当然是肯定的,而且我们可以不用参考任何书籍或者资料就开发出需要的代码。

    一般地,关于 Excel 报表的更多操作,我们可以通过翻阅参考资料来学习更多功能代码的实现方法,就如同其他技术的学习一样。不过,现在我们有另一种更加方便、巧妙和快速的方法可以得到我们需要的操作代码,那就是利用 Excel 的宏。在相关参考资料不太充足的情况下,这个方法尤为有用。

    我们就拿当前需要的“对齐单元格”的需求为例子,看看如何用宏来取得代码。如下图所示:

用 Excel 宏取得代码
图6. 用 Excel 宏取得代码

    首先,我们打开 Excel 程序,新建一个文件,点击“工具”-“宏”-“录制新宏”,开始录制新的宏。

    然后,我们只要简单的在 B 列和 C 列中间双击一下对其单元格,就可以按“停止录制”的按钮以停止录制了。

    最后,我们打开“工具”-“宏”-“Visual Basic编辑器”,见到在“模块1”当中,有一个 VBA 的函数。这个函数正是我们刚才录制的宏操作,当中只有一句代码,就是对其单元格的代码。

    这样,我们就取得了这个操作的 VBA 代码。在 “ExcelReport” 类当中,我们“照葫芦画瓢”地添加这个功能的方法如下:

'对齐单元格,col 表示列名称,接受 “A” “B” 等列名 Function autoFit(intSheet As Integer, col As String) xlApp.Workbooks(1).Worksheets(intSheet).Columns(col+":"+col).EntireColumn.AutoFit End Function



    在业务逻辑代码里面,我们在数据全部填好以后,加上以下三句话,就可以自动对齐单元格了:

Call report.autoFit(1,"A") Call report.autoFit(1,"B") Call report.autoFit(1,"C")

    这样,我们就可以得到格式整齐的 Excel 报表了。更重要的是,我们也了解了,如果我们想要在我们的代码当中实现一个 Excel 的高级功能,只要简单地用宏来录制相关操作,得到相应的 VBA 代码,就可以快速地在 “ExcelReport” 类里面添加相应的方法了。

调试代码

    有了宏的录制,我们就可以“挖掘”更加丰富的Excel高级功能了,不过,这种“照葫芦画瓢”的代码生成方式也不是非常的可靠,可能出错,这时,代码的调试就可以发挥作用了。

    同很多语言开发平台一样,Lotus Domino Designer 也支持 LotusScript 等语言的调试功能。调试的具体用法很简单:首先,在 Lotus Notes 当中将“文件”-“工具”-“调试 LotusScript” 勾上,开始调试模式。然后,在 Notes 当中执行任何 LotusScript 代码都会进入调试模式。在调试模式当中,我们可以单步前进、用双击的方法设置断点、观察变量等等。一切调试功能都类似于一般的高级语言一样,主要的区别就在于,调试一定是从运行的第一句代码开始停顿,断点只能在调试模式才可以设置。
调试模式 
图7. 调试模式

观看专家视频讲座,了解人员协作信息,赢取免费试用软件。

0
相关文章