`
thoriod
  • 浏览: 6450 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类

JS的乱写,OFFICE的更乱写(javascript生成WORD)

阅读更多
一直在做一个很恶心的东西,到现在我都觉得恶心的东西,就是通过JS来生成OFFICE文件,本来无可厚非。
不过现在却由衷的感慨到,MS的COM确实利在千秋。不过。。。。。。。。。。。。C++万岁,C万岁。我们在被大量的业界人士引导着去搞这个那个,比如动态语言,比如JAVA。他们都给我们铺设好了路。可是那天我们要走的时候,发现鞋不对怎么办,只能在去学走路,而忘记以前的步伐变的及其沉重。
于是还是那句话,C++万岁。
<script type="text/javascript"> 
var boxId=1;
var pageHtmlList = new Array(15);
	function htmlToWord(haveImg){
	var oWD = new ActiveXObject("Word.Application");//建立word对象
	var oDC = oWD.Documents.Add();//新建文档(对象)
	oWD.Application.Visible = true;//word可视
	var selection = oWD.Selection;//建立插入点对象
	createHead(selection);//插入文件头内容
	writeTOWord(1,selection,oDC,haveImg);//写入WORD文档内容
	}

function createHead(selection){
	selection.Font.color = 16737846;//设置字体格式
	selection.Font.Bold = 9999998;
	selection.TypeText("金华移动市场运营分析周报");//标题
	setFormat(selection,"金华移动市场运营分析周报",22,1);//设置字体大小和是否居中
	selection.Font.Bold = 9999998;
	selection.TypeParagraph();//换行
	selection.TypeParagraph();	
	selection.TypeText("市场经营部                                   <%=thisMt.getThisMonthDate()%>");
	setFormat(selection,"市场经营部                                   <%=thisMt.getThisMonthDate()%>",14,1);
	selection.TypeParagraph();
	selection.TypeParagraph();	
	selection.TypeParagraph();
	selection.Font.color= -16777216;	
}	
	
function writeTOWord(num,selection,oDC,haveImg){
		var temp =$("Navigation"+num);
		var tabledom =getChildren(temp,"TABLE");
		var imgdom = getChildren(temp,"IMG");
		fillcaption(num,selection);	
		writeIn(tabledom,imgdom,selection,oDC,haveImg);
		selection.InsertBreak(7);
		if(num<boxId){
			showMessage(boxId,num);
			num++;
			writeTOWord(num,selection,oDC,haveImg);
		}
		else
			alert("周报生成完成");
}		

function writeIn(tabledom,imgdom,selection,oDC,haveImg){
	if(!(tabledom instanceof  Array)){
		createTable(oDC,selection,tabledom);
		fillTable(tabledom,selection.Tables(selection.Tables.Count),selection);
		if(typeof(imgdom)=="object" && haveImg ==true)
			fillImg(imgdom.src,selection);
	}
	if(tabledom instanceof  Array){
		var temp =tabledom.shift();
		createTable(oDC,selection,temp);
		fillTable(temp,selection.Tables(selection.Tables.Count),selection);
		if(typeof(imgdom)=="object" && haveImg ==true)
			fillImg(imgdom.src,selection);
		temp =tabledom.shift();
		createTable(oDC,selection,temp);
		fillTable(temp,selection.Tables(selection.Tables.Count),selection);
	}
}

function createTable(wordDocument,selection,tabledom){
	var rownum=tabledom.rows.length;//获取行数
	var cellnum=0;
	var tempdom=null;
	for(i=0;i<tabledom.rows.length;i++){//根据行数循环
		if(tabledom.rows(i).cells.length>cellnum){
			cellnum=tabledom.rows(i).cells.length;//获取最大的列数
		}
	}	
	wordDocument.Tables.Add(selection.Range,rownum,cellnum);//新建表格,行数为talbe的行数,列数取最大的列数
	tempdom=selection.Tables(selection.Tables.Count);
	if(cellnum>9){
		tempdom.PreferredWidthType =2;
		tempdom.PreferredWidth =133;
	}
}
	
function getChildren(divDom,childType){//根据childType从div里面取出子元素
	try{
	var doms = divDom.children;
	}catch(e){
		alert(childType);
	}
	var returnDom =[];
	for(i=0;i<doms.length;i++){
		if(doms[i].tagName==childType){
			returnDom.push(doms[i]);
		}	
	}	
	if(returnDom.length>1){
		return returnDom;
	}else
		return returnDom.shift();
}	

function fillcaption(num,selection){//插入标题
	if(num==1){
		selection.TypeText("一、市场规模分析");
		setFormat(selection,"一、市场规模分析",12,0);
		selection.TypeParagraph();
		selection.TypeText("(一)运营收入情况分析");
		setFormat(selection,"(一)运营收入情况分析",12,0);
		selection.TypeParagraph();
	}
	if(num==3){
		selection.TypeText("(二)通话用户增长");
		setFormat(selection,"(二)通话用户增长",12,0);
		selection.TypeParagraph();
	}
	if(num==5){
		selection.TypeText("(三)新增放号");
		setFormat(selection,"(三)新增放号",12,0);
		selection.TypeParagraph();
	}
	if(num==7){
		selection.TypeText("二、市场份额分析");
		setFormat(selection,"二、市场份额分析",12,0);
		selection.TypeParagraph();
		selection.TypeText("(一)新增市场");
		setFormat(selection,"(一)新增市场",12,0);
		selection.TypeParagraph();
	}
	if(num==9){
		selection.TypeText("(二)存量(通话)市场");
		setFormat(selection,"(二)存量(通话)市场",12,0);
		selection.TypeParagraph();
	}
	if(num==13){
		selection.TypeText("三、市场质量分析");
		setFormat(selection,"三、市场质量分析",12,0);
		selection.TypeParagraph();
		selection.TypeText("(一)<%=thisMt.getThisMonth()%>月份离网数据");
		setFormat(selection,"(一)<%=thisMt.getThisMonth()%>月份离网数据",12,0);
		selection.TypeParagraph();
	}	
	var caption =$("caption"+num);
	selection.TypeText(caption.innerHTML);//标题
	setFormat(selection,caption.innerHTML,12,0);
	selection.TypeParagraph();
}

function fillImg(url,selection){//根据图片地址URL写入WORD
	selection.TypeParagraph();
	selection.InlineShapes.AddPicture(url,false,true);
	selection.ParagraphFormat.Alignment =1;
	selection.TypeParagraph();
}

function fillTable(htmltable,wordTable,selection){//根据HTMLTABLE的内容写入WORD
	var lastrows=0;
	var rownum=htmltable.rows.length;
	if(wordTable.Style !="网格型")//把表格设置成网格型
		wordTable.Style = "网格型";	
	for(i=0;i<rownum;i++){//循环设置表格,先根据行循环
		var rows=0;
		for(j=0;j<htmltable.rows(i).cells.length;j++){//根据每行的列循环
			rows+=cellMerge(htmltable,selection,htmltable.rows(i).cells(j));//合并单元格,记录改变的表格位置
			selection.Font.Name = "宋体";//设置字体为宋体
			selection.ParagraphFormat.Alignment =1;
			selection.Font.Size = 9;
			selection.TypeText(htmltable.rows(i).cells(j).innerText);//使用插入点插入内容
			selection.MoveRight(1,1);//下一格
		}
	lastrows=gotoNextRow(rows,lastrows,selection,htmltable.rows(i).cells);	
	}
	wordTable.Style.ParagraphFormat.Alignment= 1;	
	selection.TypeParagraph();
	
}

function gotoNextRow(rows,lastrows,selection,cells){
	if(rows==0 && lastrows==0){//本行以及上一行都没有跨行的单元格,则移动到本行首,同时下移到第二行
		selection.MoveLeft(12,cells.length);
		selection.MoveDown(5,1);//移动到下一行,wbline=5就是下一行
	}
	if(lastrows >0){//如果上一行有跨行的单元格,则移动到本行首,暂时只能解决第一行为跨行格的问题
		selection.MoveLeft(12,cells.length+lastrows);
		selection.MoveDown(5,1);
		lastrows=0;//移动结束清零
	}
	if(rows>0){//如果本行内有跨行,如此处理
		selection.MoveRight(12,rows+1);
		lastrows=rows;
	}
	return lastrows;
}

function cellMerge(htmltable,selection,cell){
	var rows=0;
	if(cell.rowSpan >1){//如果是多行表格,合并单元格,并且记录下行数
		selection.MoveDown(5,cell.rowSpan-1,1);	
		selection.Cells.Merge();	
		rows=cell.rowSpan-1;
	}
	if(cell.colSpan >1){//如果是多列表格,合并单元格
		selection.MoveRight(1,cell.colSpan,1);	
		selection.Cells.Merge();
	}
	return rows;
}

function setFormat(selection,text,fontSize,align){
selection.MoveLeft(1,text.length,1);//根据内容的长度选取字体,moveXXX方法的第三个参数为1做为选取
selection.Font.Name = "宋体";//设置字体为宋体
selection.Font.Size = fontSize;//设置字符大小为9PX,其实就是小五
selection.MoveRight(1,1);//右移一个字符,其实就是取消选定
selection.ParagraphFormat.Alignment= align;//居中对齐
}
 
function $(name){return document.getElementById(name);}

function createXmlhttp(){
		var http_request = false;
		//开始初始化XMLHttpRequest对象
		if(window.XMLHttpRequest) { //Mozilla 浏览器
			http_request = new XMLHttpRequest();
		}
		else if (window.ActiveXObject) { // IE浏览器
			try {
				http_request = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
				try {
					http_request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
		if (!http_request) { // 异常,创建对象实例失败
			window.alert("不能创建XMLHttpRequest对象实例.");
			return false;
		}
		http_request.onreadystatechange = processRequest ;
		
		return http_request;
}

function sendRequest(url,id) {
		xmlrequest = createXmlhttp();
		boxId=id;
		xmlrequest.open("GET", url, true);
		xmlrequest.send(null);
}	

function processRequest() {
	if (xmlrequest.readyState == 4) { // 判断对象状态
            if (xmlrequest.status == 200) { 
				processDiv(xmlrequest.responseTEXT);				
			}
	}
} 

function showMessage(num1,num2){//显示已经显示在页面上的表格,和已经导出
	$("messageBox").innerText="已经生成"+num1+"份表报,生成完毕可以执行导出。";
	if(num1>=13){
		$("messageBox").innerText="成功生成全部表报,成功导出"+num2+"份表报。";
		$("wordButton").disabled=false;
		$("excelButton").disabled=false;
		$("wordButtonNoImg").disabled=false;
	}	
	if(num2>=13){
		$("messageBox").innerText="成功生成全部表报,成功导出全部表报。";
	}	
}

function processDiv(responseText){
	$("Navigation"+boxId).innerHTML=responseText;
	if(boxId<14){//当前的取出后,继续操作取下一个报表的table和图表
		showMessage(boxId,0);
		boxId++;
		sendRequest(pageUrlList[boxId],boxId);
	}
}

function getDeptChind(url){
	thisId=url;
	sendRequest(url);
}

var pageUrlList = new Array();
pageUrlList[1]="provinceDayRevenue.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[2]="cityDayRevenue.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[3]="provinceNewUser.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[4]="cityNewUser.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[5]="provinceNewBill.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[6]="cityNewBill.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[7]="provinceQuotient.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[8]="cityQuotient.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[9]="provinceCallQuotient.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[10]="provinceOnlyIncrease.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[11]="cityCallQuotient.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[12]="cityOnlyIncrease.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[13]="provinceUserAway.jsp?date1=<%=thisMt.getThisMonthDate()%>";
pageUrlList[14]="cityUserAway.jsp?date1=<%=thisMt.getThisMonthDate()%>";
sendRequest(pageUrlList[1],1);
 </script>
 <script type="text/javascript">
function tableToExcel() { 
window.clipboardData.setData("Text",document.all('result').outerHTML);
try
{
var ExApp = new ActiveXObject("Excel.Application")
var ExWBk = ExApp.workbooks.add()
var ExWSh = ExWBk.worksheets(1)
ExApp.DisplayAlerts = false
ExApp.visible = true
}  
catch(e)
{
alert("您的电脑没有安装Microsoft Excel软件!")
return false
} 
 ExWBk.worksheets(1).Paste;
 }
 </script>

分享到:
评论
1 楼 thoriod 2008-01-16  
随便说下,如果大家觉得这个代码恶心,丑陋,难看,不好,请给点意见(重构方案)。我会和我自己最终使用的代码比较来看,向前辈们学习

相关推荐

    office-js-docs-reference:Microsoft Office JavaScript API参考

    Office JavaScript API参考欢迎使用Office JavaScript API参考文档存储库。 为了获得最佳体验,建议您在上查看此内容。 注意:您可以在资源库中找到有关Office JavaScript API概念,快速入门,教程和操作指南的文档...

    JavaScript完全自学宝典 源代码

    示例描述:介绍JavaScript与Microsoft Office互操作的方法。 14.1.html 使用JavaScript向Word中写入内容。 14.2.html 使用JavaScript从Word中读取内容。 14.3.html 使用JavaScript向Excel文件中写入内容...

    SOAOFFICE - 微软 OFFICE 中间件

    开发人员能够节省宝贵的精力和时间,把它投放到更重要的业务逻辑和系统架构上,而控制Office的具体技术细节交给SOAOffice去做。 SOAOffice除了提供Word/Excel动态数据填充,Word/Excel数据导入导出,Word/Excel/...

    NodeJs之word文件生成与解析的实现代码

    1, officegen 模块可以为Microsoft Office 2007及更高版本生成Office Open XML文件。此模块不依赖于任何框架,您不需要安装Microsoft Office,因此您可以将它用于任何类型的 JavaScript 应用程序。输出也是流而...

    soaoffice示例代码

    需要在Ajax架构里调用Word/Excel的,包括服务器端和客户端Javascript都适用。 22.需要控制不同的用户在Word/Excel中不同的区域中编辑权限的; 23.需要在企业局域网内架设在线Office文档中心、知识管理的;

    word源码java-hsweb-framework:forkfromhttps://github.com/hs-web,主要用于学习

    word源码java hsweb-framework 后台管理基础框架,基于maven,spring-boot,mybatis 主要功能 基础dao,service,controller类,增删改查直接继承即可. 通用mybatis配置文件,支持多种条件查询自动生成,支持自动生成insert...

    企业后台管理基础框架 hsweb.zip

    自家:hsweb-commons :通用工具类hsweb-easy-orm :为动态表单设计的orm框架hsweb-expands-compress :文件压缩,解压操作hsweb-expands-office :office文档操作( excel读写,模板导出,word模板导出)hsweb-...

    mifirma-for-word:全面部署MiFirma插件

    如果您的问题是关于Office JavaScript API的,请确保将其标记为[office-js]。加入Microsoft 365开发人员计划获得免费的沙箱,工具和其他资源,这些资源用于为Microsoft 365平台构建解决方案。 获得90天免费的,可续

    docx:使用具有良好声明性API的JSTS轻松生成.docx文件。 适用于Node和在浏览器上

    使用JS / TS轻松生成.docx文件。 适用于Node和在浏览器上。 演示版 浏览器 以下是在浏览器环境中与基本HTML/JS一起使用的docx示例: 这是在Angular中使用docx的示例: 这是在React中使用docx的示例: (将图像...

    tableExport.jquery.plugin:jQuery插件可将html表导出为JSON,XML,CSV,TSV,TXT,SQL,Word,Excel,PNG和PDF

    tableExport.jquery.plugin ...CSV DOC文件 JSON格式 PDF格式 PNG SQL 硅通Kong 文本文件 ... XLSX(Excel 2007 Office Open XML格式) XML(Excel 2003 XML电子... script type =" text/javascript " src =" libs/js-xls

    tableExport.jquery.plugin:jQuery插件,用于将html表导出为JSON,XML,CSV,TSV,TXT,SQL,Word,Excel,PNG和PDF

    tableExport.jquery.plugin ...CSV DOC JSON格式 PDF格式 PNG SQL 硅通Kong 文本 ... XLSX(Excel 2007 Office Open ... script type =" text/javascript " src =" libs/FileSaver/FileSaver.min.js " &gt; &lt;/ script

    iWebOffice2003(PHP OCX版)

    实现了将Word, Excel融入IE浏览器中,更方便用户录入,而且有版本控制、痕迹保留,手写签名、电子印章、显示或隐藏批注等功能,同时支持预定模板和生成网络上的HTML功能,完整功能 主要功能表: 1 录入支持功能 ...

    LotusDomino学习笔记.doc

    26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多数据库检索...

    LotusDomino学习笔记(400页涵盖代理和公式使用)

    26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多数据库检索...

    docassemble-template-builder-addin:Microsoft Word加载项(2013+),可帮助为Docassemble.org指导的采访构建模板

    Docassemble模板生成器 这是一个Microsoft Word加载项(2013+),可帮助为指导的采访构建模板。 测试很容易! 要在Microsoft Word Online中测试此采访,请执行以下操作: 打开Word Online(例如,从OneDrive或...

    PDF-Xchange pro 4

    PDF-XChange[1]是一款功能强大的PDF转换工具,可以将各种类型的文件可以转化为PDF格式,并且还支持Word、Excel、图片以及多种视频格式。它具有丰富的配置和功能选项,而且非常的简单易用。它还能够当作打印机使用,...

    Lotus Domino WEB 开发技术积累-DOC(313页)

    26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多数据库检索...

    Lotus Domino WEB详细 学习笔记

    26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多...

    database-export:基于SpringBoot的开源数据库表结构导出word文档工具

    database-export V2.1.0database-export是一款能生成数据库结构文档的开源springboot工程,能支持最新的数据库版本,可以导出支持office2007版本以上的docx格式的文档项目使用技术JDK1.8VUE2.0Element-...

    asp.net知识库

    如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然...

Global site tag (gtag.js) - Google Analytics