jacob 操做word的幾個方法

 這幾天由於工做的須要手動處理一部分word文檔進行數字化的工做,以知足一個手機app的數據訪問層的需求。考慮到之前在項目開發過程當中曾經使用過jacob做爲操做的工具,有比較不錯的效果,並且在技術上相對比較熟悉,就打算用這個來實現數據的收集工做。在收集了些jacob的資料後並整理在這個博客上,但願在這個任務的進行過程當中可以對jacob的操做方法也能更加的熟練。java


   private ActiveXComponent word = null; 
  private Dispatch documents = null; 
  private Dispatch vSelection = null; 
  private Dispatch wordfile = null;

 1,初始化 app

    word = new ActiveXComponent("Word.Application"); 
    documents = word.getProperty("Documents").toDispatch();

  (將JACOB 放在 WINNT\system32\ 下比較簡單省事) 編輯器

  2,打開文件 工具

   wordfile = Dispatch.invoke( documents, "Open", Dispatch.Method, new Object[] { strFileName, 
  new Variant(true),//是否進行轉換 ConfirmConversions 
  new Variant(false)//是否只讀 
  }, new int[1]).toDispatch(); 
  vSelection = word.getProperty("Selection").toDispatch();

       在WORD中,選定內容進行轉換時,不用象Java對象同樣來回的從新取,這個對象一直有效。在WORD中字體

  3,顯示WORD ui

  word.setProperty("Visible", new Variant(visible));

  4,設置WORD的位置 spa

   Dispatch activeWindow = Dispatch.get(word, "Application").toDispatch(); 
  Dispatch.put(activeWindow, "WindowState", new Variant(0)); 
  Dispatch.put(activeWindow, "Top", new Variant(0)); 
  Dispatch.put(activeWindow, "Left", new Variant(0)); 
  Dispatch.put(activeWindow, "Height", new Variant(600)); 
  Dispatch.put(activeWindow, "width", new Variant(800));

  進行將JAVA內的數據和WORD交換,經常使用的作法是,在WORD上做一些特殊的標記,利用 FIND 和 Replace的方法進行,這個方法不是太好。我的以爲使用超連接的模式比較方便。 code

  有幾大優勢: orm

  1, Hyperlink 有3個區域可讓開發者本身利用 對象

    ActiveDocument.Hyperlinks.Add 
  Anchor:=Selection.Range, 
  Address:="位置", //地址(能夠利用) 有個缺點 
  SubAddress:="",//子位置(能夠利用) 
  ScreenTip:="", //屏幕提示 
  TextToDisplay:="顯示內容"//最好利用的東西

  我的建議使用TextToDisplay。Address 會在保存時被替換成絕對路徑。好比你錄入一個 「AA.BB.CC」 

  保存時可能會被替換成C:\Documents and Settings\Administrator \My Documents\AA.BB.CC 

  2, 能夠進行自動定位 利用Hyperlinks 能夠將文章中全部的超連接獲得。也能夠將指定範圍的超連接獲得。 

  3, 能夠自由排版 

  4, 能夠拷貝粘貼 

  添加超連接: 

   Dispatch Hyperlinks = Dispatch.get(wordfile, "Hyperlinks").toDispatch(); 
  Dispatch range = Dispatch.get(vSelection, "Range").toDispatch(); 
  Dispatch h=Dispatch.invoke(Hyperlinks, "Add", Dispatch.Method, new Object[] 
  { range, new Variant("Address"), new Variant("SubAddress"), 
  new Variant("{table.fieldName}"),//建議的數據連接處 
  new Variant("姓名") }, // 在WORD中顯示的內容 
  new int[4]).toDispatch(); 
  Dispatch hRange=Dispatch.get(h, "Range").toDispatch(); 
  Dispatch.call(hRange,"select"); 
  //設置字體,顏色 
  Dispatch font = Dispatch.get(vSelection, "Font").toDispatch(); 
  Dispatch.put(font,"Underline", new Variant(0)); 
  Dispatch.put(font,"Color", new Variant(0)); 
  //取消選擇 
  Dispatch.call(vSelection,"MoveRight",new Variant(1),new Variant(1));

  超連接替換內容: 

  1, 獲得全部的超連接 

   Dispatch.call(dObject, "select"); //選擇對象 
  Dispatch Hyperlinks = Dispatch.get(vSelection, "Hyperlinks").toDispatch(); //獲得超連接集合 
  int nHyperlink = Dispatch.get(Hyperlinks, "count").toInt(); //獲得有多少個超連接 
  Dispatch hyperlink=Dispatch.invoke(Hyperlinks, "item", 
  Dispatch.Method, new Object[] { new Integer(i + 1)}, 
  new int[1]).toDispatch())); //獲得一個超連接

  2, 替換內容 

Dispatch.put(hyperlink, "TextToDisplay", information);

  3, 取消超連接,將超連接變成普通文字。 

Dispatch.call(hyperlink, "delete");

  如何實現批量數據自動擴展,建議使用表格進行自動擴展,方便簡單。 

  結合使用上面超連接的技術。會很是簡單: 

  好比有以下數據: 

  DataA DataB 

  1, 列出全部表格 

  和列出全部超連接基本同樣: 

  

   private void getTables01(Dispatch objcet,Vector vTableStore) { 
    Dispatch tables = Dispatch.get(objcet, "tables").toDispatch(); 
  int nTableAmount = Dispatch.get(tables, "count").toInt(); 
  for (int i = 0; i < nTableAmount; i++) { 
  Dispatch table = 
  Dispatch .invoke( tables,"item",Dispatch.Method,new Object[] { new Integer(i + 1)}, new int[1]) .toDispatch(); 
  vTableStore.add(new DTable(table)); 
  getTables01(table,vTableStore);//處理表格套用表格的狀況 
  } 
  }

  2, 表格的能夠控制的對象 

Dispatch dRows = Dispatch.get(dTable, "rows").toDispatch();//全部行 
int nRows = Dispatch.get(dRows, "count").toInt();

  3, 取得一行的內容   

    Dispatch dRow = Dispatch
    .invoke(rows,"item", Dispatch.Method, 
    new Object[] { new Integer(row + 1)},new int[1]) .toDispatch(); 
  return dRow; 
  }catch(ComFailException cfe) 
  { return null; }

  4, 獲得一行的超連接 

DHyperlink dhInRow[] = listHyperlinks(dRow);

  5, 將某一行拷貝不少次 

Dispatch.call(dRow, "select"); 
  Dispatch.call(vSelection, "Copy"); 
  int nCopyNow = nDataBlockRow - 1; 
  for (int nCopys = 0; nCopys < nCopyNow; nCopys++) { 
  try { 
  Dispatch.call(vSelection, "Paste"); 
  }catch(Exception e) { e.printStackTrace(); 
  //有時候文檔損壞,能夠忽略本問題,實際上已經粘貼上了 
  } 
  }

  6, 替換內容,讀到這裏就不用介紹了。 

  打印預覽: 

Dispatch.call(wordfile,"PrintPreView");

  其餘的功能發掘利用WORD的宏錄製,以及VB編輯器,輔助功能,都能發掘出來。 

public void close() 
  { 
  //word.invoke("Quit", new Variant[] {}); 
  Variant f = new Variant(false); 
  Dispatch.call(wordfile, "Close", f); 
  } 
  public void quit() { word.invoke("Quit", new Variant[] {}); }
相關文章
相關標籤/搜索