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

 

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

 

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

 

       别拍砖,别拍砖,马上开始……

       Js调用SOAOffice提供的VBA接口的开始:SOAOfficeDocument属性,这个属性是VBA接口的开始,就等于VBA接口中的ActiveDocumentjs的写法如下:    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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值