Kela's Blog

                      前面的路很坎坷,但畢竟是條路.也許走過這一段就會(huì)發(fā)現(xiàn),走過去就是夢(mèng)想中的地方.因此堅(jiān)持成為此刻唯一能做且必須去做的事情.
          posts - 9, comments - 27, trackbacks - 0, articles - 15

                 在最近的一個(gè)項(xiàng)目中需要將一段字符類型的文本存為word,html并要將word的內(nèi)容保存在數(shù)據(jù)庫中,于是就有了如下的一個(gè)工具類,希望能對(duì)碰到這樣需求的朋友提供點(diǎn)幫助。
                 匆匆忙忙的就copy上來了,沒有做一些刪減,有一些多余的東西,有興趣的朋友可以自行略去。我的注釋相對(duì)比較清楚,可以按照自己的需求進(jìn)行組合。
                在操作word的地方使用了jacob(jacob_1.9),這個(gè)工具網(wǎng)上很容易找到,將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;

          /**
           * 說明: 對(duì)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();
              }

              /**
               * 關(guān)閉文檔
               */
              public void closeDocument() {
                // 0 = wdDoNotSaveChanges
                // -1 = wdSaveChanges
                // -2 = wdPromptToSaveChanges
                Dispatch.call(document, "Close", new Variant(0));
                document = null;
              }

              /**
               * 關(guān)閉word
               *
               */
              public void closeWord() {
                 Dispatch.call(MsWordApp, "Quit");
                 MsWordApp = null;
                 document = null;
              }
           
              /**
               * 插入文本
               * @param textToInsert 文本內(nèi)容
               */
              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轉(zhuǎn)換成html
               * @param htmlFilePath
               */
              public void wordToHtml(String htmlFilePath) {
                   Dispatch.invoke(document,"SaveAs", Dispatch.Method, new Object[]{htmlFilePath,new Variant(8)}, new int[1]);
               }

              /**
               * 保存word的同時(shí),保存一個(gè)html
               * @param text 需要保存的內(nèi)容
               * @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("錯(cuò)誤 - 對(duì)word的操作發(fā)生錯(cuò)誤");
                   log.error("原因 - " + ex.getMessage());
                   throw new LTOAException(LTOAException.ERR_UNKNOWN, "對(duì)word的操作發(fā)生錯(cuò)誤("
                              + this.getClass().getName() + ".wordAsDbOrToHtml())", ex);
               } finally {
                   closeDocument();
                   closeWord();
               }
            
             }

             /**
              * 將word保存至數(shù)據(jù)庫
              * @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("錯(cuò)誤 - 表 Document_File 更新數(shù)據(jù)發(fā)生意外錯(cuò)誤");
                      log.error("原因 - " + ex.getMessage());
                      throw new LTOAException(LTOAException.ERR_UNKNOWN,
                             "表Document_File插入數(shù)據(jù)發(fā)生意外錯(cuò)誤("
                              + this.getClass().getName() + ".wordAsDatabase())", ex);
                   } finally {
                       pool.closePrepStmt(pstmt);
                       pool.closeConnection(conn);
                  }
              }
           
             /**
              * 得到一個(gè)唯一的編號(hào)
              * @return 編號(hào)
              */
             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 文件編號(hào)
               * @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;
              }
          }

          Feedback

          # re: java生成word,html文件并將內(nèi)容保存至數(shù)據(jù)庫  回復(fù)  更多評(píng)論   

          2006-03-02 14:01 by chinyon
          你的文章給了我很大的啟發(fā)。但我下載不到1.9的版本,用1.7的時(shí)候出現(xiàn)很多問題,請(qǐng)問能否發(fā)給我一份。
          qy@mail.nwpu.edu.cn
          qq:27551283
          十分感謝。

          # re: java生成word,html文件并將內(nèi)容保存至數(shù)據(jù)庫  回復(fù)  更多評(píng)論   

          2006-10-09 10:58 by 小徐
          thanks

          # re: java生成word,html文件并將內(nèi)容保存至數(shù)據(jù)庫  回復(fù)  更多評(píng)論   

          2007-07-30 08:33 by 安利
          您的博客頂強(qiáng),以后得多來學(xué)習(xí)下!

          # re: java生成word,html文件并將內(nèi)容保存至數(shù)據(jù)庫  回復(fù)  更多評(píng)論   

          2008-01-18 19:07 by 浪子
          哥們,要是把模板中圖片也生成出來呢?不顯示而是一個(gè)空的框框,請(qǐng)教下,有誰知道怎么辦呢?謝謝!我的郵件是 wangl@95068.com

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          分享到:
          主站蜘蛛池模板: 江川县| 龙山县| 福安市| 唐海县| 夏津县| 攀枝花市| 云和县| 四川省| 扎囊县| 湟中县| 青浦区| 武陟县| 九龙县| 石渠县| 始兴县| 金川县| 景德镇市| 宁乡县| 驻马店市| 都兰县| 修文县| 无棣县| 报价| 应城市| 屏东县| 巴东县| 林芝县| 建德市| 株洲县| 西宁市| 苏尼特右旗| 西畴县| 山东| 临城县| 江陵县| 龙门县| 湖北省| 修武县| 龙南县| 沛县| 松原市|