1. 程式人生 > >Java處理word文件 用jacob 表格圖片文字替換

Java處理word文件 用jacob 表格圖片文字替換

我的office2003的,如果在 word = new ActiveXComponent("Word.Application");
是出現問題,不能建立,有可能就是office的版本的問題。。。。。。。。。。。。。。。。。。。。。。

下面是採用jacob對Word文件進行一些處理,Java2Word.Java和對其的測試Java2WordTest.java

package com.word;

import java.util.Iterator;
import java.util.List;
import java.util.HashMap;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class Java2Word {
private boolean saveOnExit;

/**
* word文件
*/
private Dispatch doc = null;

/**
* word執行程式物件
*/
private ActiveXComponent word;

/**
* 所有word文件
*/
private Dispatch documents;

/**
* 建構函式
*/
public Java2Word() {
   saveOnExit = false;
   word = new ActiveXComponent("Word.Application");
   word.setProperty("Visible", new Variant(false));
   documents = word.getProperty("Documents").toDispatch();
}

/**
* 設定引數:退出時是否儲存
*
* @param saveOnExit
*            true-退出時儲存檔案,false-退出時不儲存檔案
*/
public void setSaveOnExit(boolean saveOnExit) {
   this.saveOnExit = saveOnExit;
}

/**
* 得到引數:退出時是否儲存
*
* @return boolean true-退出時儲存檔案,false-退出時不儲存檔案
*/
public boolean getSaveOnExit() {
   return saveOnExit;
}

/**
* 開啟檔案
*
* @param inputDoc
*            要開啟的檔案,全路徑
* @return Dispatch 開啟的檔案
*/
public Dispatch open(String inputDoc) {
 ComThread.InitSTA();
   return Dispatch.call(documents, "Open", inputDoc).toDispatch();
}

/**
* 選定內容
*
* @return Dispatch 選定的範圍或插入點
*/
public Dispatch select() {
   return word.getProperty("Selection").toDispatch();
}

/**
* 把選定內容或插入點向上移動
*
* @param selection
*            要移動的內容
* @param count
*            移動的距離
*/
public void moveUp(Dispatch selection, int count) {
   for (int i = 0; i < count; i++)
    Dispatch.call(selection, "MoveUp");
}

/**
* 把選定內容或插入點向下移動
*
* @param selection
*            要移動的內容
* @param count
*            移動的距離
*/
public void moveDown(Dispatch selection, int count) {
   for (int i = 0; i < count; i++)
    Dispatch.call(selection, "MoveDown");
}

/**
* 把選定內容或插入點向左移動
*
* @param selection
*            要移動的內容
* @param count
*            移動的距離
*/
public void moveLeft(Dispatch selection, int count) {
   for (int i = 0; i < count; i++)
    Dispatch.call(selection, "MoveLeft");
}

/**
* 把選定內容或插入點向右移動
*
* @param selection
*            要移動的內容
* @param count
*            移動的距離
*/
public void moveRight(Dispatch selection, int count) {
   for (int i = 0; i < count; i++)
    Dispatch.call(selection, "MoveRight");
}

/**
* 把插入點移動到檔案首位置
*
* @param selection
*            插入點
*/
public void moveStart(Dispatch selection) {
   Dispatch.call(selection, "HomeKey", new Variant(6));
}

/**
* 從選定內容或插入點開始查詢文字
*
* @param selection
*            選定內容
* @param toFindText
*            要查詢的文字
* @return boolean true-查詢到並選中該文字,false-未查詢到文字
*/
public boolean find(Dispatch selection, String toFindText) {
   // 從selection所在位置開始查詢
   Dispatch find = Dispatch.call(selection, "Find").toDispatch();
   // 設定要查詢的內容
   Dispatch.put(find, "Text", toFindText);
   // 向前查詢
   Dispatch.put(find, "Forward", "True");
   // 設定格式
   Dispatch.put(find, "Format", "True");
   // 大小寫匹配
   Dispatch.put(find, "MatchCase", "True");
   // 全字匹配
   Dispatch.put(find, "MatchWholeWord", "True");
   // 查詢並選中
   return Dispatch.call(find, "Execute").getBoolean();
}

/**
* 把選定內容替換為設定文字
*
* @param selection
*            選定內容
* @param newText
*            替換為文字
*/
public void replace(Dispatch selection, String newText) {
   // 設定替換文字
   Dispatch.put(selection, "Text", newText);
}

/**
* 全域性替換
*
* @param selection
*            選定內容或起始插入點
* @param oldText
*            要替換的文字
* @param newText
*            替換為文字
*/
public void replaceAll(Dispatch selection, String oldText, Object replaceObj) {
   // 移動到檔案開頭
   moveStart(selection);
   if (oldText.startsWith("table") || replaceObj instanceof List) {
    replaceTable(selection, oldText, (List<?>) replaceObj);
   } else {
    String newText = (String) replaceObj;
    if (oldText.indexOf("image") != -1
      || newText.lastIndexOf(".bmp") != -1
      || newText.lastIndexOf(".jpg") != -1
      || newText.lastIndexOf(".gif") != -1)
     while (find(selection, oldText)) {
      replaceImage(selection, newText);
      Dispatch.call(selection, "MoveRight");
     }
    else
     while (find(selection, oldText)) {
      replace(selection, newText);
      Dispatch.call(selection, "MoveRight");
     }
   }
}

/**
* 替換圖片
*
* @param selection
*            圖片的插入點
* @param imagePath
*            圖片檔案(全路徑)
*/
public void replaceImage(Dispatch selection, String imagePath) {
   Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),
     "AddPicture", imagePath);
}

