`
why_rj
  • 浏览: 25693 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

JS--打印word的模板程序

阅读更多

我们在做项目中经常遇到“打印表格”的功能,在此介绍一下我所用过的打印方法。

 

一、比较简单的做法,word另存转化为html文件的方式。分析如下:

1、首先我们需要在office中用wrod画好文件的模板,然后将其另存为thm网页形式。

2、将其改为jsp页面,这样我们就可以文件中使用后来传过来的变量值。此时就是我们传统的jsp方式,后台定义参数,然后前台获取,将变量值写在我们需要显示的地方。

3、对于表格,我们可以用循环来控制。

4、这样做打比较简单,缺点word模板不能修改,一旦表格做个微小的变化,那我们的工作量也不小,因为word转化后的代码很难读懂,要在代码上控制其样式,是相当的困难,所以不推荐这种做法。

(注:1、 在做模板时,我们可以先在需要显示变量值的地方首先定义好值,然后在jsp中直接替换就行。

          2、在jsp页面中,在首先加入“<%@ page contentType="application/msword;charset=UTF-8"%>”, 以标识此页面为word文件。

          3、如果需要点击时直接打开word文件,而非弹出“保存、打开”对话框,则需要删除“xmlns:w="urn:schemas-microsoft-com:office:office"”代码即可。

 

 

下面我们介绍另一种更常用的方法,此方法的有点是:修改word模板文件,不会影响程序。

二、用JS控制的打印方式,具体如下:

 1、首先画word模板,在需要动态显示内容的地方插入“标签”。方法如下:在word中,选中需要被替换的内容-->插入-->书签,为其定义好名字即可,其它类似。

2、将做好的模板文件另存为模板dot文件。

     做到这基本就差不多了,接下来就是后台代码发挥的时候了。

3、在后台封装参数值。

4、调用JS函数打印。

 

为了更为直观的介绍,下面用一完整的例子介绍。

先把代码贴出来:

1、JS模板文件,适用范围:

     a. 根据文档文件,所有要显示的内容都定义为书签。

     b. 纯表格文件。如果为多个表格或表格中嵌套表格,则需要稍加修改。

     c. 文档、表格混搭型。

代码如下:

/**
 *  得到 文件模板的目录
 * @param {} fileName
 * @return {}
 */
function getFileTemplatePath(fileName){
	
	var path = "/page/printTemplate/" + fileName + ".dot";
	
	var url="http://"+window.location.hostname + ":" + window.location.port+ this.getContextPath() + path;
	
	return url;
}

/**
 *  调出word模板,并为标签赋值
 * @param {} jsonObj json对象
 * @param {} fileName 所要打开的word文件名
 */
function printWord(jsonObj,fileName){
  
   var word=new ActiveXObject("Word.Application");
   
   word.Visible=true;

    var url= this.getFileTemplatePath(fileName);
	
	word.Documents.add(url);
	
	for(i=0;i<jsonObj.length;i++){
		
	   if ((jsonObj[i].text)!="list"){
	   		range=word.ActiveDocument.Bookmarks(jsonObj[i].text).Range;
	   		range.text=jsonObj[i].value;
	   }else{
	   	
			var myTable=word.ActiveDocument.Tables(1);
			
			var rowsCount =  myTable.Rows.Count;
			var iRow=2;
			
			for(j=0;j<jsonObj[i].value.length;j++){
	         
		        if (iRow > rowsCount){
				     myTable.Rows.Add();
			    }
			
				var length = jsonObj[i].value[j].length;
				for(var k=0; k<length; k++){
					myTable.Rows(iRow).Cells(k + 1).Range.Text=jsonObj[i].value[j][k].value;
				}
	             
	            iRow ++; 
	        }
        }
	} 
	
	word.Visible=true;
}

 2、看到代码就会明白,这段代码需要一个JSON类型的参数。

     下一步我们所做的工作就是要在JSON上做文章了。 附后台代码(封装JSON,java)

 类:PrintJSONObjectSet

import org.json.JSONArray;
import org.json.JSONObject;

public class PrintJSONObjectSet {
	
	private JSONArray ja;

	public PrintJSONObjectSet(){
	    ja = new JSONArray();
	}
	
	public JSONArray getJSONArray(){
		
		return ja;
	}
	
	public JSONObject json(Object key, Object value) throws Exception{
		
		JSONObject jo = new JSONObject();
		
		value = "".equals(value) || value == null ? "" : value;
		
		jo.put("text", key);
		jo.put("value", value);
		
		return jo;
	}
	
	public void put(Object key, Object value) throws Exception{
		ja.put(json(key,value));
	}
	
	public void put(Object obj){
		ja.put(obj);
	}
}

 打印封装的方法:

/**
	 * 打印出国(境)证明
	 * @return
	 * @throws Exception
	 */
	public String printChuGuoJingZhengMing() throws Exception{

		JSONArray ja = new JSONArray();
		
		GroupInfo group = this.getGroupInfo();
		
		String[] countrys = this.getCountrys();
		
		if(countrys != null){
			for(int c=0; c<countrys.length; c++){

				PrintJSONObjectSet js = new PrintJSONObjectSet();
				
				SeedGroupRef seed = seedImpl.getCzcz(getGroupInfoId(),countrys[c]);
				
				js.put("year", seed.getFileYear());
				js.put("fileNum", seed.getFileNum());
				js.put("leader",group.getLeader());
				js.put("groupCount", group.getGroupCount());
				js.put("country",countrys[c]);
				js.put("dispCode",getDispCode());
				js.put("printYear", DateFunc.getPrintYear());
				js.put("printMonth", DateFunc.getPrintMonth());
				js.put("printDay", DateFunc.getPrintDay());
				
				PrintJSONObjectSet js2 = new PrintJSONObjectSet();
				List<MemberInfo> memberList = this.getIsSefMembers();
				MemberInfo member;
				
				for(int i=0; i<memberList.size(); i++){
					
					PrintJSONObjectSet js3 = new PrintJSONObjectSet();
					member = memberList.get(i);
					
					js3.put("name1",member.getName());
					js3.put("passportNum1",member.getPassportNum());
					
					if(++i < memberList.size()){
						member = memberList.get(i);
						js3.put("name2",member.getName());
						js3.put("passportNum2",member.getPassportNum());
						
					}
					js2.put(js3.getJSONArray());
				}
				
				js.put("list", js2.getJSONArray());
				
				ja.put(js.getJSONArray());
			}
		}
		
		PrintWriter out;
		
		System.out.println(ja.toString());
		
		try{
			out = response.getWriter();
			out.print(ja.toString());
			out.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		
		return null;
	}

对于JSON的说明:

1、最外层为一个JSONArray,这个JSON中包含多个JSONArra,其控制文档的数量。

2、在第二层JSONArray中,包含多个JSONObject。其中每个JSONObject包含一个JSONObject对象。

     每个JSONObject对象以{"text":"name","value":"张三"}的形式存储。

3、遇到表格时,则在第二个JSONArray中,封装类型{"text":"list","value":[[{"text":"","value:""}]]}形式。

    也就是说此时的JSONObject的值必须为list,只有这样,JS中才能将其作为表格来输入。

    其中在名为 list 的JSONObject对象中,包含多个JSONArray,用来控制行数。

      每个JSONArray中包含多个类型第2条中形式的JSONObject对象,用来控制列数。

 

 

调用方法:(采用aJax)

Ext.Ajax.request({
			url : href,
			success : function(response, options) {
				
				var responseText = response.responseText;
				var jsonObj=eval('(' + responseText + ')'); 
				
				for(var i=0; i<jsonObj.length; i++){
					printWord(jsonObj[i],'chuGuoJingZhengMing');
				}
			},
			failure : function(response, options) {
				alert("fail!");
			}
		});

 例子中的word文件:

 

如果国家为多个时,则会打印出多个文件。

 

对于代码的说明:

在后台代码封装中,我们将 书签名 和 值  封装为一个JSON对象,这样JS处理中,我们就方便了,不用再逐个写出每个书签的名字,供其查找、然后赋值。

 

在后台代码中,我这里在打印时需要根据国家来确定所要打印的文档数量,如果为多个国家则要打印出多个文档,所以在后台封装,最外层又加了一个JSONArray,JS中也多了一道循环,这个可以根据需要自己调整。

 

特殊情况下,需要我们单独处理,如多个表格的情况下,或者表格嵌套表格。

这里说一下表格嵌套的情况下,如果获得被嵌套的表格对象。

如:var myTable=word.ActiveDocument.Tables(1).Rows(1).Cells(1).Tables(1);

   这里得到的是文档中第一个表格的第一行的每一列中的每一个表格对象,其它类似。

 

range=word.ActiveDocument.Bookmarks("name").Range 的意思是 得到文档中 书签名为“name”的对象。

range.text=“张三” 为其赋值为 张三。

 

这里采用的是dot文件,因为dot文件存在于服务器上,如果使用doc文件作为模板文件的话,在多人访问时,会出现线程锁死的情况,故采用dot文件。

 

附加一段生成好的JSON串:

[   [
       {"text":"year","value":2011},
       {"text":"fileNum","value":5},
       {"text":"leader","value":"彭瓒"},
       {"text":"groupCount","value":5},
       {"text":"country","value":"俄罗斯"},
       {"text":"dispCode","value":"dispCode"},
       {"text":"printYear","value":"2011"},
       {"text":"printMonth","value":"04"},
       {"text":"printDay","value":"07"},
       {"text":"list","value":[	  
				   [ {"text":"name1","value":"彭瓒"},
				     {"text":"passportNum1","value":""},
				     {"text":"name2","value":"郭沁明"},
				     {"text":"passportNum2","value":""}
				   ],
				   [ {"text":"name1","value":"张三五"},
				     {"text":"passportNum1","value":""},
				     {"text":"name2","value":"彭瓒"},
				     {"text":"passportNum2","value":""}
				   ],
				   [ {"text":"name1","value":"郭沁明"},
				     {"text":"passportNum1","value":""},
				     {"text":"name2","value":"张三五"},
				     {"text":"passportNum2","value":""}
				   ]
			      ]
       }
     ],
     [
       {"text":"year","value":2011},
       {"text":"fileNum","value":7},
       {"text":"leader","value":"彭瓒"},
       {"text":"groupCount","value":5},
       {"text":"country","value":"韩国"},
       {"text":"dispCode","value":"dispCode"},
       {"text":"printYear","value":"2011"},
       {"text":"printMonth","value":"04"},
       {"text":"printDay","value":"07"},
       {"text":"list","value":[
				[ {"text":"name1","value":"彭瓒"},
				  {"text":"passportNum1","value":""},
				  {"text":"name2","value":"郭沁明"},
				  {"text":"passportNum2","value":""}
				],
				[ {"text":"name1","value":"张三五"},
				  {"text":"passportNum1","value":""},
				  {"text":"name2","value":"彭瓒"},
				  {"text":"passportNum2","value":""}
				],
				[ {"text":"name1","value":"郭沁明"},
				  {"text":"passportNum1","value":""},
				  {"text":"name2","value":"张三五"},
				  {"text":"passportNum2","value":""}
				]
			      ]
       }
     ]
  ]

  

0
1
分享到:
评论

相关推荐

    js操作word打印

    在JavaScript(JS)中操作Word进行打印和导出是一项实用的技术,主要应用于Web应用程序与Microsoft Office集成的场景。以下是对这个主题的详细说明: 一、JS调用Word打印 JavaScript可以通过ActiveXObject对象在...

    Java操作Word模板实现动态数据输出

    2. **创建文件夹**:在程序根目录下创建两个文件夹“downLoad”、“model”,并将Word模板文件“模板.rtf”放置于“model”文件夹中。这些文件夹将分别用于存放生成的Word文件和Word模板文件。 #### 五、Java读取...

    java实现word预览打印

    通过整合上述知识点,我们可以构建一个Java应用,它首先使用Framemaker生成Word模板,然后用Java动态填充数据,再将生成的Word文档转换为PDF,最后在页面上预览并打印PDF,整个流程完全自动化,极大地提高了工作效率...

    JS操作Word生成表格

    在IT行业中,JavaScript(简称JS)通常用于网页前端交互,但通过特定的库和API,我们也能使用JS来操作Microsoft Word文档,包括在Word中创建和编辑表格。本篇文章将详细探讨如何使用JS来实现这一功能,以及相关的...

    aspose-words-15.8.0.zip

    5. **邮件合并**:方便地实现邮件合并功能,将数据源与文档模板结合,生成个性化的批量输出文件,常用于批量打印信件或报表。 6. **文档比较**:提供了文档比较功能,可以找出两个文档之间的差异,并生成合并结果。...

    js word 插件的范例

    JavaScript Word插件通常基于API(应用程序接口)来实现与Word的交互。例如,Microsoft提供了Office JavaScript API,使得开发者能够通过JavaScript代码控制Office应用,包括Word。这样的插件会利用这些API来读取、...

    简单方便的web打印编辑器

    富文本编辑器允许用户像在桌面应用程序中一样输入、编辑和格式化文本,如Microsoft Word。常见的富文本编辑器库有CKEditor、TinyMCE、Quill等。这些编辑器通常提供API和插件,支持添加图片、链接、表格等复杂元素,...

    微信小程序开发作业模板05-MOOC1

    该作业模板主要涉及到微信小程序的前端开发,包括WXML、WXSS和JavaScript的应用。 作业要求: 作业要求参照案例308—九九乘法表,设计一个微信小程序,小程序运行后,分别打印出4个方向(左下角、左上角、右下角、...

    ActiveX控件的使用-js实现打印超市小票功能代码详解

    2. JavaScript操作Word文档:通过ActiveX对象来操作Word文档,可以在客户端电脑上的Word应用程序中打开本地的Word模板文件。然后,通过JavaScript脚本填充书签位置的数据,并进行打印。 3. 实际操作示例:在页面上...

    数据送到Word中去打印

    本文将详细讨论如何利用特定的控件将程序中的数据送入Microsoft Word进行打印,以及与此相关的源码和资源。 首先,我们需要理解"控件"在编程中的概念。控件是用户界面(UI)的一部分,允许用户与应用程序交互。在...

    WEB打印控件Lodop完整实例

    在实际应用中,Lodop不仅支持普通的文本和图像打印,还可以处理PDF、Excel、Word等格式的文件,甚至可以实现网页直接打印,无需下载。同时,Lodop还提供了远程打印、网络打印机选择、预览、多页打印等功能,极大地...

    jsp、web打印功能Lodpo6.0

    虽然提供的例子中不包含直接打印Word模板的功能,但可以通过模拟页面的方式间接实现打印Word文档。 **Lodop与JSP的整合** 在JSP中集成Lodop,首先需要在服务器上部署Lodop的服务端组件,并在客户端引入相应的...

    jsp页面生成word或excel

    ### 使用JSP实现Word、Excel格式报表打印 #### 一、使用JSP生成Word文档 在JSP中生成Word文档可以通过设置正确的`content-type`来实现。具体来说,只需要在JSP页面的头部添加以下指令: ```jsp ...

    简单方便的web打印编辑器--完整版

    在这个“简单方便的Web打印编辑器--完整版”中,我们可以推测它可能是一个基于C#编程语言开发的Web应用程序,旨在提供高效且用户友好的打印解决方案。 C#是微软公司推出的一种面向对象的编程语言,它在.NET框架上...

    javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第1/2页

    在这个场景下,开发者需要将特定内容替换Word模板中的书签,然后导出到Word文档并打印第1/2页。 首先,我们需要理解几个关键点: 1. **ActiveXObject**:这是在IE浏览器中创建和使用COM对象的接口,例如Microsoft ...

    网页转pdf,word转pdf,网页转word,wordtopdf,htmltoword,htmltopdf

    这些操作通常是为了保持文档的格式一致性,便于打印、分享或长期保存。以下是对标题、描述和标签中涉及的知识点的详细解释: 1. **网页转PDF**: 网页转PDF的目的是为了保存网页内容并保留其布局,防止因浏览器...

    Java实现Web报表打印功能.

    最后,在Java程序中利用iText读取PDF模板,并填充实际数据。 这种方法的优势在于能够快速生成外观专业、格式统一的报表,尤其适合大量报表生成的场景。开发者只需关注数据填充逻辑,而无需从零开始设计报表样式。 ...

    ASP.NET中数据库数据导入Excel并打印

    这种方法相对简单,通过在网页上嵌入一个WebBrowser控件,并使用JavaScript或VBA代码触发打印操作。例如: ```html &lt;OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0&gt; ...

    Lodop打印插件详细教程

    对于开发者来说,Lodop提供了丰富的API接口,可以通过JavaScript或者VBScript调用,方便在网页中集成打印功能。例如,使用` Lodop=GetObject("clsid:8AD9C840-044E-11D1-B3E9-00805F499D93")` 获取对象实例,然后...

Global site tag (gtag.js) - Google Analytics