首頁 web前端 js教程 javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印_javascript技巧

javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印_javascript技巧

May 16, 2016 pm 07:03 PM
js word

由于时间比较紧,没多的时候去学习研究上述工具包,现在用javascript操作ActiveXObject控件,用替换word模板中的书签方式解决。

最近有需求将数据导出到word里,然后编辑打印。
想过几种方案:
1.使用jacob。
2.使用apache的poi。
3.使用itext。
由于时间比较紧,没多的时候去学习研究上述工具包,现在用javascript操作ActiveXObject控件,用替换word模板中的书签方式解决。

前提条件:
1.浏览器安全级别降低,可以使用ActiveXObject控件。

2.装有office word。

目前实现了替换单个书签,多行表格书签,和图片,基本上满足需求。不过还有很多操作word的使用方法不太清楚,网上大部分都使用的VB,有不清楚的地方,大家可以交流。

下面说一下我的设计实现思路:

首先当然是定义word模板,在需要替换的地方加上标签。 菜单-插入-书签,输入属性名,如year,date,pic1,voList等等。
打印页面:
需要把打印的数据从后台取出,以单个vo(一个对象)为一组,或以voList(对象的列表集合)为一组 组织好页面上 再得到这些数据后进行替换。
数据组织形式如下:


 


  
  
  
  
 


 
  

   
   
   
   
   
  

 



使用:




注意:
替换图片的值需要解释一下:
1.可以设为相对本页面的路径如../zbgl/abc.png
2.如果是输出流,则需要把请求输出流的url映射成以图片格式结尾的。如/.../abc.do?id=123换成/../abc.png?id=123
可以在web.xml里配一个servlet,如以*.png的请求转成.do的。如:

public class PngDispatcherServlet extends HttpServlet {

 private static final long serialVersionUID = 6230740581031996144L;

