/**
* 打印 按人员统计 报表
*/
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模板。