/**
* 替換表格
*
* @param selection
*            插入點
* @param tableName
*            表格名稱,形如[email protected][email protected][email protected],R代表從表格中的第N行開始填充,
*            N代表word檔案中的第N張表
* @param fields
*            表格中要替換的欄位與資料的對應表
*/
public void replaceTable(Dispatch selection, String tableName, List<?> dataList) {
//   if (dataList.size() <=1) {
 if (dataList.size() <1) {
    System.out.println("Empty table!");
    return;
   }
   // 要填充的列
 String[] cols = (String[]) dataList.get(0);
   // 表格序號
   String tbIndex = tableName.substring(tableName.lastIndexOf("@") + 1);
   // 從第幾行開始填充
   int fromRow = Integer.parseInt(tableName.substring(tableName
     .lastIndexOf("$") + 1, tableName.lastIndexOf("@")));
   // 所有表格
   Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
   // 要填充的表格
   Dispatch table = Dispatch.call(tables, "Item", new Variant(tbIndex))
     .toDispatch();
   // 表格的所有行
   Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
   // 填充表格
  
   for (int i = 0; i < dataList.size(); i++) {
    // 某一行資料
    String[] datas = (String[]) dataList.get(i);
    // 在表格中新增一行
    if (Dispatch.get(rows, "Count").getInt() < fromRow + i){
     Dispatch.call(rows, "Add");
    }
    // 填充該行的相關列
    for (int j = 1; j <=datas.length; j++) {
     // 得到單元格
     /**
      * 引數 table 單元格 所選中的行 該行的單元序號
      */
     Dispatch cell = Dispatch.call(table, "Cell",
       new Variant(Integer.toString(fromRow + i)), new Variant(j))
       .toDispatch();
    
     // 選中單元格
     Dispatch.call(cell, "Select");
     // 設定格式
     Dispatch font = Dispatch.get(selection, "Font").toDispatch();
     Dispatch.put(font, "Bold", "0");
     Dispatch.put(font, "Italic", "0");
     // 輸入資料
     Dispatch.put(selection, "Text", datas[j-1]);
    }
   }
}

/**
* 儲存檔案
*
* @param outputPath
*            輸出檔案(包含路徑)
*/
public void save(String outputPath) {
   Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),
     "FileSaveAs", outputPath);
}

/**
* 關閉檔案
*
* @param document
*            要關閉的檔案
*/
public void close(Dispatch doc) {
   Dispatch.call(doc, "Close", new Variant(true));
}

/**
* 退出程式
*/
public void quit() {
   word.invoke("Quit", new Variant[0]);
   ComThread.Release();
}

