金格插件WebOffice2015使用体会
最近一段時間,在項目中集成了WebOffice2015的插件。有些心得體會,在這里和大家分享一下,不喜勿噴~~~~~~~~
原項目中之前上傳和下載附件集成的是WebOffice2003,由于新需求是實現(xiàn)文檔(word)的在線編輯功能,所以這里集成WebOffice官網(wǎng)http://www.goldgrid.com/jinge_download/Index.aspx?num=5&firstid=11&flag=0&secondid=67中最新的2015版本的插件。
第一:
去官網(wǎng)下載他們的demo,下載完成之后看到
這里就是所有的文檔、文件夾、隱藏目錄、文件等
第二:
如果之前開發(fā)環(huán)境已經(jīng)集成了2003或者版本比2015低的插件,這里需要更換版本(后面第三點是沒有集成過的做法)。具體做法:
2.1?iWebOffice2015.cab 需要放置原先iWebOffice2003.cab(或者iWebOffice2003.ocx控件)作為替代使用。
2.2替換js,將iWebOffice2015.js拷貝到集成代碼目錄,與原始的
iWebOffice2003.js&iWebOffice2009.js放置在同一目錄,將集成控件的代碼中調(diào)用:
<script src="iWebOffice2003.js"></script>
<script src="iWebOffice2009.js"></script>
更換成:<script src="iWebOffice2015.js"></script>
2.3在DocumentEdit.jsp中增加iWebOffice2015控件OnReady事件,調(diào)用代碼如下:
?
<script language="javascript" for=WebOffice2015 event="OnReady()">
??? //獲取iWebOffice2015控件對象,WebOffice.FuncExtModule是iWebOffice2015控件擴展接口對象
???? WebOffice = document.getElementById("WebOffice2015");
???? webform.WebOffice = WebOffice.FuncExtModule;????????? //webform.WebOffice是之前03&09控件使用的對象
???? Load();????????? //避免頁面加載完,控件還沒有加載的情況
</script>?
2.4?在DocumentEdit.jsp中需要刪除OnLoad=”Load()”代碼:
<body bgcolor="#ffffff" onLoad="Load()" onUnload="UnLoad()">? <!--引導(dǎo)和退出iWebOffice-->
修改為:
<body bgcolor="#ffffff" onUnload="UnLoad()">? <!--引導(dǎo)和退出iWebOffice-->
2.5
修改程序中一些在iWebOffice2015不支持的事件,如
iWebOffice2003&iWebOffice2009中的OnMenuClick()事件需要更換成iWebOffice2015中OnCommand()事件:
iWebOffice2003中的代碼如下
<script language="javascript" for=WebOffice event="OnMenuClick(vIndex,vCaption)">
? if (vIndex==1){?
??? WebOpenLocal();???? //打開本地文件
? }
? if (vIndex==2){?
??? WebSaveLocal();???? //保存本地文件
? }
? if (vIndex==3){
??? SaveDocument();???? //保存正文到服務(wù)器上(不退出)
? }
? if (vIndex==5){?
??? WebOpenSignature(); //簽名印章
? }
? if (vIndex==6){?
??? WebShowSignature(); //驗證簽章
??}
? if (vIndex==8){?
??? WebSaveVersion();?? //保存版本
? }
? if (vIndex==9){?
??? WebOpenVersion();?? //打開版本
? }
? if (vIndex==11){
??? SaveDocument();???? //保存正文到服務(wù)器上
??? webform.submit();?? //然后退出
? }
? if (vIndex==13){?
??? WebOpenPrint();???? //打印文檔
??}
</script>
替換為:
<script language="javascript" for=WebOffice2015 event="OnCommand(ID, Caption, bCancel)">
? if (ID==1){?
??? WebOpenLocal();???? //打開本地文件
? }
? if (ID==2){?
??? WebSaveLocal();???? //保存本地文件
? }
? if (ID==3){
??? SaveDocument();???? //保存正文到服務(wù)器上(不退出)
? }
? if (ID==5){?
??? WebOpenSignature(); //簽名印章
? }
? if (ID==6){?
??? WebShowSignature(); //驗證簽章
? }
? if (ID==8){?
??? WebSaveVersion();?? //保存版本
? }
? if (ID==9){?
??? WebOpenVersion();?? //打開版本
? }
? if (ID==11){
??? SaveDocument(); ????//保存正文到服務(wù)器上
??? webform.submit();?? //然后退出
? }
? if (ID==13){?
??? WebOpenPrint();???? //打印文檔
? }
</script>??
第三:
如果是原項目中沒有任何版本的WebOffice的,直接集成最新的WebOffice2015即可,具體做法:
3.1
圖片中紅色框中的內(nèi)容是需要導(dǎo)入進項目中的。具體做法圖片中的文檔中也有介紹。我這里自己寫一點,大家可以參考一下。
將css包中導(dǎo)入、將js中的文件導(dǎo)入、將samples文件夾中OpenAndSave文件夾中的
導(dǎo)入。這個jsp頁面主要是負(fù)責(zé)word的在線編輯功能;將web-inf 中的lib下的jar包導(dǎo)入,這里后臺代碼主要是鏈接的Oracle數(shù)據(jù)庫,如果鏈接其他數(shù)據(jù)庫需要導(dǎo)入新的jar包。
核心處理類導(dǎo)入,
輔助類導(dǎo)入。至此全部導(dǎo)入和基礎(chǔ)工作就做完了。。。。接下來是具體項目的集成問題;上述問題需要注意的幾點:
1.如果項目中之前集成過,必須要升級版本至2015,如果沒有集成過,按照我上面寫的,或者文件夾中的文檔一步一步將jar包、js、css、處理類等放到具體的項目中
2.js的位置、css的位置等需要明確、到時候頁面中需要引入的時候不要引入錯誤的、不正確的位置。
3.隱藏的up和down目錄不用管、后期功能實現(xiàn)會自動創(chuàng)建
第四:頁面實現(xiàn):
4.1 打開文檔實現(xiàn)
找一個需要將功能集成的頁面,將“在線編輯”的功能集成。
首先引導(dǎo)到OpenAndSave_Word.jsp。之后在OpenAndSave_Word.jsp頁面中,引入剛才導(dǎo)入的js、css等文件。
<%@ page contentType="text/html; charset=utf-8" %> <%@ page import="java.io.*,java.text.*,java.util.*,java.sql.*,java.text.SimpleDateFormat,java.text.DateFormat,java.util.Date,javax.servlet.*,javax.servlet.http.*,DBstep.iDBManager2000.*" %> <%//自動獲取OfficeServer和OCX文件完整URL路徑String mHttpUrlName=request.getRequestURI();String mScriptName=request.getServletPath();String mServerName="OfficeServer";String mServerUrl="http://"+request.getServerName()+":"+request.getServerPort()+mHttpUrlName.substring(0,mHttpUrlName.lastIndexOf(mScriptName))+"/"+mServerName;//取得OfficeServer文件的完整URLSystem.out.println(mServerUrl);%><html> <head> <title>在線打開/保存Word文檔</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script src="../../js/WebOffice.js"></script><script type="text/javascript">var WebOfficeObj = new WebOffice2015(); //創(chuàng)建WebOffice對象 </script><script language="javascript">//有進度條打開文檔function Load(){try{WebOfficeObj.WebUrl = "<%=mServerUrl%>";WebOfficeObj.UserName = "演示人";WebOfficeObj.RecordID = "123456789";WebOfficeObj.FileName = "sample.doc";WebOfficeObj.FileType = ".doc"; //FileType:文檔類型 .doc .xlsWebOfficeObj.DebugMode = false; //開啟or關(guān)閉調(diào)試模式 true:開啟 false:關(guān)閉WebOfficeObj.ShowWindow = true; //true顯示進度條//false隱藏進度條WebOfficeObj.EditType = "1"; //設(shè)置加載文檔類型 0 鎖定文檔,1無痕跡模式,2帶痕跡模式WebOfficeObj.ShowMenu = 0;WebOfficeObj.ShowToolBar = 0;// WebOfficeObj.SetCaption(WebOfficeObj.UserName + "正在編輯文檔");SetGraySkin(); //設(shè)置控件皮膚if(WebOfficeObj.WebOpen()){StatusMsg(WebOfficeObj.Status);}}catch(e){StatusMsg(e.description);}}//無進度條打開文檔function LoadNoShowProgress(){try{WebOfficeObj.WebUrl = "<%=mServerUrl%>";WebOfficeObj.UserName = "演示人";WebOfficeObj.FileName = "sample.doc";WebOfficeObj.FileType = ".doc"; //FileType:文檔類型 .doc .xlsWebOfficeObj.DebugMode = false; //開啟or關(guān)閉調(diào)試模式 true:開啟 false:關(guān)閉WebOfficeObj.ShowWindow = false; //true顯示進度條//false隱藏進度條WebOfficeObj.EditType = "1"; //設(shè)置加載文檔類型 0 鎖定文檔,1無痕跡模式,2帶痕跡模式WebOfficeObj.ShowMenu = 0;WebOfficeObj.ShowToolBar = 0;// WebOfficeObj.SetCaption(WebOfficeObj.UserName + "正在編輯文檔");SetGraySkin(); //設(shè)置控件皮膚if(WebOfficeObj.WebOpen()){StatusMsg(WebOfficeObj.Status);}}catch(e){StatusMsg(e.description);}}//保存文檔function SaveDocument(){if (WebOfficeObj.WebSave()){ //交互OfficeServer的OPTION="SAVEFILE"WebOfficeObj.WebClose();window.close();}else{alert(WebOfficeObj.Status);StatusMsg(WebOfficeObj.Status);}}//設(shè)置頁面中的狀態(tài)值function StatusMsg(mValue) {try {document.getElementById('StatusBar').value = mValue;} catch (e) {return false;}}//煙槍灰皮膚function SetGraySkin(){//參數(shù)順序依次為:控件標(biāo)題欄顏色、自定義菜單開始顏色、自定義工具欄按鈕開始顏色、自定義工具欄按鈕結(jié)束顏色、//自定義工具欄按鈕邊框顏色、自定義工具欄開始顏色、控件標(biāo)題欄文本顏色(默認(rèn)值為:0x000000)if (!WebOfficeObj.WebSetSkin(0xdbdbdb, 0xeaeaea, 0xeaeaea, 0xdbdbdb, 0xdbdbdb, 0xdbdbdb, 0x000000))alert(WebOfficeObj.Status);}function OnUnLoad(){WebOfficeObj.WebClose();}//前后臺交互,key在后臺接收function SendMessage(){var info = window.prompt("請輸入要傳到服務(wù)器處理頁面上的內(nèi)容:","參數(shù)內(nèi)容");if (info==null){return false}WebOfficeObj.WebSetMsgByName("TESTINFO",info); //USERNAME在后獲取if(WebOfficeObj.WebSendMessage()){ // 交互信息為INPORTTEXTalert(WebOfficeObj.WebGetMsgByName("RETURNINFO")); //USERNAME值為對應(yīng)后臺的key}else{alert("客戶端Web發(fā)送數(shù)據(jù)包命令沒有合適的處理函數(shù)");}} </script><script language="javascript" for="WebOffice" event="OnReady()">WebOfficeObj.setObj(document.getElementById('WebOffice'));//給2015對象賦值Load();//避免頁面加載完,控件還沒有加載情況 </script><!--以下是多瀏覽器的事件方法 --> <script> function OnReady(){WebOfficeObj.setObj(document.getElementById('WebOffice'));//給2015對象賦值//Load();//避免頁面加載完,控件還沒有加載情況window.onload = function(){Load();} //IE和谷歌可以直接調(diào)用Load方法,火狐要在頁面加載完后去調(diào)用 } </script></head><body onbeforeunload="OnUnLoad()" onUnload="OnUnLoad();"><div style="width: 100%; height: 100%"><div style="width: 100%;"><input style="color:Red;" type=button value="無進度條打開文檔" onclick="OnUnLoad();LoadNoShowProgress()"><input style="color:Red;" type=button value="有進度條打開文檔" onclick="OnUnLoad();Load()"><input style="color:Red;" type=button value="保存文檔到服務(wù)器" onclick="SaveDocument()"><input style="color:Red;" type=button value="打開本地文檔(有窗口)" onclick="WebOfficeObj.WebOpenLocal()"><input style="color:Red;" type=button value="保存本地文檔(有窗口)" onclick="WebOfficeObj.WebSaveLocal()"><input style="color:Red;" type=button value="前后臺交互信息" onclick="SendMessage()"><input style="color:Red;" id="StatusBar" type="text" name="StatusBar" readonly style="WIDTH:40%"> |←狀態(tài)信息</div><div style="width: 100%; height: 98%;" ><script src="../../js/iWebOffice2015.js"></script></object></div></div> </body><script language="javascript">var i = document.getElementById('WebOffice').height =document.documentElement.clientHeight-50 +"px";document.getElementById('WebOffice').style.height = i;window.onresize = function(){var i = document.getElementById('WebOffice').height =document.documentElement.clientHeight-50 +"px";document.getElementById('WebOffice').style.height = i;};</script> </html>在這個頁面中,html部分不多解釋,需要的功能你就用,不用的直接注釋。不多解釋。這里只講在線打開文檔和在線編輯的兩個功能。實現(xiàn)童鞋想要實現(xiàn)別的功能的話,那你看到這里就關(guān)了吧。
html中有兩個關(guān)于文檔打開的功能,一個是無進度條打開文檔
<input style="color:Red;" type=button value="無進度條打開文檔" onclick="OnUnLoad();LoadNoShowProgress()">一個是有進度條打開文檔
<input style="color:Red;" type=button value="有進度條打開文檔" onclick="OnUnLoad();Load()">實際兩個是一個方法,大同小異,只是在配置參數(shù)的時候多了一個窗口加載時的配置,WebOfficeObj.ShowWindow = true;? 用一個就行。
自動保存(也就是在線編輯)這個方法是SaveDocument,實際也就是用到這兩個。下面進入正題直接貼代碼
官網(wǎng):
官網(wǎng)給的demo,這里WebOfficeObj這個對象的基本屬性配置以及賦值我就不多說了,說說我的做法:我這里是在load加載前,將需要打開的文檔的名稱(數(shù)據(jù)庫中的唯一標(biāo)識:時間戳+uuid)傳遞過來,也就是直接加載我所想要的文檔,不過這一點,WebOffice也已經(jīng)做到了,這個Load在頁面初始化的時候就已經(jīng)加載了。
我的代碼:
其中后期用到的最關(guān)鍵的就是fileName這個字段,里面存放了文檔的名稱,其他的:uploadPersion、contype、conid等等看你后期在核心處理類中想要什么再傳遞什么。。。。。。。。。。。。
jsp頁面中就這么點東西。。。配置完前期參數(shù)、屬性值接下來就是js文件夾中的核心js處理了
WebOfficeObj對象的WebOpen方法進入
官網(wǎng)的demo給的已經(jīng)很詳細(xì)了,所有的屬性值基本都有注釋
看到這里,之前頁面上賦值的對象,也存在這里,如果后期根據(jù)實際業(yè)務(wù)你需要更多的字段來存儲信息,在這里直接定義就好。
官網(wǎng)提供的demo文件基本都不用改什么,這里強調(diào)幾點,在這個方法中
this.WebOpen = function(mBoolean) {this.ConsoleOut("<WebOpen> 開始...");this.Status = "";var httpclient = this.obj.Http; // 設(shè)置http對象httpclient.Clear();this.WebSetMsgByName("USERNAME", this.UserName); // 加載UserNamethis.WebSetMsgByName("FILENAME", this.FileName); // 加載FileNamethis.WebSetMsgByName("FILETYPE", this.FileType); // 加載FileTypethis.WebSetMsgByName("RECORDID", this.RecordID); // 加載RecordIDthis.WebSetMsgByName("EDITTYPE", this.EditType); // 加載RecordIDthis.WebSetMsgByName("OPTION", "LOADFILE"); // 發(fā)送請求LOADFILEhttpclient.AddForm("FormData", this.GetMessageString()); // 這里是自定義json// 傳輸格式。this.WebClearMessage(); // 清除所有WebSetMsgByName參數(shù)this.sendMode = "OpenFile";this.ConsoleOut("<WebOpen> 開始下載文檔...");this.NewShowMenu(this.ShowMenu); //控制菜單欄是否可以顯示this.NewShowToolBar(this.ShowToolBar); //控制Office工具欄和自定義工具欄if (this.LOADFILE(httpclient)) // Http下載服務(wù)器文件{this.NewCopyType(this.CopyType); //控制是否可以復(fù)制this.NewUIControl(this.UIControl); //控制 2010保存跟另存為this.ConsoleOut("<WebOpen> 成功...");var httpclient = this.obj.Http;var ISO = httpclient.GetResponseHeader("ISO");// 獲取返回值if(this.FileType != ".ppt" && this.FileType != ".pptx"){this.VBASetUserName(this.UserName);}this.setEditType(this.EditType); //設(shè)置文檔編輯權(quán)限 0 、只讀不能復(fù)制 1、無痕跡打開 2、有痕跡打開 this.Status = "打開文檔成功"; // Status:狀態(tài)信息return true;} else {//this.Status = "打開文檔失敗"; // Status:狀態(tài)信息 由This.LOADFILE返回return false;}}? ? ? ? this.WebSetMsgByName("USERNAME", this.UserName); // 加載UserName
?? ??? ?this.WebSetMsgByName("FILENAME", this.FileName); // 加載FileName
?? ??? ?this.WebSetMsgByName("FILETYPE", this.FileType); // 加載FileType
?? ??? ?this.WebSetMsgByName("RECORDID", this.RecordID); // 加載RecordID
?? ??? ?this.WebSetMsgByName("EDITTYPE", this.EditType); // 加載RecordID
?? ??? ?this.WebSetMsgByName("OPTION", "LOADFILE"); // 發(fā)送請求LOADFILE
從jsp頁面中之前定義屬性獲取值。
if (this.LOADFILE(httpclient)) // Http下載服務(wù)器文件this.LOADFILE(httpclient))方法從服務(wù)器開始下載文件,代碼中
this.LOADFILE = function(httpclient) {this.Status = "";httpclient.ShowProgressUI = this.ShowWindow;this.ConsoleOut("<LOADFILE> 開始打開鏈接...");if (httpclient.Open(this.HttpMethod.Post, this.WebUrl, false)) // true// 異步方式// false同步{this.ConsoleOut("<LOADFILE> 鏈接打開成功,開始進行數(shù)據(jù)包發(fā)送...");// 這里采用異步方式打開文檔 if (httpclient.Send()) {this.ConsoleOut("<LOADFILE> 數(shù)據(jù)包發(fā)送成功...狀態(tài)值:"+httpclient.GetResponseHeader("MsgError"));if (httpclient.GetResponseHeader("MsgError") == "404") {this.ConsoleOut("<LOADFILE> 后臺未找到對應(yīng)文檔,開始創(chuàng)建一個空白文檔...");this.CreateFile();this.ConsoleOut("<LOADFILE> 空白文檔創(chuàng)建成功...");this.getOfficeVersion();// 打開文檔后,判斷當(dāng)前office版本httpclient.Clear();return true;}this.ConsoleOut("<LOADFILE> 開始將后臺文檔保存到本地...");/** , Math.round(Math.random() * 100000)*/if (this.hiddenSaveLocal(httpclient, this, false, false)) {var mSaveResult = this.WebOpenLocalFile(this.DownloadedFileTempPathName);if (mSaveResult == 0) { // 打開本地磁盤文件this.ConsoleOut("<LOADFILE> 文檔打開成功...");this.getOfficeVersion();// 打開文檔后,判斷當(dāng)前office版本return true;}else if(mSaveResult == 1){var windows = window.confirm("可能當(dāng)前授權(quán)碼錯誤,請確認(rèn)iWebOffice2015.js的授權(quán)是否正確(或亂碼)"+ "\r\r單擊“確定”關(guān)閉。單擊“取消”繼續(xù)。");this.Status = "可能當(dāng)前授權(quán)碼錯誤,請確認(rèn)iWebOffice2015.js的授權(quán)是否正確(或亂碼)";if (windows == 1) {window.close();return false;}}else if(mSaveResult == 2){var windows = window.confirm("沒有找到文檔,請確認(rèn)WebOpenLocalFile打開文檔的路徑是否正確"+ "\r\r單擊“確定”關(guān)閉。單擊“取消”繼續(xù)。");this.Status = "有找到文檔,請確認(rèn)WebOpenLocalFile打開文檔的路徑是否正確";if (windows == 1) {window.close();return false;}}else if(mSaveResult == 3){var windows = window.confirm("沒有權(quán)限導(dǎo)致文檔打開失敗,請用管理員身份運行瀏覽器后重試"+ "\r\r單擊“確定”關(guān)閉。單擊“取消”繼續(xù)。");this.Status = "沒有權(quán)限導(dǎo)致文檔打開失敗,請用管理員身份運行瀏覽器后重試";if (windows == 1) {window.close();return false;}}else if(mSaveResult == 4){var windows = window.confirm("文件可能損壞,請確定服務(wù)器文檔是否已經(jīng)損壞"+ "\r\r單擊“確定”關(guān)閉。單擊“取消”繼續(xù)。");this.Status = "文件可能損壞,請確定服務(wù)器文檔是否已經(jīng)損壞";if (windows == 1) {window.close();return false;}}else if(mSaveResult == 5){var windows = window.confirm("未安裝Office或者注冊表有損壞"+ "\r\r單擊“確定”關(guān)閉。單擊“取消”繼續(xù)。");this.Status = "未安裝Office或者注冊表有損壞";if (windows == 1) {window.close();return false;}}else if(mSaveResult == 6){var windows = window.confirm("文件被占用,請結(jié)束Office進程后重試"+ "\r\r單擊“確定”關(guān)閉。單擊“取消”繼續(xù)。");this.Status = "文件被占用,請結(jié)束Office進程后重試";if (windows == 1) {window.close();return false;}}else {this.ConsoleOut("<LOADFILE> 打開文檔時未知錯誤!錯誤碼為: "+ mSaveResult);var windows = window.confirm("打開文檔時未知錯誤!錯誤碼為: "+ mSaveResult+ "\r\r單擊“確定”關(guān)閉。單擊“取消”繼續(xù)。");this.Status = "打開文檔時未知錯誤!錯誤碼為: "+ mSaveResult;if (windows == 1) {window.close();return false;}}} else {// 失敗后,this.Status的值由hiddenSaveLocal返回this.Status = "保存文檔到本地 失敗";return false;}} else {this.Status = "數(shù)據(jù)包發(fā)送失敗!請檢查鏈接<" + this.WebUrl + ">是否正確或網(wǎng)絡(luò)是否暢通。";return false;}} else {this.Status = "打開鏈接<" + this.WebUrl + ">失敗!請檢查網(wǎng)絡(luò)是否暢通。";return false;}}加載文檔的原理:采用http請求的方式,采用異步來實現(xiàn)文檔加載:if (httpclient.Open(this.HttpMethod.Post, this.WebUrl, false)) // true。第一個參數(shù)固定不變,是模擬http的post請求、第二個參數(shù):this.WebUrl內(nèi)放置的即使我們的后臺核心處理類的地址、第三個參數(shù)是異步同步的設(shè)置;
加載文檔的核心處理類:這里后臺文件OfficeServer我們需要按實際業(yè)務(wù)需求更改一下,這里我直接貼我的代碼,由于我們只先說文檔打開,所以就只貼一部分代碼了,經(jīng)過http請求響應(yīng)的核心處理類OfficeServer;
加載文檔的核心處理方法:核心方法是protected void service(){
}
方法體:
logger.info("進入service方法");this.mCommand = "";this.mFileBody = null;this.mFilePath = request.getSession().getServletContext().getRealPath("/");try {if (request.getMethod().equalsIgnoreCase("POST")) {this.MsgObj.setSendType("JSON");//文件上傳this.MsgObj.Load(request);this.mOption = this.MsgObj.GetMsgByName("OPTION");this.mUserName = this.MsgObj.GetMsgByName("USERNAME");//20190403if (this.mOption.equalsIgnoreCase("LOADFILE")) {//如果是下載模式this.mRecordID = this.MsgObj.GetMsgByName("RECORDID");this.mFileName = this.MsgObj.GetMsgByName("FILENAME");this.MsgObj.MsgTextClear();this.mFilePath = this.mFilePath.replace('\\', '/');// web跟目錄this.mFilePath = this.mFilePath + "upload_files";String finalAdd =mFilePath+"/"+mFileName;if(MsgObj.MsgFileLoad(finalAdd)){System.out.println("文檔加載成功");}else{System.out.println("文檔加載失敗");}代碼中?this.mFilePath即使你tomcat下面的附件文件夾地址
接下來是?MsgObj.MsgFileLoad方法
public boolean MsgFileLoad(String fileName) throws IOException{File f = new File(fileName);if (!f.exists()) {throw new FileNotFoundException(fileName);}ByteArrayOutputStream bos = new ByteArrayOutputStream((int)f.length());BufferedInputStream in = null;try {in = new BufferedInputStream(new FileInputStream(f));int buf_size = 1024;byte[] buffer = new byte[buf_size];int len = 0;while (-1 != (len = in.read(buffer, 0, buf_size))) {bos.write(buffer, 0, len);}this.mFileBody = bos.toByteArray();return true;} catch (IOException e) {e.printStackTrace();throw e;} finally {try {in.close();} catch (IOException e) {e.printStackTrace();}bos.close();}}我們不需要修改什么地方。直接引用官網(wǎng)給的demo就行。
總結(jié):
一:js文件
1.1 頁面中需要引入的屬性設(shè)置
二:核心處理類
2.后臺文件需要修改的只是將?this.mFilePath 定義為自己的tomcat附件的文件夾地址
成果展示
頁面展示左上角根據(jù)實際業(yè)務(wù)需求,只開放了打開文檔(打開文檔之前提過,頁面初始化,帶著提前準(zhǔn)備的參數(shù),已經(jīng)打開)、保存到服務(wù)器兩個功能。
打開文檔之后,可以在線編輯文檔,word自己帶的功能,在這里全部都適用,這點不用擔(dān)心。
修改文檔之后就開始保存了,接下來就是保存文檔的正題。
4.2 在線編輯以及服務(wù)器保存實現(xiàn)
老樣子,直接貼代碼
OpenAndSave_Word.jsp中
//保存文檔function SaveDocument() {if (WebOfficeObj.WebSave()) { //交互OfficeServer的OPTION="SAVEFILE"WebOfficeObj.WebClose();window.close();} else {alert(WebOfficeObj.Status);StatusMsg(WebOfficeObj.Status);}}WebOffice.js中
處理方法:
方法體:
this.ConsoleOut("<WebSave> 保存文件...");this.ConsoleOut("<WebSave> 開始...");this.Status = "";var httpclient = this.obj.Http; // 設(shè)置http對象httpclient.Clear();//一如既往,這里是屬性賦值this.WebSetMsgByName("USERNAME", this.UserName);this.WebSetMsgByName("RECORDID", this.RecordID);this.WebSetMsgByName("TEMPLATE", this.Template);this.WebSetMsgByName("SUBJECT", this.Subject);this.WebSetMsgByName("AUTHOR", this.Author);this.WebSetMsgByName("HTMLPATH", this.HTMLPath);this.WebSetMsgByName("FILETYPE", this.FileType);this.WebSetMsgByName("OPTION", "SAVEFILE");this.WebSetMsgByName("FILENAME", this.FileName); // 加載FileName//判斷是否保存空文檔的方法if(this.WebSetAllowEmpty()){ //文檔保存到本地var mSaveResult = this.WebSaveLocalFile(this.getFilePath()+ this.FileName);if (!(mSaveResult == 0)) {this.ConsoleOut("<WebSave> 保存本地文檔失敗!錯誤代碼為:" + mSaveResult);this.Status = "保存本地文檔失敗!錯誤代碼為:" + mSaveResult;return false;}}else{alert("文檔沒有內(nèi)容,是否確定保存");}this.ConsoleOut("<WebSave> 將文檔保存到本地成功...");this.sendMode = "SaveFile";this.ConsoleOut("<WebSave> 開始將文檔保存到服務(wù)器...");// 判斷本地文件是否大于指定的文件大小,如果大于不保存if (this.WebSetMaxFileSize(this.FilePath + this.FileName)) {//這里需要將這個值傳遞到后臺var add = this.FilePath + this.FileName;//這里需要將本地隱藏目錄傳遞到后臺。如果單一傳遞路徑,json編譯會出錯,需要修改一下//var add = add.replace("\\","\\\\");var arrayStr = add.split("\\");this.WebSetMsgByName("FILEPATH",arrayStr);//開始保存到服務(wù)器了 if (this.SAVEFILE(httpclient, this.FilePath + this.FileName)) {this.ConsoleOut("<WebSave> 成功將文檔保存到服務(wù)器...");var ISO = httpclient.GetResponseHeader("ISO");// 獲取返回值this.Status = "成功將文檔保存到服務(wù)器";return true;} else {//STATUS 由this.SAVEFILE返回return false;}} else {this.Status = "保存失敗:MaxFileSize只能允許保存:<" + this.MaxFileSize / 1024+ ">" + "M";return false;}這里得插幾句我的思路和理解了。
所謂的在線編輯保存就是從服務(wù)器先獲得你需要修改的文檔也就是文檔模板,之后將模板加載出來,這個時候WebOffice會將文檔存放在一個叫做down的目錄中(win+r 輸入 %appdata% 看到一個)
文檔加載隱藏目錄 隱藏目錄之后我們開始文檔編輯,編輯完,WebOffice會將這個形成的臨時文件存放到隱藏目錄叫做up的文件夾中,我們點擊保存的時候,如果實際需求是不能覆蓋原先模板,我們將存放在up中的文件實際完整地址獲取到,將文件上傳到我們的tomcat附件目錄中,后期我們在數(shù)據(jù)庫中通過版本控制,實現(xiàn)每次加載的模板總是最新的模板(最后修改人上傳的文檔模板)。
說了幾句廢話,開始繼續(xù)貼代碼
OfficeServer.java中
//20190403 文檔在線編輯保存else if (this.mOption.equalsIgnoreCase("SAVEFILE")) {this.mRecordID = this.MsgObj.GetMsgByName("RECORDID");this.mFileName = this.MsgObj.GetMsgByName("FILENAME");this.mFileType = this.MsgObj.GetMsgByName("FILETYPE");String userName = this.MsgObj.GetMsgByName("USERNAME");//這里這個路徑 必須特殊處理掉String mFilePath = this.MsgObj.GetMsgByName("FILEPATH");this.mFileBody = this.MsgObj.MsgFileBody(); this.mFileSize = this.MsgObj.MsgFileSize();this.mFileDate = this.DbaObj.GetDateTime();this.MsgObj.MsgTextClear();//獲取tomcat下面附件的地址this.mFilePath = this.mFilePath.replace('\\', '/');// web跟目錄this.mFilePath = this.mFilePath + "upload_files"+"";String newPath =this.mFilePath+"/"+mFileName;//得到舊的文件地址(文件的隱藏目錄) 。String oldPath =mFilePath.replace(',', '/');//自己定義的方法,主要是存數(shù)據(jù)庫中if (SaveFile(this.mRecordID,this.mFileName, this.mFileType,this.mFileBody,this.mFileSize,this.mFileDate,userName, newPath,oldPath)) {System.out.println("文檔保存成功");}else{System.out.println("文檔保存失敗"); }}這個方法主要是實現(xiàn):獲取自己想要存入數(shù)據(jù)庫中的各個屬性值、獲得兩個文件存儲的完整目錄,為后期上傳做準(zhǔn)備。
private boolean SaveFile(String mRecordID,String mFileName,String mFileType,byte [] mFileBody,int mFileSize,String mFileDate,String userName,String newPath,String oldPath ) {boolean mResult = false;try {Connection myconn = ConnectionManager.getDefaultConnection();try {myconn.setAutoCommit(false);Statement stmt = myconn.createStatement();ResultSet rs = null;//參數(shù)賦值this.mFileType = mFileType;this.mUserName = userName;this.mFileName = mFileName;this.mFileSize = this.MsgObj.MsgFileSize();String mxId = Asstool.getMaxHirisunId();String uploadDate = Asstool.getSystemDatetimetostring();try {//判斷文檔之前是否上傳過String Sql = "select t.conid from ulob.slavefiles t "+" where t.pk_id='"+mRecordID+"' "+" order by t.uploaddate desc"; List list = SingleTableOperation.getSimpleRecords(Sql);if(list.size()>0){//此文檔之前上傳過//取出主表id 去查詢明細(xì)String conId = ((List)(list.get(0))).get(0).toString();//用之前存在子表中的字段更新即將插入的數(shù)據(jù)String sqlSelectMx = "select t1.* from ulob.slavefiles_version t1 "+" where t1.recordid='"+conId+"' "+" order by t1.history desc";List listMx = SingleTableOperation.getSimpleRecords(sqlSelectMx);if(listMx.size()>0){List listOne =(List) listMx.get(0);//ulob.slavefiles 主鍵 。作為子表的引用String recordId = listOne.get(0).toString();//人名String userName1 = this.mUserName;//版本號String history = listOne.get(5).toString();//表idString Mxid = mxId;//大小int fileSize = this.mFileSize;String fileName = (new Date()).getTime()+recordId+this.mFileType;//路徑不變。但是得截取只要純路徑 不含名字String filePath = listOne.get(3).toString();filePath = filePath.substring(0,filePath.lastIndexOf("/"));filePath = filePath+"/"+fileName;//String inedit = listOne.get(9).toString();try {//在線編輯 分為兩步:第一步插入數(shù)據(jù)庫 。第二步復(fù)制隱藏目錄下的文件到 系統(tǒng)的附件文件夾String insertSql =" insert into ulob.slavefiles_version "+ " (recordid,filedate,filebody,filepath,username,history,id,filesize,filename,isedit,edituser,editdata ) "+ " values('"+recordId+"',to_date('"+uploadDate+"','yyyy-mm-dd hh24:mi:ss'),empty_blob(),'"+filePath+"','"+userName1+"','"+ String.valueOf((Integer.parseInt(history)+1))+"','"+Mxid+"','"+fileSize+"','"+fileName+"','"+inedit+"','"+userName+"',to_date('"+uploadDate+"','yyyy-mm-dd hh24:mi:ss')) ";//更新TableOperation.ExecuteUpdateSQL(insertSql);rs = stmt.executeQuery("select filebody from ulob.slavefiles_version t where='"+ Mxid + "' for update");//實現(xiàn)在線編輯的第一部分:if (rs.next()) {Blob blob = rs.getBlob(1);OutputStream out = ((oracle.sql.BLOB) blob).getBinaryOutputStream();byte[] b = new byte[((oracle.sql.BLOB) blob).getBufferSize()];File file = new File(oldPath);InputStream fis = new FileInputStream(file);int len = 0;while ((len = fis.read(b)) != -1)out.write(b, 0, len);out.close();myconn.commit();mResult=true;}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();}finally {myconn.close();this.MsgObj.MsgFileSave(filePath);//zhazha}}}} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}} catch (SQLException e1) {e1.printStackTrace();} catch (Exception e1) {e1.printStackTrace();} } catch (Exception e1) {e1.printStackTrace();}return (mResult);}總結(jié):
保存文檔:第一部分,將數(shù)據(jù)存入數(shù)據(jù)庫;第二部分,獲取兩個路徑,將文件轉(zhuǎn)移;
this.MsgObj.MsgFileSave(filePath) 提供了文件的上傳,filePath是目標(biāo)文件的全路徑。
如果上面的工作全部完成了,那么恭喜你,你的項目走到這一步將出現(xiàn)一個巨大的bug。。。。。。。。。。。。。。。
WebOffice官網(wǎng)下載的demo在文檔保存的時候,你會發(fā)現(xiàn),保存到目標(biāo)目錄中的文件全是空文件,觀察后臺發(fā)現(xiàn)會出現(xiàn)一個錯誤
造成的原因:
public byte[] MsgFileBody() throws IOException{this.mFileBody = null;/* ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[4096];int n = 0;while (-1 != (n = this.fileContentStream.read(buffer))) {output.write(buffer, 0, n);}this.mFileBody = output.toByteArray();this.FFileSize = this.mFileBody.length;this.fileContentStream.close();*/return this.mFileBody;}在將文本封裝MsgFileBody中的時候,this.fileContentStream.close();將流關(guān)閉掉了,后期引入demo的時候,雖然數(shù)據(jù)庫中是存入了文本,但是保存目標(biāo)文件的時候,目標(biāo)文件因為劉關(guān)閉,獲取不到文本,所以出現(xiàn)保存空文本,正確的做法是將這段內(nèi)容注釋掉。
前提:采用的思路是我這種通過版本控制實現(xiàn)獲取最新上傳文件,以及數(shù)據(jù)庫中之存入版本號,文本內(nèi)容存不存都可以的方法。
以上就是全部內(nèi)容了。。。。。。。。。。。。。。。。。。。。。。不喜勿噴。。歡迎一起討論。。。。。。。。。。。
總結(jié)
以上是生活随笔為你收集整理的金格插件WebOffice2015使用体会的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php openssl 处理pkcs8,
- 下一篇: 2016-408-计组-有如下c语言程序