在最近的一個項目中需要將一段字符類型的文本存為word,html并要將word的內容保存在數據庫中,于是就有了如下的一個工具類,希望能對碰到這樣需求的朋友提供點幫助。 匆匆忙忙的就copy上來了,沒有做一些刪減,有一些多余的東西,有興趣的朋友可以自行略去。我的注釋相對比較清楚,可以按照自己的需求進行組合。 在操作word的地方使用了jacob(jacob_1.9),這個工具網上很容易找到,將jacob.dll放置系統(tǒng)Path中,直接放在system32下也可以,jacob.jar放置在classPath中。
代碼如下:WordBridge.java
/** * WordBridge.java */ package com.kela.util;
import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement;
import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; import com.kela.db.PoolingDataSource;
/** * 說明: 對word的操作 <p> * * @author kela.kf@gmail.com */ public class WordBridge { Log log = LogFactory.getLog("WordBridgt"); private ActiveXComponent MsWordApp = null; private Dispatch document = null; /** * 打開word * @param makeVisible, true顯示word, false不顯示word */ public void openWord(boolean makeVisible) { if (MsWordApp == null) { MsWordApp = new ActiveXComponent("Word.Application"); } Dispatch.put(MsWordApp, "Visible", new Variant(makeVisible)); }
/** * 創(chuàng)建新的文檔 * */ public void createNewDocument() { Dispatch documents = Dispatch.get(MsWordApp, "Documents").toDispatch(); document = Dispatch.call(documents, "Add").toDispatch(); }
/** * 關閉文檔 */ public void closeDocument() { // 0 = wdDoNotSaveChanges // -1 = wdSaveChanges // -2 = wdPromptToSaveChanges Dispatch.call(document, "Close", new Variant(0)); document = null; }
/** * 關閉word * */ public void closeWord() { Dispatch.call(MsWordApp, "Quit"); MsWordApp = null; document = null; } /** * 插入文本 * @param textToInsert 文本內容 */ public void insertText(String textToInsert) { Dispatch selection = Dispatch.get(MsWordApp, "Selection").toDispatch(); Dispatch.put(selection, "Text", textToInsert); }
/** * 保存文件 * @param filename */ public void saveFileAs(String filename) { Dispatch.call(document, "SaveAs", filename); }
/** * 將word轉換成html * @param htmlFilePath */ public void wordToHtml(String htmlFilePath) { Dispatch.invoke(document,"SaveAs", Dispatch.Method, new Object[]{htmlFilePath,new Variant(8)}, new int[1]); }
/** * 保存word的同時,保存一個html * @param text 需要保存的內容 * @param wordFilePath word的路徑 * @param htmlFilePath html的路徑 * @throws LTOAException */ public void wordAsDbOrToHtml(String text, String wordFilePath, String htmlFilePath) throws LTOAException { try { openWord(false); createNewDocument(); insertText(text); saveFileAs(wordFilePath); wordToHtml(htmlFilePath); } catch (Exception ex) { log.error("錯誤 - 對word的操作發(fā)生錯誤"); log.error("原因 - " + ex.getMessage()); throw new LTOAException(LTOAException.ERR_UNKNOWN, "對word的操作發(fā)生錯誤(" + this.getClass().getName() + ".wordAsDbOrToHtml())", ex); } finally { closeDocument(); closeWord(); } }
/** * 將word保存至數據庫 * @param wordFilePath * @param RecordID * @throws LTOAException */ public void wordAsDatabase(String wordFilePath, String RecordID) throws LTOAException {
Connection conn = null; PreparedStatement pstmt = null; PoolingDataSource pool = null; File file = null; String sql = ""; try { sql = " UPDATE Document_File SET FileBody = ? WHERE RecordID = ? "; pool = new PoolingDataSource(); conn = pool.getConnection(); file = new File(wordFilePath); InputStream is = new FileInputStream(file); byte[] blobByte = new byte[is.available()]; is.read(blobByte); is.close();
pstmt = conn.prepareStatement(sql); pstmt.setBinaryStream(1,(new ByteArrayInputStream(blobByte)), blobByte.length); pstmt.setString(2, RecordID); pstmt.executeUpdate(); } catch (Exception ex) { log.error("錯誤 - 表 Document_File 更新數據發(fā)生意外錯誤"); log.error("原因 - " + ex.getMessage()); throw new LTOAException(LTOAException.ERR_UNKNOWN, "表Document_File插入數據發(fā)生意外錯誤(" + this.getClass().getName() + ".wordAsDatabase())", ex); } finally { pool.closePrepStmt(pstmt); pool.closeConnection(conn); } } /** * 得到一個唯一的編號 * @return 編號 */ public String getRecordID() { String sRecordID = ""; java.util.Date dt=new java.util.Date(); long lg=dt.getTime(); Long ld=new Long(lg); sRecordID =ld.toString(); return sRecordID; } /** * 得到保存word和html需要的路徑 * @param systemType 模塊類型 givInfo, sw, fw * @param fileType 文件類型 doc, html * @param recID 文件編號 * @return 路徑 */ public String getWordFilePath(String systemType, String fileType, String recID) { String filePath = ""; File file = new File(this.getClass().getResource("/").getPath());
filePath = file.getPath().substring(0, file.getPath().length() - 15); if(systemType.equalsIgnoreCase("govInfo")) { if(fileType.equalsIgnoreCase("doc")) filePath = filePath + "/uploadFiles/govInfo/document/" + recID + ".doc"; else if(fileType.equalsIgnoreCase("htm")) filePath = filePath + "/HTML/govInfo/" + recID + ".htm"; } else if(systemType.equalsIgnoreCase("sw")){ if(fileType.equalsIgnoreCase("doc")) filePath = filePath + "/uploadFiles/sw/document/" + recID + ".doc"; else if(fileType.equalsIgnoreCase("htm")) filePath = filePath + "/HTML/sw/" + recID + ".htm"; } else if(systemType.equalsIgnoreCase("fw")) { if(fileType.equalsIgnoreCase("doc")) filePath = filePath + "/uploadFiles/fw/document/" + recID + ".doc"; else if(fileType.equalsIgnoreCase("htm")) filePath = filePath + "/HTML/fw/" + recID + ".htm"; } return filePath; } }
|