/**
* 根據模板、資料生成word檔案
*
* @param inputPath
*            模板檔案(包含路徑)
* @param outPath
*            輸出檔案(包含路徑)
* @param data
*            資料包(包含要填充的欄位、對應的資料)
*/
public void toWord(String inputPath, String outPath, HashMap data) {
   String oldText;
   Object newValue;
   try {
    doc = open(inputPath);
    Dispatch selection = select();
    Iterator keys = data.keySet().iterator();
    while (keys.hasNext()) {
     oldText = (String) keys.next();
     newValue = data.get(oldText);
     replaceAll(selection, oldText, newValue);
    }
    save(outPath);
    System.out.println("success!");
   } catch (Exception e) {
    e.printStackTrace();

   } finally {
    if (doc != null)
     close(doc);
   }
}
}

------------------------------------------------------------------------------------

------------------------------------------------------------------------------------

package com.word;

import java.util.List;
import java.util.HashMap;

public class Java2WordTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
   Java2Word j2w=new Java2Word();
   String inputPath="C://Documents and Settings//dxx//桌面//TestJacob//TestJacob.doc";
   String outPath="C://Documents and Settings//dxx//桌面//TestJacob//TestJacob1.doc";
  
  
   /**
    * 插入表格的
    */
   HashMap<String, List> data=new HashMap<String, List>();
//   List list=new ArrayList();
//   String[] headContent=new String[]{"編號","姓名","年齡","工作地","大學"};
//   String[] content1=new String[]{"1","海翊","21","杭州","清華"};
//   String[] content2=new String[]{"2","絎翊","22","杭州","北大"};
//   list.add(headContent); 
//   list.add(content1);
//   list.add(content2);
//   data.put("[email protected]",list);
 
  
   /**
    * 全文關鍵字替換的
    */
//   HashMap<String, String> data=new HashMap<String, String>();
//   data.put("野睿", "天才");
  
  
   j2w.toWord(inputPath, outPath, data);
   j2w. quit();
 }

}

相關推薦

Java處理word jacob 表格圖片文字替換

我的office2003的,如果在 word = new ActiveXComponent("Word.Application");是出現問題,不能建立,有可能就是office的版本的問題。。。。。。。。。。。。。。。。。。。。。。 下面是採用jacob對Word文件進行一些

java操作wordjacob,poi)

專案需要,使用者從系統裡面下載word文件,該文件進行了填寫限制和加密,使用者只能在固定位置填寫內容。現要求系統驗證上傳的附件是否從系統上下載下來的。 思路:系統上面的文件都加入一個固定書籤,使用者上傳文件的時候,檢驗文件裡是否包含這個書籤。 採用jacob

Jacob處理Word總結以及Java操作Office2007

使用Jacob來處理Word文件 Word或Excel程式是以一種COM元件形式存在的。如果能夠在Java中呼叫Word的COM元件,就 能使用它的方法來獲取Word文件中的文字資訊。目前網上有許多提供這樣的工具。 1  Jacob的下載 Jacob 是Java-COM

[日常]Python讀取word中的表格並比較 2018-10-04

最近想對某些word文件(docx)的表格內容作比較, 於是找了一下相關工具. 參考Automate the Boring Stuff with Python中的word部分, 試用了python-docx - python-docx 0.8.7 documentation 演示如下.

java 在MySQL中儲存檔案,讀取檔案(包括圖片word,excel表格,ppt,zip檔案等)

在設計到資料庫的開發中,難免要將圖片或文件檔案(如word)插入到資料庫中的情況。一般來說,我們可以通過插入檔案相應的儲存路徑,而不是檔案本身,來避免直接向資料庫裡插入的麻煩。但有些時候,直接向MySQL中插入檔案,更加安全,而且更加容易管理。 首先,先要在資料庫中

Java轉換Word到PDF

