日期:2014-05-16  浏览次数:20381 次

JS--VBA--打印word统计表

/**
 * 打印 按人员统计 报表
 */
function printCountForMember(){

	var rowsFlag = 10.0; //每页输入的行数
	
	// 得到输入到表格的JSON  unit是用aJax请求后得到的JSONObject, root为此jo的key。unit.root得到jo的value值。
	// unit.root为一个JSONArray。
	var tableJson = unit.root; 
	var fileCount = Math.ceil(tableJson.length/rowsFlag); // 根据每页输出的行数,计算文档的数量
	
	// 对应所封装的JSON对象的key值。
	var filedsArray_1 = ["name", "unit", "times", "经贸", "考察", "高访", "科技", "文体", "民航", "培训", "留学" ,"维军", "友好访问"];
	var filedsArray_2 = ["name", "unit", "times", "工程项目", "馆工", "巡检","突发","验收","谈判","省外","随任","探亲","会议","常驻"];
	
	for(var i=0; i<fileCount; i++){
		var word1 = this.printWordForCountByMember(unit,i,rowsFlag,'countByMember1',filedsArray_1,4);
		this.closeWord(word1);
		
		var word2 = this.printWordForCountByMember(unit,i,rowsFlag,'countByMember2',filedsArray_2,4);
		this.closeWord(word2);
	}
}

//结束word进程
function closeWord(wordApplication){
	wordApplication.Quit(0);
}

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

/**
 *  调出word模板,并为标签赋值
 * @param {} jsonObj json对象
 * @param {} fileFlag 文档标识,标识现在是第几个文档
 * @param {} rowsFlag 表格输出行数的标识,当前文档表格所要输出的行数。
 * @param {} fileName 所要打开的word文件名
 * @param {} countFlag 从表格的第几列开始统计,其中,出国次数为第3列
 */
function printWordForCountByMember(jsonObj,fileFlag,rowsFlag,fileName,filedsArray,countFlag){
	
	try{
	   var word=new ActiveXObject("Word.Application");
	}catch(e){
		Ext.Msg.alert("出错了","浏览器安全级别较高导致不能创建Word对象或者客户端没有安装Word软件'!");   
	}

    var url= this.getFileTemplatePath(fileName);
	
	word.Documents.add(url);
	
	//得到word模板中所设置的“书签”名称,为其赋值
	range=word.ActiveDocument.Bookmarks('countType').Range.Text = jsonObj.count_type;
	range=word.ActiveDocument.Bookmarks('printYear').Range.Text = jsonObj.printYear;
	range=word.ActiveDocument.Bookmarks('printMonth').Range.Text = jsonObj.printMonth;
	range=word.ActiveDocument.Bookmarks('printDay').Range.Text = jsonObj.printDay;

	
	var myTable = word.ActiveDocument.Tables(1); //取得活动文档的第一个表格
	
	var rowsCount = myTable.Rows.Count; //计算表格的行数
	
	var list = unit.root; // 得到JSONArray
	
	var listSize = list.length; // 计算JSONArray的长度
	
	var countSum = new Array(); //创建一个新的数组,用来存放每一页的“总计”信息。
	for(var c=0; c<=filedsArray.length-countFlag+1; c++){ // c 为此表格的所要统计显示的列数。
		countSum[c] = 0;   // 为初始数组赋值为0
	}
	
	var iRows = 2; // 根据表格的不同,来定义此值。 iRow 为表格数据开始写入的行数  2即为从当前表格的第2行开始写入数据
	var r; // 每一行的JSON
	var flag=1; // 标识,初值为1,记录当前已写入多少行数据
	// i的初始值为当前的序号(打印第一页,传入0)乘以 所要写入的行数。  结束值为此JSONArray的长度。
	for(var i=fileFlag*rowsFlag; i<listSize; i++){
		r = list[i];
		
		if(flag > rowsFlag){  // 如入当前已写入行数 大于 所要求的行数,则跳出循环,打印当前页。
			break;
		}

		if(iRows > rowsCount){ // 如果模板所定义的行数小于记录数,则取此表格的第2行(即去掉表头后的行数)增加到此表格的后面。
			myTable.Rows.Add(myTable.cell(2,2));
		}
		
		var values = new Array(filedsArray.length);
		for(var f=0; f<values.length; f++){
			values[f] = r[filedsArray[f]];
//			alert( filedsArray[f] + ":" + values[f]);
		}
		
		// 每循环一次,为此表格写入一行数据。
		setRangeText(myTable,iRows,2,values,countSum,countFlag);
		
		iRows ++;
		flag ++;
	}
	
	setCountSum(myTable,rowsCount,countFlag+1,countSum);  // 设置最后一行 ”总计“ 的值。
	
//	word.Visible=true;  // 设置word是否可见。
	word.PrintOut();  // 设置word打印程序。 和word.Visible分开使用。即word文档无预览页面,直接输出到打印机。 打印完成回需要 结束 winword 进程。
	
	return word;
	
}

/**
 * 为表格赋值
 * @param {} myTable 当前table的对象
 * @param {} rStart 从第几行开始写数据
 * @param {} cStart 从第几列
 * @param {} values 数据的数组
 * @param {} countSum 第一列的 总计
 */
function setRangeText(myTable,rStart,cStart,values,countSum,countFlag){
	var count = 0;
	for(var i=0; i<values.length; i++){
		myTable.cell(rStart,i+cStart).Range.Text = values[i];  // 特殊遍例,为每一行赋值。
		
		if(i>countFlag-2){
			countSum[i-countFlag+1] = countS