真是难以想象,一天的时间,我也整出来了一个 VBScript 的应用,看来微软的这些东西还是有那么点可取之处的,别的不说,就说 word 里录制宏和 word 里带的 Vb 的帮助文档,就省去了不少麻烦。废话不多少,代码说话。
需求为:查询某种类型的记录,然后在表格中显示其部分属性,并按照月份分成几个小表格,打印到 word 中,并将此 word 内容作为另一种记录的一个附件。
写了个测试例子,贴代码
首先是个 Bean
package com.test; public class Bean { public String title; public String date; public String status; public Bean(String title,String date,String status){ this.title = title; this.date = date; this.status = status; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
JSP中按照月份分组部分
Bean bean1 = new Bean("测试一","2007-11-12","已办理"); Bean bean2 = new Bean("测试二","2007-12-12","已办理"); Bean bean3 = new Bean("测试三","2008-10-12","已办理"); Bean bean4 = new Bean("测试四","2008-11-12","已办理"); Bean bean5 = new Bean("测试五","2007-11-20","已办理"); Bean bean6 = new Bean("测试六","2008-11-12","已办理"); ArrayList list = new ArrayList(); list.add(bean1); list.add(bean2); list.add(bean3); list.add(bean4); list.add(bean5); list.add(bean6); String[] yearAndMonth = new String[48];//4*12=48,存储某年某月 for(int i = 0;i < yearAndMonth.length;i ++){//数组初始化 yearAndMonth[i] = ""; } HashMap hp = new HashMap();//存放某年某月的记录列表 int index = 0;//数组的索引 for(int i = 0;i < list.size();i ++){ Bean bean = (Bean)list.get(i); String beginTime = bean.getDate(); boolean needAdd = true;//标记是否需要添加 for(int j = 0;j < index;j ++){ if(beginTime.substring(0,7).equals(yearAndMonth[j])){//如果某年某月已经有记录 needAdd = false;//不需要添加 break; } } if(needAdd){//需要添加 yearAndMonth[index] = beginTime.substring(0,7);//改写数组对应索引处的值 //新建List保存记录并存储到Map ArrayList listByTime = new ArrayList(); listByTime.add(bean); hp.put(beginTime.substring(0,7),listByTime); index ++; }else{//不需要添加 //从Map中得到对应的List,并在此添加记录 ((ArrayList)hp.get(beginTime.substring(0,7))).add(bean); } } for(int j = 0;j < index;j ++){ out.print(yearAndMonth[j]); out.println("<br>"); if(hp.get(yearAndMonth[j])!=null){ ArrayList a = (ArrayList)hp.get(yearAndMonth[j]); out.print("有"+a.size()+"个:"); for(int x = 0;x < a.size();x ++){ Bean bean = (Bean)a.get(x); out.print(bean.getDate()+" "); } out.println("<br>"); } }
然后是写入到制定位置的word文件中
<script language="vbscript"> function writeListToWord() Set fso = CreateObject("Scripting.FileSystemObject") Set MyFile = fso.GetFile("E://test.doc") MyFile.Copy ("E://test1.doc") Set myDocApp = CreateObject("Word.Application") myDocApp.Visible = True myDocApp.Activate set myDoc = myDocApp.Documents.Open("E://test1.doc") 'Set myDoc = myDocApp.Documents.Add() Set objSelection = myDocApp.Selection <% for(int j = 0;j < index;j ++){ if(hp.get(yearAndMonth[j])!=null){ ArrayList a = (ArrayList)hp.get(yearAndMonth[j]); %> Set table1 = objSelection.Tables.Add(objSelection.Range, <%=a.size()+1%>, 3) Set Table1 = myDoc.Tables(<%=j+1%>) Table1.Cell(1,1).Range.Text = "标题" Table1.Cell(1,2).Range.Text = "发布时间" Table1.Cell(1,3).Range.Text = "状态" <% for(int x = 0;x < a.size();x ++){ Bean bean = (Bean)a.get(x); %> Table1.Cell(<%=x+2%>,1).Range.Text = "<%=bean.getTitle()%>" Table1.Cell(<%=x+2%>,2).Range.Text = "<%=bean.getDate()%>" Table1.Cell(<%=x+2%>,3).Range.Text = "<%=bean.getStatus()%>" <% } %> for i = 1 To Table1.Rows.Count objSelection.MoveDown next objSelection.TypeText "新的循环开始"&vbCrLf <% } } %> myDoc.close() myDocApp.quit() Set MyFile = fso.GetFile("E://test1.doc") MyFile.Copy ("E://test.doc") MyFile.delete() end function </script>
OK,代码就是这些了,但是测试的话要加入受信站点,既允许读写本地文件