用java SWT操作word 进行修改

13年前

package com.ui.input;

 

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

 

import org.eclipse.swt.widgets.DateTime;

 

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.Dispatch;

import com.jacob.com.Variant;

 

public class Java2Word {

   

     private boolean saveOnExit;

     /**

      * word文档

      */

     Dispatch doc = null;

   

     /**

      * word运行程序对象s

      */

     private   ActiveXComponent word;

     /**

      * 所有word文档

      */

     private   Dispatch documents;

   

   

     /**

      * 构造函数

      */

     public Java2Word() {

         if(word==null){

         word = new ActiveXComponent("Word.Application");

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

         }

         if(documents==null)

         documents = word.getProperty("Documents").toDispatch();

         saveOnExit = false;

     }

   

     /**

      * 设置参数:退出时是否保存

      * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件

      */

     public void setSaveOnExit(boolean saveOnExit) {

         this.saveOnExit = saveOnExit;

     }

     /**

      * 得到参数:退出时是否保存

      * @return boolean true-退出时保存文件,false-退出时不保存文件

      */

     public boolean getSaveOnExit() {

         return saveOnExit;

     }

   

     /**

      * 打开文件

      * @param inputDoc String 要打开的文件,全路径

      * @return Dispatch 打开的文件

      */

     public Dispatch open(String inputDoc) {

         return Dispatch.call(documents,"Open",inputDoc).toDispatch();

         //return Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[]{inputDoc},new int[1]).toDispatch();

     }

   

     /**

      * 选定内容

      * @return Dispatch 选定的范围或插入点

      */

     public Dispatch select() {

         return word.getProperty("Selection").toDispatch();

     }

   

     /**

      * 把选定内容或插入点向上移动

      * @param selection Dispatch 要移动的内容

      * @param count int 移动的距离

      */

     public void moveUp(Dispatch selection,int count) {

         for(int i = 0;i < count;i ++)

             Dispatch.call(selection,"MoveUp");

     }

   

     /**

      * 把选定内容或插入点向下移动

      * @param selection Dispatch 要移动的内容

      * @param count int 移动的距离

      */

     public void moveDown(Dispatch selection,int count) {

         for(int i = 0;i < count;i ++)

             Dispatch.call(selection,"MoveDown");

     }

   

     /**

      * 把选定内容或插入点向左移动

      * @param selection Dispatch 要移动的内容

      * @param count int 移动的距离

      */

     public void moveLeft(Dispatch selection,int count) {

         for(int i = 0;i < count;i ++) {

             Dispatch.call(selection,"MoveLeft");

         }

     }

   

     /**

      * 把选定内容或插入点向右移动

      * @param selection Dispatch 要移动的内容

      * @param count int 移动的距离

      */

     public void moveRight(Dispatch selection,int count) {

         for(int i = 0;i < count;i ++)

             Dispatch.call(selection,"MoveRight");

     }

   

     /**

      * 把插入点移动到文件首位置

      * @param selection Dispatch 插入点

      */

     public void moveStart(Dispatch selection) {

         Dispatch.call(selection,"HomeKey",new Variant(6));

     }

   

     /**

      * 从选定内容或插入点开始查找文本

      * @param selection Dispatch 选定内容

      * @param toFindText String 要查找的文本

      * @return boolean true-查找到并选中该文本,false-未查找到文本

      */

