1、依賴的包,部署環境
html
2、後臺代碼實現java
import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * * <p>【導入word文件,解析word文件轉換成HTML】</p> * <p>條件:</p> * <p>備註:</p> * <p>例子:</p> * <p>日誌:</p> * * @author:zhu [2016年1月29日 下午2:50:28] */ public void importDocToHtml() { //啓動word ActiveXComponent axc = new ActiveXComponent("Word.Application"); StringWriter stringWriter = null; try { // doc臨時存放文件夾路徑 String realpath = ServletActionContext.getServletContext().getRealPath("/UserUploadFile/WordToHTML"); File tempfile = null; if (docFile != null) { String tempName = String.valueOf((new Date()).getTime()); tempfile = new File(new File(realpath), tempName + ".doc"); //判斷文件是否存在 if (!tempfile.getParentFile().exists()) { //建立文件 tempfile.getParentFile().mkdirs(); } //copy文件的建立的文件上 FileUtils.copyFile(docFile, tempfile); //設置word不可見 axc.setProperty("Visible", new Variant(false)); Dispatch docs = axc.getProperty("Documents").toDispatch(); //打開word文檔 Dispatch doc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] { docFile.getPath(), new Variant(false), new Variant(true) }, new int[1]) .toDispatch(); String htmlUrl = tempfile.getPath().substring(0, tempfile.getPath().lastIndexOf(".") + 1) + "html"; //做爲html格式保存到臨時文件 Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] { htmlUrl, new Variant(8) }, new int[1]); //下方若是報錯,去除f參數變量 //0不保存修改 -1 保存修改 -2 提示是否保存修改 Variant f = new Variant(0); Dispatch.call(doc, "Close", f); //刪除文件 //FileUtils.forceDelete(tempfile); File file = new File(htmlUrl); //讀取須要注意編碼 InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "gbk"); BufferedReader br = new BufferedReader(isr); String s = null; StringBuffer html = new StringBuffer(); while ((s = br.readLine()) != null) {//使用readLine方法,一次讀一行 html.append(s); } br.close(); Map<String, Object> result = new HashMap<String, Object>(); //由於一次讀一行的緣由,能夠標籤和屬性之間沒間隔,因此須要格式化 result.put("html", formatHTML(html.toString(), tempName)); // 操做成功的話,將文檔id返回 Struts2Utils.outJSON(result); } } catch (Exception e) { setErrMessage("導入Excel數據錯誤,請檢查數據!"); } finally { axc.invoke("Quit", new Variant[] {}); } } /** * * <p>【對當前html進行處理】</p> * <p>條件:</p> * <p>備註:若是有圖片會在html同目錄下生成一個存放圖片的文件夾</p> * <p>例子:</p> * <p>日誌:</p> * * @param html html的內容 * @param htmlName html文件名 * @return * @author:zhu [2016年2月3日 下午5:01:36] */ private String formatHTML(String html, String htmlName) { //截取出body中的內容 html = html.substring(html.indexOf("body"), html.lastIndexOf("body")); html = html.substring(html.indexOf(">") + 1, html.lastIndexOf("<")); //對src、style、lang進行處理,可能和標籤連接緊密 html = html.replaceAll("src", "\t src").replaceAll("style", "\t style").replaceAll("lang", "\t lang"); //圖片須要真是的路徑 html = html.replaceAll(htmlName, "../../UserUploadFile/WordToHTML/" + htmlName); return html; }
3、前臺實現app
前臺主要一個上傳,和獲取html代碼後直接賦值到編輯器上的功能。編輯器
我使用uploadify實現上傳,核心代碼post
$(function() { $("#fileUp").uploadify({ swf : '${request.contextPath}/resources/uploadify/uploadify.swf', uploader : 'hdAction!importDocToHtml.shtml', // 用於接收上傳文件的action auto : true, // 是否自動開始 上傳 buttonText : '導入Word', // 按鈕上的文字 debug : false, // 是否調試狀態 fileObjName : 'docFile', // action中的文件對象名 fileSizeLimit : (100*1024*1024), // 設置單個文件大小限制,單位爲byte。設置爲100m fileTypeDesc : '支持格式:*.doc', // 若是配置瞭如下的'fileExt'屬性,那麼這個屬性是必須的 fileTypeExts : '*.doc', // 容許的格式,如:*.jpg;*.gif;*.jpeg;*.png;*.bmp method : 'post', // 上傳數據的方法 multi : true, // 是否支持多文件上傳 onUploadSuccess : function(file, data, response) { var result=$.parseJSON(data); //eWebEditor編輯器賦值 $("#eWebEditor1").contents().find("body").find("#eWebEditor").contents().find("body").html(result.html); }, onError: function(event, queueID, fileObj) { alert("文件:" + fileObj.name + "上傳失敗!"); }, onUploadError : function(file,errorCode,errorMsg,errorString,swfuploadifyQueue) {// 上傳文件出錯是觸發(每一個出錯文件觸發一次) alert( '上傳文件出錯,id: ' + file.id + ' \r\n- 索引: ' + file.index + ' \r\n- 文件名: ' + file.name + ' \r\n- 文件大小: ' + file.size + ' \r\n- 類型: ' + file.type + ' \r\n- 建立日期: ' + file.creationdate + ' \r\n- 修改日期: ' + file.modificationdate + ' \r\n- 文件狀態: ' + file.filestatus + ' \r\n- 錯誤代碼: ' + errorCode + ' \r\n- 錯誤描述: ' + errorMsg + ' \r\n- 簡要錯誤描述: ' + errorString + ' \r\n- 出錯的文件數: ' + swfuploadifyQueue.filesErrored + ' \r\n- 錯誤信息: ' + swfuploadifyQueue.errorMsg + ' \r\n- 要添加至隊列的數量: ' + swfuploadifyQueue.filesSelected + ' \r\n- 添加至對立的數量: ' + swfuploadifyQueue.filesQueued + ' \r\n- 隊列長度: ' + swfuploadifyQueue.queueLength); }, onCancel: function(event, queueID, fileObj){ //alert("取消了" + fileObj.name); } }); })
<tr> <th></th> <td><input type='file' id='fileUp' name='fileUp' /></td> </tr>