目 錄
<a target="_blank">一、工作原理...5</a>
<a target="_blank">1.1 開發流程...5</a>
<a target="_blank">1.2 web頁面調用控件:.6</a>
<a target="_blank">二、接口說明...7</a>
<a target="_blank">2.1 接口...7</a>
<a target="_blank">2.1.1 aboutbox.7</a>
<a target="_blank">2.1.2 acceptallrevisions.7</a>
<a target="_blank">2.1.3 closedoc.7</a>
<a target="_blank">2.1.4 dellocalfile.8</a>
<a target="_blank">2.1.5 getdocumentobject.8</a>
<a target="_blank">2.1.6 getfieldvalue.9</a>
<a target="_blank">2.1.7 gettempfilepath.9</a>
<a target="_blank">2.1.8 getrevcount.10</a>
<a target="_blank">2.1.9 getfilesize.10</a>
<a target="_blank">2.1.10 getbookmarkcount.10</a>
<a target="_blank">2.1.11 hidemenuitem.10</a>
<a target="_blank">2.1.12 httpinit.11</a>
<a target="_blank">2.1.13 httpaddpostfile.11</a>
<a target="_blank">2.1.14 httpaddpoststring.11</a>
<a target="_blank">2.1.15 httpaddpostcurrfile.12</a>
<a target="_blank">2.1.16 httppost.12</a>
<a target="_blank">2.1.17 insertfile.12</a>
<a target="_blank">2.1.18 isopened.13</a>
<a target="_blank">2.1.19 issaved.13</a>
<a target="_blank">2.1.20 loadoriginalfile.14</a>
<a target="_blank">2.1.21 openfiledlg.14</a>
<a target="_blank">2.1.22 protectdoc.15</a>
<a target="_blank">2.1.23 printdoc.15</a>
<a target="_blank">2.1.24 putsaved.15</a>
<a target="_blank">2.1.25 save.16</a>
<a target="_blank">2.1.26 saveto.16</a>
<a target="_blank">2.1.27 saveas.16</a>
<a target="_blank">2.1.28 setfieldvalue.17</a>
<a target="_blank">2.1.29 settrackrevisions.18</a>
<a target="_blank">2.1.30 showrevisions.18</a>
<a target="_blank">2.1.31 setcurrusername.18</a>
<a target="_blank">2.1.32 showdialog.18</a>
<a target="_blank">2.1.33 unprotectdoc(bstrstrpwd).19</a>
<a target="_blank">2.2 屬性...20</a>
<a target="_blank">2.2.1 doctype.20</a>
<a target="_blank">2.2.2 version.20</a>
<a target="_blank">2.2.3 appversion.20</a>
<a target="_blank">2.2.4 leventret.20</a>
<a target="_blank">2.2.5 ismodify.21</a>
<a target="_blank">2.2.6 showtoolbar.21</a>
<a target="_blank">2.2.7 lcontinue.21</a>
<a target="_blank">2.3 事件...21</a>
<a target="_blank">2.3.1 notifywordevent.21</a>
<a target="_blank">2.3.2 notifyctrlready.22</a>
<a target="_blank">2.3.3 notifytoolbarclick.22</a>
<a target="_blank">附錄:weboffice檔案http上傳原理...23</a>
weboffice是基于用戶端的ocx控件,它的功能是将office文檔(word、excel、wps)嵌入到浏覽器中,并調用office中各種接口,完成文檔編輯工作,然後使用控件的http接口模拟表單送出,發送到資料處理頁面(此文檔舉例為savedoc.asp頁,代碼見示範檔案),完成文檔的存檔工作。
├ 裝載控件 <object>...</ object >
├ 觸發初始化方法
<scriptlanguage=javascript for=weboffice1 event=notifyctrlready>
<!--
weboffice1_notifyctrlready()
//-->
</script>
├ 執行初始化方法,打開新文檔或裝載已經存在的文檔
functionweboffice1_notifyctrlready() {
document.all.weboffice1.loadoriginalfile("…","…");
}
├ 根據目前步驟,來決定是否進入修訂狀态,如果是修訂狀态,最好設定目前的使用者名
document.all.weboffice1.setcurrusername("張三");
document.all.weboffice1.settrackrevisions(1);
}
├ 填寫表單元素,編輯office文檔
├ 執行http上傳接口儲存表單元素和office文檔
//儲存文檔之前,如果需要接受修訂,需要調用
document.all.weboffice1.settrackrevisions(4);
//通過http接口上傳
document.all.weboffice1.httpinit();
document.all.weboffice1.httpaddpoststring("…","…");
document.all.weboffice1.httpaddpostcurrfile("…","…");
document.all.weboffice1.httppost("…")
├ savedoc.asp擷取表單資料和office進行資料庫操作,并傳回操作是否正确。
├ 根據savedoc.asp傳回值進行相應操作。
<object id=weboffice1 height=520width="100%" style="left: 0px; top: 0px"
classid="clsid:e77e049b-23fc-4db8-b756-60529a35fad5" codebase=weboffice.ocx#version=3,0,0,0>
<param name="_version"value="65536">
<param name="_extentx"value="2646">
<param name="_extenty"value="1323">
<param name="_stockprops"value="0"></object>
主要參數說明:
id 控件在網頁的别名,可以通過别名調用控件的方法、屬性
width 控件的寬度,可以使用絕對大小,如width="100px"。
height 控件的高度
codebase 設定控件自動下載下傳的路徑,使用者如果沒有安裝控件,系統會自動通路codebase的路徑下載下傳控件;“#version”後的是控件的版本,如果使用者目前的軟體版本低于“#version”後面的版本,系統也會自動下載下傳最新的控件
注意: 如果控件的width 和height屬性使用%表示,則要明确指明它所在的容器的大小,如把控件放到表格<td>内,則要明确指明表格<td>的width和height的絕對值。
原 型: void aboutbox();
功 能:顯示weboffice版本資訊
傳回值:
示 例:
document.all.weboffice1.aboutbox();
原 型: longacceptallrevisions();
功 能:接受目前文檔所有修訂
0:接受修訂成功
非零:接受修訂失敗
document.all.weboffice1.acceptallrevisions();
原 型: long closedoc(longblreqsaved);
功 能:關閉目前文檔
參 數:
blreqsaved:
0:關閉文檔,不儲存目前修改。
1:關閉文檔,儲存目前修改。
2:如果文檔已經被修改,顯示儲存文檔對話框,否則直接關閉。
其它:關閉文檔,儲存目前修改。
傳回值:
0: 失敗
非零: 成功
//關閉目前文檔,不儲存目前修改。
document.all.weboffice1.closedoc (0);
原 型: long dellocalfile(bstrstrfilepathname);
功 能:删除本地檔案
strfilepathname:本地檔案的絕對路徑。
0: 删除成功
非零: 删除失敗
document.all.weboffice1.dellocalfile("c:\\111.doc");
原 型: idispatch*getdocumentobject();
擷取文檔對象的activedocument對象,此接口非常重要,基本所有的vba功能都可以通過這個接口來實作。
參 數:
傳回值: activedocument對象的dispatch
/* 以下的javascript為采用activedocument的方式直接操作vba,向doc文檔的書簽中加入一個圖檔。
function addpicture(strmarkname,strbmppath,vtype)
在書簽位置插入圖檔,
strmarkname 書簽的名稱
strbmppath 圖檔的路徑
vtype 插入後的圖檔的樣式,5為浮動在文字上面
addpicture("test1","d:\\111.bmp",5);
addpicture("test1","d:\\111.bmp",128);
*/
{
//定義一個對象,用來存儲activedocument對象
var obj;
obj =new object(document.all.weboffice1.getdocumentobject());
if(obj!=null){
var pbookmarks;
// vab接口擷取書簽集合
pbookmarks = obj.bookmarks;
var pbookm;
// vab接口擷取書簽strmarkname
pbookm = pbookmarks(strmarkname);
var prange;
// vab接口擷取書簽strmarkname的range對象
prange = pbookm.range;
var prangeinlines;
// vab接口擷取書簽strmarkname的range對象的inlineshapes對象
prangeinlines = prange.inlineshapes;
var prangeinline;
// vab接口通過inlineshapes對象向文檔中插入圖檔
prangeinline = prangeinlines.addpicture(strbmppath);
//設定圖檔的樣式,5為浮動在文字上面
prangeinline.converttoshape().wrapformat.type = vtype;
delete obj;
}
原 型: bstrgetfieldvalue(bstr strfieldname, bstr strsheetname);
功 能:獲得書簽位置的數值
strfieldname:書簽的名字
strsheetname:預留字段(值為空)
傳回值:傳回書簽的值
//獲得書簽的值
var strfieldvalue=document.all.weboffice1.getfieldvalue("mark_1","")
原 型: bstrgettempfilepath();
功 能:獲得臨時檔案路徑
傳回值:目前檔案的臨時路徑
var strtemppath=document.all.weboffice1.gettempfilepath();
原 型: longgetrevcount();
功 能:擷取修訂節點的個數
傳回值:擷取修訂節點的個數
原 型: longgetfilesize (lpctstr strfilepath);
功 能:擷取本地檔案的大小
參 數:
var vlen = obj.getfilesize("c:\\111.doc");
原 型: longgetbookmarkcount();
功 能:擷取文檔中書簽的總數量
示 例:
原 型: longgetbook markinfo(lindex,itype);
功 能:擷取文檔中書簽的資訊
lindex:書簽的序号,從1開始
itype:擷取内容類型。0擷取書簽名,1擷取書簽值
原 型: long hidemenuitem(long lmenutype);
功 能:控制自有工具欄的顯示
lmenutype工具欄開關,采用32位的數字作為開關,當相關位為1的時候,按鈕顯示,為0是按鈕隐藏。
enum{
vnew = 0x01, //建立
vopen= 0x02, //打開
vsaveas= 0x04, //儲存
vprint= 0x10, //列印
vprintview= 0x20, //列印預覽
vreturn= 0x1000, //全屏
vshowhidemenu = 0x4000, //顯示/隐藏菜單
vfullscrean= 0x2000 //傳回
};
//隻顯示建立和全屏按鈕
object.hidemenuitem(0x01 + 0x1000);
原 型: long httpinit();
功 能:初始化上傳接口
//上傳前必須執行此方法
document.all.weboffice1.httpinit();
原 型: longhttpaddpostfile(bstr strname, bstr strfile);
功 能:http上傳相關(保留)
//上傳本地檔案c:\\111.doc
document.all.weboffice1.httpaddpostfile("111","c:\\111.doc")
原 型: longhttpaddpoststring(bstr strname, bstr strvalue);
功 能:添加要上傳的表單域
strname:表單域的名稱
strvalue:表單域的值
//添加表單域,可多次執行此方法
document.all.weboffice1.httpaddpoststring("doctitle",myform.doctitle.value);
原 型: longhttpaddpostcurrfile(string field, string newfilename);
功 能:添加要上傳的word或者excel檔案
參 數:
field:要上傳檔案的id
newfielname:上傳後的新檔案名。該參數可以為空,系統将自動為檔案命名
document.all.weboffice1.httpaddpostcurrfile("doccontent","");
原 型: bstr httppost(bstrstrhttpurl);
功 能:将目前表單和檔案資料送出到指定url路徑
strhttpurl: 處理表單和檔案資料的檔案url路徑
succeed:上傳成功
failed: 上傳失敗
//相對路徑
var returnvalue=document.all.weboffice1.httppost("../savedoc.jsp");
//絕對路徑
var returnvalue=document.all.weboffice1.httppost("http://127.0.0.1/savedoc.jsp")
原 形:short insertfile(lpctstr strfilepathname, shortncurpos)
功 能:插入合并檔案,和插入圖檔。
參 數:strfilepathname:
檔案或者圖檔的路徑,可以是http.或者ftp路徑
ncurpos:
位置和圖檔控制符。ncurpos 或者ncurpos -8
0: 目前位置
1: 檔案開頭
2: 檔案末尾
如果第四位為1:表示插入的是圖檔
0:正确
其他:錯誤
//檔案頭部
document.all.weboffice1.insertfile("http://xx.com/xx.doc",1);
//檔案尾部
document.all.weboffice1.insertfile("http://xx.com/xx.doc",2);
//目前光标位置
document.all.weboffice1.insertfile("http://xx.com/xx.doc",0);
document.all.weboffice1.insertfile("http://xx.com/xx.jpg",9);
document.all.weboffice1.insertfile("http://xx.com/xx.jpg",10);
document.all.weboffice1.insertfile("http://xx.com/xx.jpg",8);
原 型: long isopened();
功 能:判斷目前是否打開檔案
0:表示目前未打開文檔
非0:表示已經打開文檔
file_type_word = 11,
file_type_word =11,
file_type_excel= 12,
file_type_ppt = 13,
file_type_rtf = 14,
file_type_wps = 21,
file_type_pdf = 31,
file_type_unk = 127
var isopened=document.all.weboffice1.isopened();
原 型: long issaved();
功 能:判斷檔案是否被修改
0:檔案已被修改
非零:檔案未被修改
var issaved=document.all.weboffice1.issaved();
原 型: longloadoriginalfile(bstr pcfilenameorurl, bstr pctype);
功 能:建立、裝載office文檔
pcfilenameorurl:
要裝載檔案的本地路徑或者url,值為空表示建立文檔,如果是在http的web環境下,可以傳相對路徑.
pctype:
doc:打開、建立word檔案
xls:打開、建立excel檔案
ppt:打開、建立ppt 檔案
wps:打開、建立wps 檔案
0:失敗
非0:成功
// 通過url打開一個伺服器檔案,getdoc.asp代碼見示範檔案
document.all.weboffice1.loadoriginalfile("http://127.0.0.1/getdoc.asp?id=8","doc");
// 通過url打開一個伺服器檔案,相對路徑
document.all.weboffice1.loadoriginalfile("/getdoc.asp?id=8","doc");
document.all.weboffice1.loadoriginalfile("./getdoc.asp?id=8","doc");
// 建立excel
document.all.weboffice1.loadoriginalfile("","xls");
// 通過word打開本地檔案
document.all.weboffice1.loadoriginalfile("c:\\demo.doc","doc");
原 型: shortopenfiledlg();
功 能:打開本地檔案顯示在weboffice中
參 數:pcfilenameorurl:儲存的檔案路徑
//打開對話框
document.all.weboffice1.openfiledlg();
原 型: longprotectdoc(long lproorun, long ltype, bstr strpwd);
功 能:文檔保護
lproorun:
└ 1:為保護文檔
└ 0:為解鎖文檔
ltype :
└ 0 :文檔保護,隻允許修訂
└ 1 :文檔保護,隻允許批注
└ 2 :文檔完全保護,不允許任何操作
strpwd:文檔保護、解鎖時所需設定的密碼
// 保護文檔,隻允許修訂
document.all.weboffice1.protectdoc(1,0, "12345");
// 解鎖文檔
document.all.weboffice1.protectdoc(0,0, "12345");
原 型: long printdoc(longblshowdlg);
功 能:列印目前文檔
參 數:blshowdlg:
0:不顯示列印對話框,直接列印
非零:顯示列印對話框
0:列印失敗
非零:列印成功
//顯示列印對話框
document.all.weboffice1.printdoc(1);
原 型: longputsaved(boolean bsaved);
功 能:設定目前文檔的修改狀态
參 數:
0: 處于修改狀态
1: 處于儲存狀态
//設定目前文檔處于修改狀态
document.all.weboffice1.putsaved(0);
原 型: long save();
功 能:
将檔案儲存原來位置,第一次儲存時彈出對話框
0:儲存失敗
非零:儲存成功
document.all.weboffice1.save();
原 型: long saveas(bstrstrfilename, long dwfileformat);
功 能:儲存檔案到本地
strfilename: 要儲存的檔案路徑和檔案名
dwfileformat:儲存的檔案類型
└ 0 word類型
└ 2 txt檔案
└ 6 rtf檔案
└ -4143 excel類型
示 例:
document.all.weboffice1.saveas("c:\\test.doc",0); //另存為word檔案
document.all.weboffice1.saveas("c:\\test.txt",2); //另存為txt檔案
document.all.weboffice1.saveas("c:\\test.rtf",6); //另存為rtf檔案
document.all.weboffice1.saveas("c:\\test.xls",-4143); //另存為excel檔案
原 型: longsetfieldvalue(bstr strfieldname, bstr strvalue, bstr strsheetname);
功 能:添加書簽,套紅頭模闆
參 數:strfieldname:書簽的名字,對于excel檔案,此資料位單元格
strvalue:書簽的值,該處可以是個用于傳回資料的url,用于套紅頭模闆。對于excel檔案,如果插入的是圖檔,此數值為::jpg::+圖檔的路徑
strsheetname:指令的類型,對于excel檔案此數值為sheet的名稱
└ ::addmark:: 添加書簽
└::delmark:: 删除書簽
└::jpg:: 添加圖檔,可以利用這個來實作圖檔電子印章
└ ::file:: 調用本地或者url的檔案設定書簽值(套紅頭)
// 添加書簽mark_1,并為它指派
document.all.weboffice1.setfieldvalue("mark_1","北京","::addmark::");
// 為已存在的書簽mark_1指派
document.all.weboffice1.setfieldvalue("mark_1","電子簽章", "");
// 套本地紅頭
document.all.weboffice1.setfieldvalue("mark_1","c:\\test.doc", "::file::");
// 套服務端紅頭1,getdoc.asp頁用于傳回要裝載word的二進制值,代碼見示範檔案
document.all.weboffice1.setfieldvalue("mark_1","http://127.0.0.1/getdoc.asp?id=8", "::file::");
// 套服務端紅頭2
document.all.weboffice1.setfieldvalue("mark_1","http://127.0.0.1/test.doc","::file::");
//添加圖檔電子印章
document.all.weboffice1.setfieldvalue("mark_1","http://127.0.0.1/seal.bmp","::jpg::");
//在excel中添加圖檔
document.all.weboffice1.setfieldvalue("","::jpg::http://www.google.cn/intl/zh-cn/images/logo_cn.gif","");
原 型: longsettrackrevisions(long lvalue);
功 能:修訂文檔
lvalue:文檔修訂狀态
└ 1: 開始修訂文檔
└ 0: 進入非留痕狀态
└ 4:接受目前修訂
// 開始修訂
document.all.weboffice1.settrackrevisions(1);
// 接受修訂
原 型: longshowrevisions(long nnewvalue);
功 能:顯示、隐藏修訂
nnewvalue:要儲存的檔案路徑和檔案名
└ 1:顯示修訂
└ 0:隐藏修訂
示例:
document.all.weboffice1.showrevisions(0); //隐藏修訂
原 型: longsetcurrusername(bstr strcurrusername);
功 能:設定目前編輯word、excel的使用者名,主要用于修訂文檔,辨別不同人進行的不同操作
參 數:strcurrusername:目前編輯人的使用者名
示 例:document.all.weboffice1.setcurrusername("張三");
顯示對話框
dwindex:對話框的id數值,詳細的數值清單請參照附件。
原 型: long unprotectdoc(bstr strpwd);
功 能:解除目前文檔保護
參 數:strpwd文檔保護時所設定的密碼
0:解鎖成功
非零:解鎖失敗
document.all.weboffice1.unprotectdoc("12345");
原 型: longdoctype;
說 明:檔案類型,隻讀
數 值:
file_type_excel = 12,
原 型: bstrversion;
說 明:打開檔案的版本号,隻讀
數 值:
原 型: bool leventret;
說 明:見事件 notifytoolbarclick事件
原 型: boolismodify;
說 明:判斷文檔是否被修改,需要在loadorigarfile之前設定 optionflag|= 0x0400 才有效。
原 型: long lcontinue;
功 能:用于notifywordevent的處理函數中,可以終止相應事件的繼續執行
1:可以繼續執行(預設)
0:不是2007版本
//禁止關閉目前的word/excel/wps文檔
onnotifywordevent(bstrstreventname)
if(streventname == “documentbeforeclose”)
lcontinue = 0;
原 型: void notifywordevent(bstrstreventname);
說 明:捕獲部分word/excel/wps事件。
參數:streventnameàword/excel的事件名,可能是以下的數值
documentchange
documentbeforeclose
documentbeforeprint
documentbeforesave
備注:本事件在本版本擴充到excel和wps的支援,且可以終止該事件的繼續執行(使用屬性lcontinue)。
原 型: void notifyctrlready();
說 明:當控件準備完畢後觸發,一般在這個事件中完成初始化的操作。
原 型: voidnotifytoolbarclick(long iindex);
參 數:
long iindex : 工具欄按鈕id。
id_return 32769
id_new 32770
id_open 32771
id_saveas 32772
id_fullscrean 32773
id_print 32774
id_printview 32775
說 明:
(不适用于office2007)每個按鈕都有預設的處理動作,如果不希望觸發預設的處理動作,需要在此時間中設定屬性leventret = 0;
以下執行個體截獲了saveas的按鈕事件。
//1. 定義事件處理函數
<scriptlanguage=javascript for=weboffice1 vent=notifytoolbarclick(lcmd)>
weboffice1_notifytoolbarclick(lcmd)
//2. 截獲處理事件
functionweboffice1_notifytoolbarclick(lcmd) {
if(32772==lcmd){
document.all.weboffice1.leventret = 0;
}
weboffice檔案http上傳原理分析
weboffice控件使用了自身的檔案http上傳接口實作檔案和表單域的上傳儲存,本文将簡要介紹該上傳方式的原理和使用方法。注:weboffice的上傳接口和aip是一緻的。
原理
因為web頁面上的weboffice打開的檔案無法随表單記錄送出到處理頁面,是以我們把檔案模拟成表單的檔案域<input type=file …>,通過接口把檔案和表單元素發送到儲存記錄的頁面(過程類似表單的送出)。
主要上傳接口:
l httpinit();
該方法用于初始化上傳接口,不需要設定參數
l httpaddpoststring(string fieldname, string somevalue);
添加要送出的表單域, fieldname是要上傳表單域名稱,somevalue是表單域值
例一:
httpaddpoststring("username", "zhangsan");
它類似域表單域的
<input type=text name=username value=zhangsan>
例二:
httpaddpoststring("username", webform.username.value);
….
<form name= webform >
</form>
注意:如果使用 上傳接口,那麼form表單裡的表單域不會被送出到處理頁面。需要手工添加到上傳接口(httpaddpoststring接口),然後通過控件發送到處理頁面。例二使用了“webform.username.value”擷取表單域值。
l httpaddpostcurrfile(string filename, string rename);
添加目前weboffice編輯的檔案給上傳接口,該接口把檔案模拟到成一個表單的檔案域,并送出到處理頁面。
httpaddpostcurrfile("aipfile", "");
該接口模拟表單檔案域如下:
<input type=file name=aipfile >
注意:第二個參數為空表示控件自動為檔案命名,如:dj_temp.aip,如果需要重命名可以在第二個參數指明檔案名稱,也可在儲存頁面指定檔案名稱。
l httppost(string url);
執行上傳操作将檔案和表單域送出到url的頁面進行儲存操作,并擷取url頁面傳回的執行結果 (是否成功,可以根據這個結果來擷取伺服器端執行的結果)。
url支援絕對路徑和相對路徑。
相對路徑要以“./”或者“../”開頭。例如:./savedoc.asp
完整的上傳接口示範
function savedoc() {
var returnvalue; //儲存頁面的傳回值
document.all.weboffice1.httpinit(); //初始化http引擎
// 添加相應的post元素
document.all.weboffice1.httpaddpoststring("username", webform. username.value);
// 添加上傳檔案
document.all.weboffice1.httpaddpostcurrfile("aipfile ","");
// 送出上傳檔案
returnvalue = document.all.weboffice1.httppost("../savedoc.jsp");
if("true" == returnvalue){
alert("檔案上傳成功");
} else {
alert("檔案上傳失敗")
}
關于儲存
weboffice上傳接口将資料流以http方式送出到儲存頁面,至于對資料處理就和普通的檔案上傳處理一樣了,具體代碼參考附件(asp和jsp的實作)。
論壇:http://forum.dianju.cn/