  public void init() throws ServletException {

 } 

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws
        ServletException, IOException {
     doGet(request, response);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
        ServletException, IOException {

     //StringBuffer url = request.getRequestURL();
     StringBuffer url = new StringBuffer(request.getRequestURI());
     if(request.getQueryString() != null) { 
         url.append('?'); 
         url.append(request.getQueryString()); 
       } 
     String newUrl = url.toString().replaceAll(".png", ".do");
     ServletContext sc = getServletContext();
     RequestDispatcher rd = sc.getRequestDispatcher(newUrl); //定向的页面
     rd.forward(request, response); 
   } 
}

export2word.js代码:

/** 
 * 

 Title: 用word书签替换的方式将内容导出到word


 * 

 Description: **


 * 

 Copyright: Copyright (c) 2007-2010 


 * 

 Company: ** 


 * @author zhu
 * @version 1.0
 */
var baseVoListObj = function(){
 this.volist = new Array();
 this.cols = new Array();
 this.widths = new Array(); 
}

var WordApp = function(wordTplPath){
 var wordObj = new ActiveXObject("Word.Application");
 if(wordObj==null){
  alert( "不能创建Word对象!");
 }   
 wordObj.visible=false;
 this.wordObj = wordObj;
 this.docObj = this.wordObj.Documents.Open(getRootPath() + wordTplPath);
}

WordApp.prototype.closeApp = function(){
 if (this.wordObj !=null){
   this.wordObj.Quit(); 
 }
}

WordApp.prototype.replaceBookmark = function(strName,content,type){
 if (this.wordObj.ActiveDocument.BookMarks.Exists(strName)) {
  if (type != null && type == "pic") {//图片
            var objDoc = this.wordObj.ActiveDocument.BookMarks(strName).Range.Select();
            var objSelection = this.wordObj.Selection;
            objSelection.TypeParagraph();
   //alert(getRootPath()+content);
            var objShape = objSelection.InlineShapes.AddPicture(getRootPath()+content);
  }
  else {
   this.wordObj.ActiveDocument.BookMarks(strName).Range.Select();
   this.wordObj.Application.selection.Text = content;
  }
 }else{
  //alert("标签不存在");
 }
}

WordApp.prototype.replaceBookmarkUsevo = function(voObj){
 if(typeof voObj != "object"){
  alert("请输入正确的vo对象");
 }else{
  for(var i in voObj){
   this.replaceBookmark(i,voObj[i]);
  }
 }
}

WordApp.prototype.replaceBookmarkUsepicvo = function(voObj){
 if(typeof voObj !="object"){
  alert("请输入正确的vo对象");
 }else{
  for(var i in voObj){
   this.replaceBookmark(i,voObj[i],"pic");
  }
 }
}

WordApp.prototype.replaceBookmarkUsevolist = function(strName,voListObj){
 if(typeof voListObj != "object"){
  alert("参数应为数组类型");
 }else{ 
  var row = voListObj.volist.length;
  var col = voListObj.cols.length;
  var objDoc = this.wordObj.ActiveDocument.BookMarks(strName).Range;
  var objTable = this.docObj.Tables.Add(objDoc,row,col) ;//插入表格
  for (var i = 0; i < row; i++) {
   for(var j=0; j    //todo 列表里面如果有图片类型不支持,需要判断
    objTable.Cell(i+1,j+1).Range.InsertAfter(voListObj.volist[i][voListObj.cols[j]]);
    var width = voListObj.widths[j];
    if(width.indexOf("px")!=-1){
     objTable.Cell(i+1,j+1).Width = (width.substr(0,width.length-2)/100) * 28.35;//1厘米=28.35磅
    }   
   }
  }
  //objTable.AutoFormat(16);
  objTable.Borders.InsideLineStyle = 1
        objTable.Borders.OutsideLineStyle = 0;
 }
}

WordApp.prototype.getSingleVo = function(formName,arrayObj){//第二个参数可以为空,不填时默认为表单里的所有元素
 var formObj = document.forms[formName];
 if(formObj!=null){
  if(arrayObj!=null){
   if(arrayObj instanceof Array){
    var vo = {};
    for(var i=0;i     if(formObj.elements[arrayObj[i]]!= undefined ){
      eval("vo." + arrayObj[i] + " = formObj.elements[arrayObj[i]].value;");
     }    
    }
    //alert(objToString(vo));
    return vo;
   }else{
    alert("弟二个参数应为数组类型");  
   }
  }else{
   var vo = {};
   for(var i=0;i    eval("vo." + formObj.elements[i].name + " = formObj.elements[i].value;");
   }
   return vo;
  }
 }else{
  alert("第一个参数表示的表单不存在");
  return null;
 }
}

WordApp.prototype.getVoList = function (formName,arrayObj){//表单名,属性数组(可以为空)
 //var formArray = document.forms[formName];
 var formArray = document.getElementsByName(formName);
 if (formArray != null) {
  if (arrayObj instanceof Array) {
   var voListObj = new baseVoListObj();
   for(var i=0;i    var vo = {};
    for(var j=0;j     if(formArray[i].elements[arrayObj[j]]!= undefined ){
      eval("vo."+arrayObj[j]+" = formArray[i].elements[arrayObj[j]].value;");      
      if(i==0){//第一次的时候定义有效属性和宽度
       voListObj.cols.push(arrayObj[j]);
       voListObj.widths.push(formArray[i].elements[arrayObj[j]].style.width);
      }    
     }    
    }
    voListObj.volist.push(vo);
   }
   return voListObj;
  }else{
   var voListObj = new baseVoListObj();
   for(var i=0;i    var vo = {};
    for(var j=0;j     eval("vo."+formArray[i].elements[j].name+" = formArray[i].elements[j].value;"); 
     if(i==0){//第一次的时候定义宽度
      voListObj.cols.push(formArray[i].elements[j].name);
      voListObj.widths.push(formArray[i].elements[j].style.width);
     }   
    }
    voListObj.volist.push(vo);
   }
   return voListObj;
  }  
 }else{
  return null;
 }
}

function objToString(obj){
 if(obj instanceof Array){
  var str="";
  for(var i=0;i   str+="[";
   for(var j in obj[i]){
    str+=j+"="+obj[i][j]+" ";
   }
   str+="]\n";  
  }
  return str;
 }else if(obj instanceof Object){
  var str="";
  for(var i in obj){
   str+=i+"="+obj[i]+" ";
  }
  return str;  
 }
}

function getRootPath()
{
 var location=document.location; 
 if ("file:" == location.protocol) {
  var str = location.toString();
  return str.replace(str.split("/").reverse()[0], "");
 }
 var pathName=location.pathname.split("/");
 return location.protocol+"//"+location.host+"/"+pathName[1]+"/";
}
先说到这里吧,以后有更好的再更新,希望对大家有用。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

word自動換行怎麼取消 word自動換行怎麼取消 Mar 19, 2024 pm 10:16 PM

在word文件中進行編輯內容時可能會自動換行,如果這時候不調整的話,對於我們的編輯會帶來很大的影響,讓人十分頭疼,這是怎麼回事呢?其實是標尺的問題,下面小編就介紹word自動換行怎麼取消的解決方法,希望能幫助大家!開啟Word文檔,輸入文字後,嘗試複製並貼上時可能會導致文字跳到新行,這時需調整設定以解決該問題。 2.要解決這個問題,我們首先要知道有這個問題的原因。這時我們點選工具列下的視圖。 3.然後再點選下面的「標尺」選項。 4.這時候我們會發現,文檔的上方出現了一個標尺,標尺上面有幾個錐形標

Word怎麼顯示標尺以及標尺的操作方法詳解! Word怎麼顯示標尺以及標尺的操作方法詳解! Mar 20, 2024 am 10:46 AM

我們在使用Word的時候,為了編輯內容更好美觀,我們常常會使用標尺。要知道,在Word中的標尺包括水平標尺和垂直標尺,用於顯示和調整文件的頁邊距、段落縮排、製表符等。那麼,Word中的標尺怎麼顯示出來的呢?下面,我就來教大家設定標尺的顯示方法。有需要的同學趕快收藏起來吧!步驟如下:1、首先,我們需要把word標尺調出來,預設的word文件是不顯示word標尺的,我們只需要點選word中的【檢視】的按鈕。 2、然後,我們找到【標尺】的選項,勾選就可以了。這樣一來,word標尺就被我們調出來了!是不是

word文檔怎麼加手寫簽名 word文檔怎麼加手寫簽名 Mar 20, 2024 pm 08:56 PM

Word文件由於功能的強大被大家廣泛使用,word裡不但可以插入各種格式,比如圖片和表格等等,現在為了文件的完整性真實性,好多文件都需要在文檔末尾加入手工簽名,聽起來這麼複雜的問題要怎麼解決呢,今天小編就教大家word文檔怎麼加手寫簽名。使用掃描器、相機或手機對手寫簽名進行掃描或拍攝,然後透過PS或其他圖片編輯軟體對圖片進行必要的裁切處理。 2.在要插入手寫簽名的Word文件中選擇“插入—圖片—來自文件”,選擇裁切好的手寫簽名。 3.滑鼠雙擊手寫簽名圖片(或右鍵圖片選擇「設定圖片格式」),彈出「設定圖

如何為Word設定頁邊距 如何為Word設定頁邊距 Mar 19, 2024 pm 10:00 PM

辦公室軟體中Word是我們最常用的軟體之一,我們製作的文字文檔一般都會用Word進行操作,有些文檔按要求還需要提交紙質版,在進行打印之前,一定要把佈局設置好,才能呈現出更好的效果。那麼問題來了,Word設定頁邊距的方法是什麼呢?我們有具體的課程講解為大家解決疑惑。 1.開啟或新建一個word文檔,點選選單列上的「頁面佈局」選單。 2、點選「頁面設定」選項的「頁邊距」按鈕。 3.在清單中選擇常用的頁邊距。 4.如果清單中沒有合適的頁邊距,按一下「自訂邊距」。 5.彈出「頁面設定」對話框,在「頁邊距」選項分別輸

word中底紋設定在哪 word中底紋設定在哪 Mar 20, 2024 am 08:16 AM

我們平常常使用word來辦公,但是你是否知道word中底紋設定在哪呢?今天就來跟大家分享具體的操作步驟,朋友們快來看看吧! 1.首先,開啟word文檔,選取一段需要新增底紋的文字段落訊息,然後點選工具列上的【開始】按鈕,找到段落區域,點選右側的下拉按鈕,(如下圖紅色圈出部分所示)。 2.點選下拉框按鈕之後,在彈出的選單選項中,點選【邊框和底紋】選項,(如下圖紅色圈出部分所示)。 3.在彈出的【邊框和底紋】對話框中,點選【底紋】的這個選項,(如下圖紅色圈出部分所示)。 4.在填滿的那一欄,選擇顏色

word虛線怎麼畫 word虛線怎麼畫 Mar 19, 2024 pm 10:25 PM

word是我們辦公室常會用到的軟體,裡邊有很多功能,可以方便我們的操作,例如:大篇文章的話,我們可以使用裡邊的查找功能,知道全文裡邊某個字錯了,可以直接替換不用一個個去更改了;向上級交文檔的時候可以把文檔美化的更好看等等操作,下面小編就來給大家分享word虛線怎麼畫的步驟,大家一起來學習吧! 1.首先,我們打開電腦上的word文檔,如下圖所示:2.然後,在文檔裡邊輸入一串文字,如下圖紅色圈出部分所示:3.接下來,按住【ctrl+A】選取全部文字,如下圖紅色圈出部分所示:4.點選選單列上邊的【開始】

建議:優秀JS開源人臉偵測辨識項目 建議:優秀JS開源人臉偵測辨識項目 Apr 03, 2024 am 11:55 AM

人臉偵測辨識技術已經是一個比較成熟且應用廣泛的技術。而目前最廣泛的網路應用語言非JS莫屬,在Web前端實現人臉偵測辨識相比後端的人臉辨識有優勢也有弱勢。優點包括減少網路互動、即時識別,大大縮短了使用者等待時間,提高了使用者體驗;弱勢是:受到模型大小限制,其中準確率也有限。如何在web端使用js實現人臉偵測呢?為了實現Web端人臉識別,需要熟悉相關的程式語言和技術,如JavaScript、HTML、CSS、WebRTC等。同時也需要掌握相關的電腦視覺和人工智慧技術。值得注意的是,由於Web端的計

Word向下箭頭刪除的特定操作步驟! Word向下箭頭刪除的特定操作步驟! Mar 19, 2024 pm 08:50 PM

在日常辦公中,如果從網站複製了一段文字,直接貼上到Word中時,常會看到【向下箭頭】,這種【向下箭頭】可以透過選取後刪除,但是如果這種符號特別多,那麼有沒有一個快速刪除所有箭頭的方法呢?那麼今天我就來跟大家分享Word向下箭頭刪除的具體操作步驟!首先,Word中的【向下箭頭】實際上代表【手動換行符】。我們可以用【段落標記】符替換所有的【向下箭頭】,如下圖所示。 2.然後,我們選擇選單列上邊的【尋找和取代】選項,(如下圖紅色圈出部分所示)。 3.然後,點選【替換】指令,會彈出一個彈框,點選【特殊符號】

See all articles