用程序把word模板中的一个表格复制为多个表格然后填充数据(工资单的例子)



在Web系统开发的时候,对word文件的内容控制需求中,会有这样的一个需求:模板中只有一个表格,但是需要根据查询数据库记录的条数填充表格。如果是一条记录那么就把这条记录的数据填充到word模板的表格中;如果查询的是多个记录,那么需要复制多这个这样表格来填充数据。这个需求不是对一个表格行的添加,而是要求表格本身的复制。

实现web系统中文件的内容的动态生成使用soaoffice就可以,估计不少人都用过这个产品,一个第三方的中间件,提供的WordResponse和WordTable对象就可以控制word文档中的内容,但是实现不了上面所说的需求,要实现上面的需求的话,还是必须用js调用soaoffice提供的office的VBA接口。WordResponse和WordTable对象应该也是soaoffice封装了一些office的VBA接口,创建了这么两个对象方便开发人员调用,实现生成文件的功能而不用学习VBA,但是上面说的那个功能没有封装为一个什么对象,只能开发人员自己用js调用VBA来处理了,期待他们以后封装一下,不然学习VBA也是个麻烦事。

别拍砖,别拍砖,马上开始……
Js调用SOAOffice提供的VBA接口的开始:SOAOffice的Document属性,这个属性是VBA接口的开始,就等于VBA接口中的ActiveDocument,js的写法如下: document.getElementById("SOAOfficeCtrl").Document
VBA中的ActiveDocument可以回溯到Application对象,写法如下:
document.getElementById("SOAOfficeCtrl").Document.Application
一旦获取到Application对象以后,VBA中几乎所有的对象都就可以访问到了,对VBA了的人就不需要这里细说了,下面只具两个例子:
1. 给word的当前光标处添加 “Hello World”,这样写就可以了:
document.getElementById("SOAOfficeCtrl").Document.Application.Selection.Range.Text = “Hello World”;
2. 全选word文件中的内容:
document.getElementById("SOAOfficeCtrl").Document.Application.Selection.WholeStory();     

实现复制表格功能的js:
function copyAll()
{
    var docApp = document.getElementById("SOAOfficeCtrl").Document.Application;
    docApp.Selection.WholeStory();      // 全选文档的所有内容
    docApp.Selection.Copy();        // 拷贝
   
}
或者用下面的写法,demo中用的是上面的写法,对不起懒的不想改了,自己改改吧,嘻嘻^_^:
function copyTable()
{
    document.getElementById("SOAOfficeCtrl").Document.Tables(1).Select();
     // 选中word中的第一个表格
    document.getElementById("SOAOfficeCtrl").Document.Application.Selection.Copy(); // 拷贝
   
}
粘贴拷贝的内容js,这里面用了不少光标移动的代码,必须的,为了下次粘贴做准备:
function paste()
{
    var docApp = document.getElementById("SOAOfficeCtrl").Document.Application;
    docApp.Selection.MoveRight(1, 1); // 光标右移一下
    docApp.Selection.TypeParagraph(); // 换行
    docApp.Selection.Paste();      // 粘贴
    docApp.Selection.Delete(); 
}
给指定表格的指定单元格赋值的方法:
function setTableValue(tableIndex, row, col, value)
{
     var docApp = document.getElementById("SOAOfficeCtrl").Document.Application;
     docApp.ActiveDocument.Tables(tableIndex).Cell(row,col).Range.Text = value;
}
实际上就是一句代码,给一个word表格中的一个单元格赋值的代码如下:
document.getElementById("SOAOfficeCtrl").Document.Tables(tableIndex).Cell(row,col).Range.Text = “Hello World”;
word中表格是按照序号排的,序号从1开始,最前面的表格序号就是1,依次类推,如果说两个表格位置换了,那么他们的序号也就改变了。Word中表格不好操作,应该说是用程序控制起来麻烦,因为word中的表格没有办法用名字命名,这是相当不好的一点,这样的话一旦表格的位置发生改变,表格的序号就要改变,程序也需要跟着改变才行,可能这是soaoffice为什么没有封装这个对象的原因吧。
下面说demo里的代码:
Default.aspx页使用常量,直接演示复制表格填充数据的效果,可以看看这个原理。
Default2.aspx 调用了数据库,复制表格和填充表格数据的js也是动态生成的,看看最终的效果吧。
别说文件不能保存!是我没写,不是我不会做,OK?

代码地址:http://ishare.iask.sina.com.cn/f/10696929.html

你可能感兴趣的:(Web,中间件,F#,Office,VBA)