熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java調用com組件操作word使用總結

2022-06-13   來源: Java核心技術 

  一准備工作

  先了解一下概念JACOB 就是 JAVACOM Bridge的縮寫提供自動化的訪問com的功能也是通過JNI功能訪問windows平台下的com組件或者win系統庫的這是一個開始於 年的開源項目的成果有很多使用者對該項目進行了修改做出了自己的貢獻

  Jacob下載地址?group_id=&package_id=

  我在這裡下載了Jacob和jacob的版本兩個版本

  這裡下載的是目前最新的Jacob的Release版

  另外java操作word方式還有(個人認為通過jacob最好自己可以擴展網上除poi之外幾乎全是javacom技術實現的):

  ():Apache POI Java API To Access Microsoft Format Files();對word處理不夠強處理Excel功能可以但是全是通過java完成的不需 要com組件支持;

  ():javaword 是一個在java程序中調用 MS Office Word 文檔的組件(類庫)該組件提供了一組簡單的接口以便java程序調用他的服務操作Word 文檔(好象也是用的javacom技術);

  ()web開發語言操作word的功能最好還是用第三方的控件 看看這個SOAOFFICE還可以使用js 寫VBA呢

  二安裝Jacob

  Jacob的安裝非常的簡單我們解開下載的jacob_zip在文件夾中找到jacobdll和jacobjar兩個文件如果是 Jacob則是jacobxdll(機和jacobxdll(位)和 jacobjar兩個文件Jacobdll直接放到系統的system文件夾下就行了連注冊都不用的(或者拷貝到jdk或者jre的bin目 錄下也行當前測試文件所在的目錄也行就是只要在javalibrarypath中就可以)而jacobjar設置到classpath中去就 可以了或者在IDE開發環境的工程中設置擴展庫也一樣的我是這樣使用的將jacobxdll或復制 到%Tomcat%\bin目錄下將jacobjar復制到%Tomcot%\Share\lib目錄下我使用過程中感覺放到這裡是一個最終解決 辦法當你放哪都有問題的時候我這樣用之後再沒有出過因為系統不一樣出現的各種各樣的問題當然你作的是web的項目

  注意使用jacob一寫要安裝word我裝的word如果是操作word就不用jacob了(好像這方面的API)

  對jacobdll幾種配置方法 (網上看到)

   ::

  把jacobdll文件復制到 windows\system 目錄下(注我用的時候這個方法不能運行)

   把jacobdll放入 Java\jdk_\jre\bin目錄下把jacobjar放入 Java\jdk_\jre\lib\ext目錄下可以正常運行

  把jacobdll放入 \glc\src目錄下把jacobjar放入WEBINF\lib目錄下也是可以正常運行

  三使用(以下是我改寫的一個word操作類希望有興趣的朋友完善記得發給我一份)

  //注意java操作word關鍵是定位操作對象;

  import comjacobactiveXActiveXComponent;

  import Dispatch;

  import Variant;

  /**

  * jacob操作MSword類

  * @author

  */

  public class WordBean {

  // word文檔

  private Dispatch doc;

  // word運行程序對象

  private ActiveXComponent word;

  // 所有word文檔集合

  private Dispatch documents;

  // 選定的范圍或插入點

  private Dispatch selection;

  private boolean saveOnExit = true;

  public WordBean()throws Exception{

  if (word == null) {

  word = new ActiveXComponent(WordApplication);

  wordsetProperty(Visible new Variant(false)); //不可見打開word

  wordsetProperty(AutomationSecurity new Variant()); //禁用宏

  }

  if (documents == null)

  documents = wordgetProperty(Documents)toDispatch();

  }

  /**

  * 設置退出時參數

  *

  * @param saveOnExit

  * boolean true退出時保存文件false退出時不保存文件

  */

  public void setSaveOnExit(boolean saveOnExit) {

  thissaveOnExit = saveOnExit;

  }

  /**

  * 創建一個新的word文檔

  *

  */

  public void createNewDocument() {

  doc = Dispatchcall(documents Add)toDispatch();

  selection = Dispatchget(word Selection)toDispatch();

  }

  /**

  * 打開一個已存在的文檔

  *

  * @param docPath

  */

  public void openDocument(String docPath) {

  closeDocument();

  doc = Dispatchcall(documents Open docPath)toDispatch();

  selection = Dispatchget(word Selection)toDispatch();

  }

  /**

  *只讀 打開一個保護文檔

  * @param docPath文件全名

  * @param pwd密碼

  */

  public void openDocumentOnlyRead(String docPath String pwd)throws Exception {

  closeDocument();

  // doc = Dispatchinvoke(documents Open DispatchMethod

  // new Object[]{docPath new Variant(false) new Variant(true) new Variant(true) pwd}

  // new int[])toDispatch();//打開word文件

  doc = DispatchcallN(documents Open new Object[]{docPath new Variant(false)

  new Variant(true) new Variant(true) pwd new Variant(false)})toDispatch();

  selection = Dispatchget(word Selection)toDispatch();

  }

  public void openDocument(String docPath String pwd)throws Exception {

  closeDocument();

  doc = DispatchcallN(documents Open new Object[]{docPath new Variant(false)

  new Variant(false) new Variant(true) pwd})toDispatch();

  selection = Dispatchget(word Selection)toDispatch();

  }

  /**

  * 把選定的內容或插入點向上移動

  *

  * @param pos

  * 移動的距離

  */

  public void moveUp(int pos) {

  if (selection == null)

  selection = Dispatchget(word Selection)toDispatch();

  for (int i = ; i < pos; i++)

  Dispatchcall(selection MoveUp);

  }

  /**

  * 把選定的內容或者插入點向下移動

  *

  * @param pos

  * 移動的距離

  */

  public void moveDown(int pos) {

  if (selection == null)

  selection = Dispatchget(word Selection)toDispatch();

  for (int i = ; i < pos; i++)

  Dispatchcall(selection MoveDown);

  }

  /**

  * 把選定的內容或者插入點向左移動

  *

  * @param pos

  * 移動的距離

  */

  public void moveLeft(int pos) {

  if (selection == null)

  selection = Dispatchget(word Selection)toDispatch();

  for (int i = ; i < pos; i++) {

  Dispatchcall(selection MoveLeft);

  }

  }

  /**

  * 把選定的內容或者插入點向右移動

  *

  * @param pos

  * 移動的距離

  */

  public void moveRight(int pos) {

  if (selection == null)

  selection = Dispatchget(word Selection)toDispatch();

  for (int i = ; i < pos; i++)

  Dispatchcall(selection MoveRight);

  }

  /**

  * 把插入點移動到文件首位置

  *

  */

  public void moveStart() {

  if (selection == null)

  selection = Dispatchget(word Selection)toDispatch();

  Dispatchcall(selection HomeKey new Variant());

  }

  /**

  * 從選定內容或插入點開始查找文本

  *

  * @param toFindText

  * 要查找的文本

  * @return boolean true查找到並選中該文本false未查找到文本

  */

  @SuppressWarnings(staticaccess)

  public boolean find(String toFindText) {

  if (toFindText == null || toFindTextequals())

  return false;

  // 從selection所在位置開始查詢

  Dispatch find = wordcall(selection Find)toDispatch();

  // 設置要查找的內容

  Dispatchput(find Text toFindText);

  // 向前查找

  Dispatchput(find Forward True);

  // 設置格式

  Dispatchput(find Format True);

  // 大小寫匹配

  Dispatchput(find MatchCase True);

  // 全字匹配

  Dispatchput(find MatchWholeWord True);

  // 查找並選中

  return Dispatchcall(find Execute)getBoolean();

  }

  /**

  * 把選定選定內容設定為替換文本

  *

  * @param toFindText

  * 查找字符串

  * @param newText

  * 要替換的內容

  * @return

  */

  public boolean replaceText(String toFindText String newText) {

  if (!find(toFindText))

  return false;

  Dispatchput(selection Text newText);

  return true;

  }

  /**

  * 全局替換文本

  *

  * @param toFindText

  * 查找字符串

  * @param newText

  * 要替換的內容

  */

  public void replaceAllText(String toFindText String newText) {

  while (find(toFindText)) {

  Dispatchput(selection Text newText);

  Dispatchcall(selection MoveRight);

  }

  }

  /**

  * 在當前插入點插入字符串

  *

  * @param newText

  * 要插入的新字符串

  */

  public void insertText(String newText) {

  Dispatchput(selection Text newText);

  }

  /**

  *

  * @param toFindText

  * 要查找的字符串

  * @param imagePath

  * 圖片路徑

  * @return

  */

  public boolean replaceImage(String toFindText String imagePath) {

  if (!find(toFindText))

  return false;

  Dispatchcall(Dispatchget(selection InLineShapes)toDispatch()

  AddPicture imagePath);

  return true;

  }

  /**

  * 全局替換圖片

  *

  * @param toFindText

  * 查找字符串

  * @param imagePath

  * 圖片路徑

  */

  public void replaceAllImage(String toFindText String imagePath) {

  while (find(toFindText)) {

  Dispatchcall(Dispatchget(selection InLineShapes)toDispatch()

  AddPicture imagePath);

  Dispatchcall(selection MoveRight);

  }

  }

  /**

  * 在當前插入點插入圖片

  *

  * @param imagePath

  * 圖片路徑

  */

  public void insertImage(String imagePath) {

  Dispatchcall(Dispatchget(selection InLineShapes)toDispatch()

  AddPicture imagePath);

  }

  /**

  * 合並單元格

  *

  * @param tableIndex

  * @param fstCellRowIdx

  * @param fstCellColIdx

  * @param secCellRowIdx

  * @param secCellColIdx

  */

  public void mergeCell(int tableIndex int fstCellRowIdx int fstCellColIdx

  int secCellRowIdx int secCellColIdx) {

  // 所有表格

  Dispatch tables = Dispatchget(doc Tables)toDispatch();

  // 要填充的表格

  Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))

  toDispatch();

  Dispatch fstCell = Dispatchcall(table Cell

  new Variant(fstCellRowIdx) new Variant(fstCellColIdx))

  toDispatch();

  Dispatch secCell = Dispatchcall(table Cell

  new Variant(secCellRowIdx) new Variant(secCellColIdx))

  toDispatch();

  Dispatchcall(fstCell Merge secCell);

  }

  /**

  * 在指定的單元格裡填寫數據

  *

  * @param tableIndex

  * @param cellRowIdx

  * @param cellColIdx

  * @param txt

  */

  public void putTxtToCell(int tableIndex int cellRowIdx int cellColIdx

  String txt) {

  // 所有表格

  Dispatch tables = Dispatchget(doc Tables)toDispatch();

  // 要填充的表格

  Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))

  toDispatch();

  Dispatch cell = Dispatchcall(table Cell new Variant(cellRowIdx)

  new Variant(cellColIdx))toDispatch();

  Dispatchcall(cell Select);

  Dispatchput(selection Text txt);

  }

  /**

  * 獲得指定的單元格裡數據

  *

  * @param tableIndex

  * @param cellRowIdx

  * @param cellColIdx

  * @return

  */

  public String getTxtFromCell(int tableIndex int cellRowIdx int cellColIdx) {

  // 所有表格

  Dispatch tables = Dispatchget(doc Tables)toDispatch();

  // 要填充的表格

  Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))

  toDispatch();

  Dispatch cell = Dispatchcall(table Cell new Variant(cellRowIdx)

  new Variant(cellColIdx))toDispatch();

  Dispatchcall(cell Select);

  String ret = ;

  ret = Dispatchget(selection Text)toString();

  ret = retsubstring( retlength()); //去掉最後的回車符;

  return ret;

  }

  /**

  * 在當前文檔拷貝剪貼板數據

  * @param pos

  */

  public void pasteExcelSheet(String pos) {

  moveStart();

  if (thisfind(pos)) {

  Dispatch textRange = Dispatchget(selection Range)toDispatch();

  Dispatchcall(textRange Paste);

  }

  }

  /**

  * 在當前文檔指定的位置拷貝表格

  *

  * @param pos

  * 當前文檔指定的位置

  * @param tableIndex

  * 被拷貝的表格在word文檔中所處的位置

  */

  public void copyTable(String pos int tableIndex) {

  // 所有表格

  Dispatch tables = Dispatchget(doc Tables)toDispatch();

  // 要填充的表格

  Dispatch table = Dispatchcall(tables Item new Variant(tableIndex))

  toDispatch();

  Dispatch range = Dispatchget(table Range)toDispatch();

  Dispatchcall(range Copy);

  if (thisfind(pos)) {

  Dispatch textRange = Dispatchget(selection Range)toDispatch();

  Dispatchcall(textRange Paste);

  }

  }

  /**

  * 在當前文檔指定的位置拷貝來自另一個文檔中的表格

  *

  * @param anotherDocPath

  * 另一個文檔的磁盤路徑

  * @param tableIndex

  * 被拷貝的表格在另一格文檔中的位置

  * @param pos

  * 當前文檔指定的位置

  */

  public void copyTableFromAnotherDoc(String anotherDocPath int tableIndex

  String pos) {

  Dispatch doc = null;

  try {

  doc = Dispatchcall(documents Open anotherDocPath)

  toDispatch();

  // 所有表格

  Dispatch tables = Dispatchget(doc Tables)toDispatch();

  // 要填充的表格

  Dispatch table = Dispatchcall(tables Item

  new Variant(tableIndex))toDispatch();

  Dispatch range = Dispatchget(table Range)toDispatch();

  Dispatchcall(range Copy);

  if (thisfind(pos)) {

  Dispatch textRange = Dispatchget(selection Range)

  toDispatch();

  Dispatchcall(textRange Paste);

  }

  } catch (Exception e) {

  eprintStackTrace();

  } finally {

  if (doc != null) {

  Dispatchcall(doc Close new Variant(saveOnExit));

  doc = null;

  }

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26342.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.