利用js操作word2011年06月23日 星期四 下午 2:23 最近做的java項目中有用到word編輯的問題,很是棘手。
目前它的解決辦法包括一下幾種:1、使用jacob.dll和jacob.jar在服務器端實現word操作;2、js在客戶端操作word;3、掏錢買現成的針對java 語言開發的web office控件來實現。
我們先采用了第一種方法實現,但是在客戶哪里使用起來后發現一個很大的問題,就是經常讓tomcat宕機,導致整個系統癱瘓不能使用。其實導致宕機的原因可能很多,有可能是因為word的不穩定導致的,也有可能是jacob的bug導致的,也有可能是我們java寫的方法不合理導致的,等等一些原因,總之就是覺得在服務器斷操作word一旦有問題就會影響整個程序的運行,所以決定用js來實現word的操作。好了多的廢話不說,先上js代碼。
var myDocApp=null;//定義一個全局的變量
function word_onclick()
{
myDocApp =new ActiveXObject("word.Application"); //創建word對象
myDocApp.Documents.Open("d://cdb91b95-9f68-4c02-877c-3c481ac2331b.doc");//打開word
myDocApp.Application.Visible = false; //設置word打開后不可見
//word的標簽
var bookMarks=["certificateNo","clientName","applianceName","mode","outNo","manuFactory","approverImage","supervisorImage","verificateurImage"];
//替換對應標簽的值
var bookMarksValue=["0123456789","we前往額","水杯","250ml","cert-0010","威爾廠","d://402881942d082b8c012d0833bfa200c0.bmp","d://402881942d082b8c012d0833bfa200c0.bmp","d://402881942d082b8c012d0833bfa200c0.bmp"];
//對打開的word中的標簽進行遍歷替換
for(var i=0;i<bookMarks.length;i++)
{
var booktype="string";//標簽的類型,默認是string,還有一種是pic,說明是需要插入圖片的標簽
if((bookMarks[i]=="approverImage")||(bookMarks[i]=="verificateurImage")||(bookMarks[i]=="supervisorImage"))
{booktype="pic"}
//替換標簽並賦值
insertvaluetobookmarks(bookMarks[i],bookMarksValue[i],booktype );
}
//打開另外一個word並復制其全部內容粘貼到當前打開word的指定位置
inserTable("insertTable","d://4aac5f0d-16a2-457a-9258-4c260fa15b85.doc");
fillTable();
try{
myDocApp.ActiveDocument.SaveAs("d:\\JaveToWord.doc");
}catch(exception){
alert("瀏覽器安全設置過高,保存文件到本地失敗");
myDocApp.Documents.close();
myDocApp.Application.quit();
myDocApp=null;
window.close();
}
myDocApp.Documents.close();
myDocApp.Application.quit();
myDocApp=null;
}
//替換標簽並賦值
function insertvaluetobookmarks(bookMarksName,insertValue,booktype )
{
if(myDocApp.ActiveDocument.BookMarks.Exists(bookMarksName))
{
if (booktype != null && booktype == "pic") {//圖片
var objDoc = myDocApp.ActiveDocument.BookMarks(bookMarksName).Range.Select();
var objSelection = myDocApp.Selection;
//objSelection.TypeParagraph();
//alert(getRootPath()+content);
var objShape = objSelection.InlineShapes.AddPicture(insertValue);
}else{
myDocApp.ActiveDocument.BookMarks(bookMarksName).Range.Select();
myDocApp.Application.selection.Text=insertValue;
}
}else{
alert("輸入的標簽不存在");
return false;
}
}
function inserTable(bookMarksName,filepath)
{
//從另外一個word中拷貝,粘貼到當前word指定位置
//begin
if(myDocApp.ActiveDocument.BookMarks.Exists(bookMarksName))
{
var tableDocApp =new ActiveXObject("word.Application");
tableDocApp.Documents.Open(filepath);
tableDocApp.Application.Visible = false;
tableDocApp.Selection.WholeStory();
tableDocApp.Selection.Copy();
myDocApp.ActiveDocument.BookMarks(bookMarksName).Range.Select();
myDocApp.Application.selection.Paste();
tableDocApp.Documents.close();
tableDocApp.Application.quit();
tableDocApp=null;
}else{
alert(bookMarksName);
return false;
}
//end
}
//動態的給指定表格增加行
function fillTable()
{
var tableCount=myDocApp.ActiveDocument.Tables.Count;
alert(tableCount);
var table=myDocApp.ActiveDocument.Tables(tableCount);
for(var i=0;i<5;i++)
{
table.Rows(i+2).Range.Select();
myDocApp.Selection.Copy();
myDocApp.Selection.MoveDown();
myDocApp.Selection.Paste();
}
var rows=table.Rows;//選中table的行對象
var columns = table.Columns;//選中table的列對象
var rowcount=rows.Count;
var columnscount = columns.Count;
for(var i=0;i<rowcount-1;i++)
{
for(var j=0;j<columnscount;j++ )
{
//table.Cell(i+2,j+1).Range.Text="第"+i+"行,第"+j+"列";
table.Cell(i+2,j+1).Range.Text=j;//遍歷選中table的單元格並對其賦值
}
}
table.Columns(5).Select();//選中table的第5列
table.Columns(5).Delete();//刪除table的第5列
}