     public boolean find(Dispatch selection,String toFindText) {

         //selection所在位置开始查询

         Dispatch find = word.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 Dispatch 选定内容

      * @param newText String 替换为文本

      */

     public void replace(Dispatch selection,String newText) {

         //设置替换文本

         Dispatch.put(selection,"Text",newText);

     }

   

     /**

      * 全局替换

      * @param selection Dispatch 选定内容或起始插入点

      * @param oldText String 要替换的文本

      * @param newText String 替换为文本

      */

     public void replaceAll(Dispatch selection,String oldText,Object replaceObj) {

         //移动到文件开头

         moveStart(selection);

       

         if(oldText.startsWith("table") || replaceObj instanceof ArrayList)

             replaceTable(selection,oldText,(ArrayList) replaceObj);

         else {

             String newText = (String) replaceObj;

             if(newText==null)

                 newText="";

             if(oldText.indexOf("image") != -1&!newText.trim().equals("") || 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 Dispatch 图片的插入点

      * @param imagePath String 图片文件(全路径)

      */

     public void replaceImage(Dispatch selection,String imagePath) {

         Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);

     }

   

     /**

      * 替换表格

      * @param selection Dispatch 插入点

      * @param tableName String 表格名称,形如table$1@1table$2@1...table$R@NR代表从表格中的第N行开始填充,N代表word文件中的第N张表

      * @param fields HashMap 表格中要替换的字段与数据的对应表

      */

     public void replaceTable(Dispatch selection,String tableName,ArrayList dataList) {

         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 = 1;i < dataList.size();i ++) {

             //某一行数据

             String[] datas = (String[]) dataList.get(i);

           

             //在表格中添加一行

             if(Dispatch.get(rows,"Count").getInt() < fromRow + i - 1)

                 Dispatch.call(rows,"Add");

             //填充该行的相关列

             for(int j = 0;j < datas.length;j ++) {

                 //得到单元格

                 Dispatch cell = Dispatch.call(table,"Cell",Integer.toString(fromRow + i - 1),cols[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]);

             }

         }

     }

   

     /**

      * 保存文件

      * @param outputPath String 输出文件(包含路径)

      */

     public void save(String outputPath) {

         Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);

     }

   

     /**

      * 关闭文件

      * @param document Dispatch 要关闭的文件

      */

     public void close(Dispatch doc) {

         Dispatch.call(doc,"Close",new Variant(saveOnExit));

         word.invoke("Quit",new Variant[]{});

         word = null;

     }

   

     /**

      * 根据模板、数据生成word文件

      * @param inputPath String 模板文件(包含路径)

      * @param outPath String 输出文件(包含路径)

      * @param data HashMap 数据包(包含要填充的字段、对应的数据)

      */

     public void toWord(String inputPath,String outPath,HashMap data) {

         String oldText;

         Object newValue;

         try {

             if(doc==null)

             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);

         } catch(Exception e) {

             System.out.println("操作word文件失败!");

             e.printStackTrace();

         } finally {

             if(doc != null)

                 close(doc);

         }

     }

   

     public synchronized static void word(String inputPath,String outPath,HashMap data){

         Java2Word j2w = new Java2Word();

         j2w.toWord(inputPath,outPath,data);

     }

   

     public static long Input(String name,String qq,String pwd,String oaname) {

         HashMap data = new HashMap();

         data.put("$a$",name);

         data.put("$b$",qq);

         data.put("$c$",pwd);

         data.put("$d$",oaname);

         

      

 

       

         Java2Word j2w = new Java2Word();

         long time1 = System.currentTimeMillis();

         j2w.toWord("D:\\doc\\tax\\新员工入司需知.doc","D:\\新员工入司需知.doc",data);

     return  (System.currentTimeMillis() - time1);

     }

}

 

--------------------------------------------分割线---------------------------------------------------

//测试类。没有全调用Java2Word的方法。。太麻烦- -

package com.ui.input;

 

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.MessageBox;

import org.eclipse.swt.widgets.Shell;

import org.eclipse.swt.widgets.Label;

import org.eclipse.swt.SWT;

import org.eclipse.swt.widgets.Text;

import org.eclipse.swt.widgets.Button;

import org.eclipse.swt.events.SelectionAdapter;

import org.eclipse.swt.events.SelectionEvent;

 

import com.sun.xml.internal.ws.api.message.Message;

import org.eclipse.wb.swt.SWTResourceManager;

 

public class Test {

 

       protected Shell shell;

       private Label lblNewLabel;

       private Label lblqq;

       private Label lblOa;

       private Label label_2;

       private Label lblQq;

       private Text textname;

       private Text textqq;

       private Text textpwd;

       private Text textoa;

       private Button btnNewButton;

       private Button btnNewButton_1;

       private Button button;

 

       /**

        * Launch the application.

        *

        * @param args

        */

