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

本文介绍如何使用JavaScript通过SOAOffice调用VBA接口实现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

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

SpringBoot_Freemarker生Word_多个表格+两层嵌套循环; 步骤说明: 1.用Microsoft Office Word打开word原件;将文档中需要动态生的内容,替换为属性名 ${name} 2.另存为,选择保存类型Word 2003 XML 文档(*.xml) 3.用Firstobject free XML editor打开文件,选择Tools下的Indent【或者按快捷键F8】格式化文件内容。左边是文档结构,右边是文档内容; 4. 文档后有时需要手动修改,查找第一步中设置的属性名,可能会产生类似${n.....ame}类似的样子,我们将将名字中间的标签删掉,恢复为${name} 5. word模板中有表格,需要循环的位置, 用 标签将第二对 标签(即除头的w:tr标签后的一对)包围起来 同时表格内的属性例如${name},在这里需要修改为${user.name} (userList是集合在dataMap中的key, user是集合中的每个元素, 类似), 如图: PLUS:若表格之外还有嵌套的循环,也需要用,注意这里的标签不要和某对其他标签交叉,不可以出现这种 6. 标识替换完之后,另存为.ftl后缀文件即可。 代码里是相对有一丢丢复杂的,两层嵌套循环; 总(dataMap) deptName 部门名 list(Table)的集合 table1(map) table-名字 ${map.table} tableName-中文名 ${map.tableName} columnCount-字段数 ${map.columnCount} recordCount-记录数 ${map.recordCount} listA-List--表格1 map.listA column Model属性——字段名 ${model.column} columnName Model属性——字段中文名 ${model.column} rate Model属性——字段占比 ${model.rate} nullValueCount Model属性——字段空值数 ${model.nullValueCount} listB-List--表格2 map.listB …… listC-List--表格3 map.listC …… table2 table-名字 ${map.table} tableName-中文名 ${map.tableName} columnCount-字段数 ${map.columnCount} recordCount-记录数 ${map.recordCount} listA-List--表格1 map.listA column Model属性——字段名 ${model.column} columnName Model属性——字段中文名 ${model.column} rate Model属性——字段占比 ${model.rate} nullValueCount Model属性——字段空值数 ${model.nullValueCount} listB-List--表格2 map.listB …… listC-List--表格3 map.listC …… table3 ……
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值