plus filepath fileinput mage href except AC inf ext 使用Docx4j將Word文件轉換為PDF文件: public static void convertDocxToPDF(String docxFilePath,

java實現word轉pdf

前端時間,專案需要自動生成word文件,用WordFreeMarker生成word文件後,又要求生成的文件能在瀏覽器瀏覽,思來想去,把word文件轉成pdf就好了,於是乎研究了一下。 將word文件轉化為PDF是專案中常見的需求之一,目前主流的方法可以分為兩大類,一類是利用各種Office應

java匯出word,動態隨機插入多張圖片(web端可下載)

工具:freemarker 有關freemarker的載入方式可參照 https://www.cnblogs.com/qiaoqiaodi/p/7082878.html 1、建立模板   網上有很多建立模板的文章可參考,大概可概括為以下幾點   ①建立word文件,根據自己的

Javaword中填充資料

前言: 對於中大型OA系統來說,線上開啟word文件已經是一個常用需求。既然有線上操作word文件的需求,那就不可避免要有開啟文件時動態填充資料的需求。這篇文章就讓小編來介紹一箇中間件技術-pageoffice。 pageoffice對於word的功能做到了80%以上的封裝,而且api比較簡單容

java 實現 word 的線上編輯以及流轉

用 pageoffice 實現文件的線上編輯以及文件流轉 1: 流程 用修改無痕跡模式起草檔案,各個領導批註自己意見的時候使用強制留痕模式開啟,文員清稿的時候用核稿模式開啟,還有最後只讀模式打開發布的正式檔案。其中在領導批註環節也演示了PageOffice提供的手寫功能,在檔案核稿之後可以加

使用Java生成word(附原始碼)

原文地址:http://blog.51cto.com/favccxx/1331115 當我們使用Java生成word文件時,通常首先會想到iText和POI,這是因為我們習慣了使用這兩種方法操作Excel,自然而然的也想使用這種生成word文件。但是當我們需要動態生成word時,通常不僅要能夠顯

javaword的操作

springmvc controller層 類在org.apache.poi.xwpf包下 POI在讀寫word docx檔案時是通過xwpf模組來進行的,其核心是XWPFDocument。一個XWPFDocument代表一個docx文件,其可以用來讀doc

如何將excel表格轉化為word(去掉表格

第一次寫這種技術的部落格,有點辛苦,中間有一次,CSDN抽風,導致我不得不重新寫。 這是我自己摸索的,之前參考其他的教程,但是還是有點不同,他們用的是老舊的excel 2010和word 2010。 工

java操作word通用工具類

package cn.com.test.util; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOE

如何批量修改Word中的表格樣式和題注格式?

在進行大型專案的方案文件設計時,一個文件中有可能涉及到上百個圖表,在最後定稿的時候,需要進行統一的格式化處理。面對這些數目龐大的表格,挨個用格式刷進行處理,一路刷下來往往手都會刷酸,更令人奔潰的是好不容易刷完了,發現字型或大小不對,這時候可能需要再重新刷一遍。那

java匯出word

//頁面點選按鈕 function dc(id){ $.ajax({type : "post",url : "/member/word",async: false,data: {id:id},success : function(data){             if(

java實現word轉pdf線上瀏覽

現在著手做的專案是一個關於考試的,裡面有許多考生的資料資訊是word文件,在這裡耗費了不少的時間,也看了眾多的博文,在這裡發一下我的個人總結,有不對的地方還望指正 用到的jar jacob.jar 這是Maven地址http://mvnreposito

使用FreeMarker生成Word中的表格

    一、首先還是在Word中建立模板,只需要寫好表頭。如圖1所示:   圖1     二、編寫模板,並設定插值。 <#list schoolSafetyNotifications as listKey> <w:tr w:rsidR="006332C

[置頂] java處理office與pdf檔案(一)

需求說明: 使用者可以上傳word,excel,ppt,pdf檔案。在頁面能夠預覽該檔案,並可以通過搜尋,找到對應的檔案記錄。 使用技術: 通過jacob將office轉化為html,使用poi進行檔案提取; 在前期調研的時候,搜尋其他將office轉化為html的技術,發現其轉化之後的頁面都不怎麼逼真。但

Java 合併Word

合併文件可以是將兩個包含一定邏輯關係的文件合併成一個完整的文件,也可以是出於方便文件儲存、管理的目的合併多個文件為一個文件。下面,就將以上文件操作需求,通過Java程式來實現Word文件合併。合併文件可以分為2種方法來進行: 方法1. 載入兩個文件,將文件2插入到文件1。使用該方法合併文件時,被合併文件的內容