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

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] = countSum[i-countFlag+1] + values[i]; 	// 根据表格的不同更改 这里是循环到第2列时,开始计算求和。
			count = count + values[i];  // 每特殊一行,从第二列开始统计每一行的结果,即每一行的"合计“。将其赋值给count。
		}
	}
	
	countSum[countSum.length-1] = countSum[countSum.length-1] + count;  // 为统计数组的最后一列赋值,将”合计“赋值为最后一列。
	myTable.cell(rStart,values.length + cStart).Range.Text = count;  // 为每一行的最后一列”合计“写入数据。
	
}

/**
 * 为最后一行 总计 写数据
 * @param {} myTable
 * @param {} rStart
 * @param {} cStart
 * @param {} countSum 
 */
function setCountSum(myTable,rStart,cStart,countSum){
	for(var i=0; i<countSum.length; i++){
		myTable.cell(rStart,i+cStart).Range.Text = countSum[i];
	}
}	
附件中为word模板。
分享到:
评论

相关推荐

    VBA宏编程示例集50个常用代码

    "VBA代码大全之一、之二word版.rar"很可能是两份详细的VBA代码合集,涵盖了多种常见的Word操作,如自动化文档生成、格式调整、邮件合并等功能,是学习和查找VBA代码的好资源。 "VBA实例19-和值n.rar"可能与统计或...

    2021-2022计算机二级等级考试试题及答案No.18001.docx

    - 状态栏位于Word窗口底部,显示有关文档的信息,例如当前光标所在的页码、字数统计、修订状态等。 - 可以根据需要自定义状态栏上显示的信息。 #### 题目4: 复选框控件的Value属性 - **知识点**: 在编程环境中,...

    2021-2022计算机二级等级考试试题及答案No.17344.docx

    Visual FoxPro 中的统计命令 - **知识点概述**:在 Visual FoxPro 中,使用 `AVERAGE` 命令时,表文件需要先通过 `COPY STRUCTURE TO` 命令创建一个新的表结构副本。 - **命令格式**: - `COPY STRUCTURE TO 新...

    2021-2022计算机二级等级考试试题及答案No.1761.docx

    - **解析**:在SQL语言中,`INSERT INTO` 语句用于向表中添加新记录。例如,`INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...);`。而`ADD`、`ALTER`、`ADD INTO`均不是...

    2021-2022计算机二级等级考试试题及答案No.4188.docx

    6. COUNT函数在统计表中用于计算所有记录的个数。 7. 应用软件是指专门为某一特定应用目的而编制的软件,它可以被多个应用单位共享。 8. 在PowerPoint中,幻灯片浏览视图允许用户改变幻灯片之间的切换效果。 9. ...

    2021-2022计算机二级等级考试试题及答案No.1328.docx

    16. 聚集函数计数:COUNT函数用于统计表中所有记录的个数。 17. 动画时钟控件:在VB或VB.NET等环境中,Timer控件常用于控制动画速度,通过调整Timer的Interval属性来控制间隔时间,从而影响动画的播放速度。 这些...

    2021-2022计算机二级等级考试试题及答案No.13536.docx

    5. Word2000 插入文件:在Word2000的编辑状态下,如果要在当前文档中插入另一个文档的内容,应选择“插入”-&gt;“文件”。 6. 数据库系统数据模型:数据库系统支持多种数据模型,包括层次模型、关系模型和网状模型,E...

    2021-2022计算机二级等级考试试题及答案No.14021.docx

    1. **逻辑表的设置**:在数据库设计中,逻辑表的设置通常涉及到表的设计和属性配置,这里提到的“工作区属性”可能指的是数据库工作区的配置,这在数据库管理系统中用于组织和管理数据。 2. **表达式计算**:表达式...

    2021-2022计算机二级等级考试试题及答案No.1250.docx

    14. 交叉表查询可以在紧凑的格式中显示字段的统计信息。 15. 软件交付后需要维护以修复问题、更新功能和适应新环境。 16. 在Word2003中,设置段落首行缩进既可以通过标尺也可以通过菜单命令。 17. 汇编语言和机器...

    2021-2022计算机二级等级考试试题及答案No.17104.docx

    12. 在数据库中,COUNT函数用于统计表中所有记录的个数。 13. 通过修改控件的属性或编写代码,可以改变控件的大小和位置。 14. 应用软件是指专门为某一特定应用目的而开发的软件,它不是通用的,而是针对特定用户...

    extractData

    2. VBA(Visual Basic for Applications):VBA是一种内置于Microsoft Office应用(如Excel、Word和Access)的编程语言,用于自动化任务和创建自定义功能。在数据处理中,VBA可以用来读取、写入和处理大量数据,比如...

    2021-2022计算机二级等级考试试题及答案No.16892.docx

    14. 要统计数据库中各分数段的人数,使用交叉表查询可能不是最佳选择,因为交叉表查询通常用于展示数据的行列交叉分析。应该使用选择查询或者聚合查询(如GROUP BY)来实现。 15. 微型计算机的性能提升和更新换代...

    72小时挑战Office技巧

    在“72小时挑战Office技巧”这个学习资源中,涵盖了微软Office套件的多个核心组件,包括Word、Excel、PowerPoint、Outlook以及FrontPage和Access。这些工具在日常办公和数据分析中扮演着至关重要的角色。下面将详细...

    2021-2022计算机二级等级考试试题及答案No.17362.docx

    6. 在Word中,闪烁的垂直条表示插入点,用户在此处键入的文字将被插入。 7. 关系表达式的值通常为逻辑值,如0(假)和1(真),表示布尔运算的结果。 8. 在Access 2003中,若字段作为关系的一部分,需先删除该字段...

Global site tag (gtag.js) - Google Analytics