       public static void main(String[] args) {

              try {

                     Test window = new Test();

                     window.open();

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

 

       /**

        * Open the window.

        */

       public void open() {

              Display display = Display.getDefault();

              createContents();

              shell.open();

              shell.layout();

              while (!shell.isDisposed()) {

                     if (!display.readAndDispatch()) {

                            display.sleep();

                     }

              }

       }

 

       /**

        * Create contents of the window.

        */

       protected void createContents() {

              shell = new Shell();

             

               shell = new Shell(SWT.CLOSE);//实例化窗体只有关闭按钮

               shell = new Shell(SWT.MIN | SWT.CLOSE);//实例化窗体 不允许改变大小

               shell.setImage(SWTResourceManager.getImage(Test.class, "/images/RF.png"));

              //shell.setImage(SWTResourceManager.getImage("..\\images\\RF.png"));

              shell.setSize(443, 295);

              shell.setText("\u65B0\u5458\u5DE5\u5165\u804C\u901A\u77E5\u5355");

             

              lblNewLabel = new Label(shell, SWT.NONE);

              lblNewLabel.setBounds(57, 43, 54, 12);

              lblNewLabel.setText("\u5458\u5DE5\u59D3\u540D\uFF1A");

 

              lblqq = new Label(shell, SWT.NONE);

              lblqq.setText("\u5458\u5DE5QQ\uFF1A");

              lblqq.setBounds(57, 77, 54, 12);

 

              lblOa = new Label(shell, SWT.NONE);

              lblOa.setText("OA\u8D26\u53F7\uFF1A");

              lblOa.setBounds(57, 143, 54, 12);

 

              label_2 = new Label(shell, SWT.NONE);

              label_2.setText("\u5458\u5DE5\u59D3\u540D\uFF1A");

              label_2.setBounds(44, 129, 54, -11);

 

              lblQq = new Label(shell, SWT.NONE);

              lblQq.setText("QQ\u5BC6\u7801\uFF1A");

              lblQq.setBounds(57, 103, 54, 12);

 

              textname = new Text(shell, SWT.BORDER);

              textname.setBounds(144, 40, 141, 18);

 

              textqq = new Text(shell, SWT.BORDER);

              textqq.setBounds(144, 74, 141, 18);

 

              textpwd = new Text(shell, SWT.BORDER);

              textpwd.setBounds(144, 100, 141, 18);

 

              textoa = new Text(shell, SWT.BORDER);

              textoa.setBounds(144, 140, 141, 18);

 

              btnNewButton = new Button(shell, SWT.NONE);

              btnNewButton.addSelectionListener(new SelectionAdapter() {

 

                     public void widgetSelected(SelectionEvent e) {

 

                            Java2Word jWord = new Java2Word();

                            String name = textname.getText();

                            String qq = textqq.getText();

                            String pwd = textpwd.getText();

                            String oaname = textoa.getText();

                            long lg = jWord.Input(name, qq, pwd, oaname);

                            if (lg==0) {

                     MessageBox messageBox = new MessageBox(shell, SWT.ERROR

                                   | SWT.YES | SWT.OK);

                     messageBox.setMessage("添加失败!");

                     messageBox.setText("提示");

                     messageBox.open();

                            }else{

                            MessageBox messageBox = new MessageBox(shell, SWT.ICON_INFORMATION);

                            messageBox.setMessage("添加成功!");

                            messageBox.setText("提示");

                            messageBox.open();

                            }

 

                     }

              });

              btnNewButton.setBounds(90, 199, 72, 22);

              btnNewButton.setText("\u786E\u5B9A");

 

              btnNewButton_1 = new Button(shell, SWT.NONE);

              btnNewButton_1.addSelectionListener(new SelectionAdapter() {

 

                     public void widgetSelected(SelectionEvent e) {

                            textname.setText("");

                            textoa.setText("");

                            textpwd.setText("");

                            textqq.setText("");

                     }

              });

              btnNewButton_1.setBounds(298, 199, 72, 22);

              btnNewButton_1.setText("\u91CD\u7F6E");

 

              button = new Button(shell, SWT.NONE);

              button.addSelectionListener(new SelectionAdapter() {

 

                     public void widgetSelected(SelectionEvent e) {

                            shell.close();

                     }

              });

              button.setText("\u5173\u95ED");

              button.setBounds(192, 199, 72, 22);

 

       }

}