一直在做一个很恶心的东西,到现在我都觉得恶心的东西,就是通过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>
分享到:
相关推荐
综上所述,JS操作Word生成表格涉及到的技术包括ActiveXObject、Office.js、XML解析以及文件操作。理解这些知识点,能够帮助开发者构建强大的文档处理工具,提升工作效率。在实际开发中,需要注意兼容性问题,因为...
附带的资源中,`PageOffice 客户端js开发帮助.CHM`提供了客户端JavaScript API的详细文档,可以帮助开发者更好地理解和使用PageOffice的客户端功能。`安装说明.txt`提供了安装和配置PageOffice的指南,`PageOffice ...
在JavaScript(JS)中直接调用Word文档进行打印主要涉及到Web应用程序与本地文件系统的交互以及浏览器的安全限制。本文将深入探讨这一主题,并提供一些实现这一功能的方法。 首先,理解JavaScript在浏览器环境中的...
3. **生成Word文档**:使用`jquery.wordexport.js`将格式化的HTML转换为Word兼容的格式,如.doc或.docx。这个过程涉及将HTML转换为MIME类型为"application/vnd.openxmlformats-officedocument.wordprocessingml....
在JavaScript(JS)中操作Word进行打印和导出是一项实用的技术,主要应用于Web应用程序与Microsoft Office集成的场景。以下是对这个主题的详细说明: 一、JS调用Word打印 JavaScript可以通过ActiveXObject对象在...
在动态页面`FileMaker.aspx`中,通过拖拽`FileMakerCtrl`控件到页面并设置其属性,如`ServerPage`、`SaveFilePage`和`JsFunction_OnProgressComplete`,以实现Word文档的打开、转换和保存功能。在后台代码中,通过`...
首先,你需要在项目中引入这个库,然后编写函数来处理HTML内容并生成Word文档。 2. **页面视图设置:** Word文档的页面视图可以是纵向或横向,这可以通过设置`pageOrientation`属性来完成。在Office.js中,你可以...
二维码生成和打印到Word上的技术涉及多个IT领域的知识点,包括二维码技术、编程语言处理、文本解析、Word自动化以及文档处理。下面将详细讲解这些关键点。 1. **二维码技术**:二维码(Quick Response Code)是一种...
在本项目中,我们将重点讨论如何使用PageOffice的FileMaker控件来动态填充Word模板并生成正式的Word文件。 首先,了解PageOffice的核心概念是至关重要的。PageOffice主要由服务器端组件和服务、客户端控件和...
JavaScript可以使用Microsoft的Office JavaScript API来操作Word文档。这个API允许开发者在Web浏览器中与Word交互,包括读取和修改文档内容、设置样式、插入图片等。例如,你可以使用`Word.run`方法来执行一系列操作...
利用JavaScript,我们可以实现这一功能,即通过客户端脚本直接生成或更新Word文档。这种方法尤其适用于那些希望减少用户在不同应用间切换时间的场景。 本文档将详细介绍如何使用JavaScript来创建一个简单的Web到...
本文将深入探讨如何利用C#和Microsoft Word来生成JS(JavaScript)注释,以便于提高代码可读性和团队协作效率。 首先,我们要理解JavaScript注释的重要性。在JS中,注释分为单行注释(//)和多行注释(/* ... */)...
在IT行业中,Office Word插件开发是一个重要的领域,它允许开发者通过自定义功能来扩展Word的基本功能,以满足特定需求。本"office word 插件开发demo"展示了一种应用场景,即试题编辑插件,该插件能帮助教育工作者...
- 动态更新:如果数据是动态的,你需要确保在每次生成Word文档时都更新图表和表格。 - 错误处理:处理可能出现的异常,如文件读写错误、数据格式不正确等。 在压缩包文件"echarPoiWord"中,可能包含了示例代码、...
使用JavaScript生成Word文档 - **技术背景**: 在Web应用中,有时我们需要将数据导出为Word文档格式,方便用户下载或打印。通过JavaScript可以实现这一功能,尤其是在客户端直接生成Word文件的情况下。 - **实现方法...
在IT领域,尤其是在文档处理和自动化办公中,PageOffice是一个强大的工具,它允许开发者通过JavaScript等客户端脚本语言与Microsoft Office应用程序(如Word)进行交互。这篇文档主要讲解了如何利用PageOffice通过...
5. **在线集成**:如果是在Web应用中,你可以利用Office Online或Google Docs等在线编辑工具的API,通过JavaScript来操作Word文档,但这通常需要用户授权和复杂的API集成。 总结起来,ECharts生成图片并插入到Word...
1. 对于生成Word文档,我们可以使用Apache POI库,这是一个强大的API,可以处理Microsoft Office格式的文件。 2. 添加依赖:在Maven项目中,添加Apache POI的依赖。 ```xml <groupId>org.apache.poi ...
对于JS生成Word,代码中也有类似的例子,创建一个Word文档并设置样式: ```javascript function wordcontorl(){ var WordApp = new ActiveXObject("Word.Application"); WordApp.Application.Visible = true; ...
在"Office寻找js"这个主题下,我们可以深入探讨JavaScript如何与Microsoft Office应用程序(如Word、Excel和PowerPoint)集成,以及如何利用它来自动化和增强Office操作。 首先,我们要理解的是,Microsoft Office...