一直在做一个很恶心的东西,到现在我都觉得恶心的东西,就是通过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>
分享到:
相关推荐
Office JavaScript API参考欢迎使用Office JavaScript API参考文档存储库。 为了获得最佳体验,建议您在上查看此内容。 注意:您可以在资源库中找到有关Office JavaScript API概念,快速入门,教程和操作指南的文档...
示例描述:介绍JavaScript与Microsoft Office互操作的方法。 14.1.html 使用JavaScript向Word中写入内容。 14.2.html 使用JavaScript从Word中读取内容。 14.3.html 使用JavaScript向Excel文件中写入内容...
开发人员能够节省宝贵的精力和时间,把它投放到更重要的业务逻辑和系统架构上,而控制Office的具体技术细节交给SOAOffice去做。 SOAOffice除了提供Word/Excel动态数据填充,Word/Excel数据导入导出,Word/Excel/...
1, officegen 模块可以为Microsoft Office 2007及更高版本生成Office Open XML文件。此模块不依赖于任何框架,您不需要安装Microsoft Office,因此您可以将它用于任何类型的 JavaScript 应用程序。输出也是流而...
需要在Ajax架构里调用Word/Excel的,包括服务器端和客户端Javascript都适用。 22.需要控制不同的用户在Word/Excel中不同的区域中编辑权限的; 23.需要在企业局域网内架设在线Office文档中心、知识管理的;
word源码java hsweb-framework 后台管理基础框架,基于maven,spring-boot,mybatis 主要功能 基础dao,service,controller类,增删改查直接继承即可. 通用mybatis配置文件,支持多种条件查询自动生成,支持自动生成insert...
自家:hsweb-commons :通用工具类hsweb-easy-orm :为动态表单设计的orm框架hsweb-expands-compress :文件压缩,解压操作hsweb-expands-office :office文档操作( excel读写,模板导出,word模板导出)hsweb-...
如果您的问题是关于Office JavaScript API的,请确保将其标记为[office-js]。加入Microsoft 365开发人员计划获得免费的沙箱,工具和其他资源,这些资源用于为Microsoft 365平台构建解决方案。 获得90天免费的,可续
使用JS / TS轻松生成.docx文件。 适用于Node和在浏览器上。 演示版 浏览器 以下是在浏览器环境中与基本HTML/JS一起使用的docx示例: 这是在Angular中使用docx的示例: 这是在React中使用docx的示例: (将图像...
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 ...CSV DOC JSON格式 PDF格式 PNG SQL 硅通Kong 文本 ... XLSX(Excel 2007 Office Open ... script type =" text/javascript " src =" libs/FileSaver/FileSaver.min.js " > </ script
实现了将Word, Excel融入IE浏览器中,更方便用户录入,而且有版本控制、痕迹保留,手写签名、电子印章、显示或隐藏批注等功能,同时支持预定模板和生成网络上的HTML功能,完整功能 主要功能表: 1 录入支持功能 ...
26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多数据库检索...
26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多数据库检索...
Docassemble模板生成器 这是一个Microsoft Word加载项(2013+),可帮助为指导的采访构建模板。 测试很容易! 要在Microsoft Word Online中测试此采访,请执行以下操作: 打开Word Online(例如,从OneDrive或...
PDF-XChange[1]是一款功能强大的PDF转换工具,可以将各种类型的文件可以转化为PDF格式,并且还支持Word、Excel、图片以及多种视频格式。它具有丰富的配置和功能选项,而且非常的简单易用。它还能够当作打印机使用,...
26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多数据库检索...
26. 视图---excel,表单---word 32 27. 关于Web上的检索问题 35 28. 如何使用Notes与关系数据库进行信息交互? 37 29. 如何在IE里面实现notes中的 对话框列表? 39 30. LotusDomino环境下编写Web浏览器多...
database-export V2.1.0database-export是一款能生成数据库结构文档的开源springboot工程,能支持最新的数据库版本,可以导出支持office2007版本以上的docx格式的文档项目使用技术JDK1.8VUE2.0Element-...
如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然...