jacob 操作word

1. 首先下载jacob-1.18.zip,解压后有两个文件jacob.jar 和 jacob.dll。需要把jacob.jar放到你工程的classpath中并且把jacob.dll放到jdk的bin目录下(D:\Program Files\Java\jdk1.8.0_101\bin)目录下或者系统的system32其他相应的目录下。

2.下面是提供的工具类

  1 package com.erqiao.rc.util;
  2
  3 import com.jacob.activeX.ActiveXComponent;
  4 import com.jacob.com.ComThread;
  5 import com.jacob.com.Dispatch;
  6 import com.jacob.com.Variant;
  7
  8 /** */
  9 /***
 10  *
 11  * @author BruceLeey
 12  *
 13  */
 14 public class MSWordManager {
 15     // word文档
 16     private Dispatch doc = null;
 17     // word运行程序对象
 18     private ActiveXComponent word = null;
 19     // 所有word文档集合
 20     private Dispatch documents = null;
 21     // 选定的范围或插入点
 22     private static Dispatch selection = null;
 23     // 设置是否保存后才退出的标志
 24     private boolean saveOnExit = true;
 25
 26     public MSWordManager() {
 27         ComThread.InitSTA();
 28         if (word == null) {
 29             word = new ActiveXComponent("Word.Application");
 30             word.setProperty("Visible", new Variant(false));
 31         }
 32         if (documents == null)
 33             documents = word.getProperty("Documents").toDispatch();
 34     }
 35
 36     /** */
 37     /**
 38      * 设置退出时参数
 39      *
 40      * @param saveOnExit
 41      *            boolean true-退出时保存文件,false-退出时不保存文件
 42      */
 43     public void setSaveOnExit(boolean saveOnExit) {
 44         this.saveOnExit = saveOnExit;
 45     }
 46
 47     /** */
 48     /**
 49      * 创建一个新的word文档
 50      *
 51      */
 52     public void createNewDocument() {
 53         doc = Dispatch.call(documents, "Add").toDispatch();
 54         selection = Dispatch.get(word, "Selection").toDispatch();
 55     }
 56
 57     /** */
 58     /**
 59      * 打开一个已存在的文档
 60      *
 61      * @param docPath
 62      */
 63     public void openDocument(String docPath) {
 64         closeDocument();
 65         doc = Dispatch.call(documents, "Open", docPath).toDispatch();
 66         selection = Dispatch.get(word, "Selection").toDispatch();
 67     }
 68
 69     /** */
 70     /**
 71      * 把选定的内容或插入点向上移动
 72      *
 73      * @param pos
 74      *            移动的距离
 75      */
 76     public void moveUp(int pos) {
 77         if (selection == null)
 78             selection = Dispatch.get(word, "Selection").toDispatch();
 79         for (int i = 0; i < pos; i++)
 80             Dispatch.call(selection, "MoveUp");
 81
 82     }
 83
 84     /** */
 85     /**
 86      * 在指定的单元格里填写数据
 87      *
 88      * @param tableIndex
 89      *            文档中的第tIndex个Table,即tIndex为索引取
 90      * @param cellRowIdx
 91      *            cell在Table第row行
 92      * @param cellColIdx
 93      *            cell在Talbe第col列
 94      * @param txt
 95      *            填写的数据
 96      */
 97     public void moveToCell(int tableIndex, int cellRowIdx, int cellColIdx) {
 98         // 所有表格
 99         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
100         // 要填充的表格
101         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
102         Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch();
103         Dispatch.call(cell, "Select");
104         Dispatch.call(selection, "MoveRight");
105     }
106
107     /**
108      * 插入分节符
109      */
110     public void InsertBreakNextPage(){
111         Dispatch.call(word, "Run", new Variant("InsertBreakWdSectionBreakNextPage"));
112     }
113
114     /**
115      * 新增分页符
116      */
117     public void InsertBreak(){
118         Dispatch.call(selection,  "InsertBreak" ,  new Variant(7) );
119     }
120
121     /**
122      * 换行符
123      */
124     public void Enter(){
125         Dispatch.call(selection, "TypeParagraph");
126     }
127
128     /** */
129     /**
130      * 把选定的内容或者插入点向下移动
131      *
132      * @param pos
133      *            移动的距离
134      */
135     public void moveDown(int pos) {
136         if (selection == null)
137             selection = Dispatch.get(word, "Selection").toDispatch();
138         for (int i = 0; i < pos; i++)
139             Dispatch.call(selection, "MoveDown");
140     }
141
142     /** */
143     /**
144      * 把选定的内容或者插入点向左移动
145      *
146      * @param pos
147      *            移动的距离
148      */
149     public void moveLeft(int pos) {
150         if (selection == null)
151             selection = Dispatch.get(word, "Selection").toDispatch();
152         for (int i = 0; i < pos; i++) {
153             Dispatch.call(selection, "MoveLeft");
154         }
155     }
156
157     /** */
158     /**
159      * 把选定的内容或者插入点向右移动
160      *
161      * @param pos
162      *            移动的距离
163      */
164     public void moveRight(int pos) {
165         if (selection == null)
166             selection = Dispatch.get(word, "Selection").toDispatch();
167         for (int i = 0; i < pos; i++)
168             Dispatch.call(selection, "MoveRight");
169     }
170
171     /** */
172     /**
173      * 把插入点移动到文件首位置
174      *
175      */
176     public void moveStart() {
177         if (selection == null)
178             selection = Dispatch.get(word, "Selection").toDispatch();
179         Dispatch.call(selection, "HomeKey", new Variant(6));
180     }
181
182     /** */
183     /**
184      * 从选定内容或插入点开始查找文本
185      *
186      * @param toFindText
187      *            要查找的文本
188      * @return boolean true-查找到并选中该文本,false-未查找到文本
189      */
190     public boolean find(String toFindText) {
191         if (toFindText == null || toFindText.equals(""))
192             return false;
193         // 从selection所在位置开始查询
194         Dispatch find = word.call(selection, "Find").toDispatch();
195         // 设置要查找的内容
196         Dispatch.put(find, "Text", toFindText);
197         // 向前查找
198         Dispatch.put(find, "Forward", "True");
199         // 设置格式
200         Dispatch.put(find, "Format", "True");
201         // 大小写匹配
202         Dispatch.put(find, "MatchCase", "True");
203         // 全字匹配
204         Dispatch.put(find, "MatchWholeWord", "True");
205         // 查找并选中
206         return Dispatch.call(find, "Execute").getBoolean();
207     }
208
209     /** */
210     /**
211      * 把选定选定内容设定为替换文本
212      *
213      * @param toFindText
214      *            查找字符串
215      * @param newText
216      *            要替换的内容
217      * @return
218      */
219     public boolean replaceText(String toFindText, String newText) {
220         if (!find(toFindText))
221             return false;
222         Dispatch.put(selection, "Text", newText);
223         return true;
224     }
225
226     /** */
227     /**
228      * 全局替换文本
229      *
230      * @param toFindText
231      *            查找字符串
232      * @param newText
233      *            要替换的内容
234      */
235     public void replaceAllText(String toFindText, String newText) {
236         while (find(toFindText)) {
237             Dispatch.put(selection, "Text", newText);
238             Dispatch.call(selection, "MoveRight");
239         }
240     }
241
242     /** */
243     /**
244      * 在当前插入点插入字符串
245      *
246      * @param newText
247      *            要插入的新字符串
248      */
249     public void insertText(String newText) {
250         Dispatch.put(selection, "Text", newText);
251     }
252
253     /** */
254     /**
255      *
256      * @param toFindText
257      *            要查找的字符串
258      * @param imagePath
259      *            图片路径
260      * @return
261      */
262     public boolean replaceImage(String toFindText, String imagePath) {
263         if (!find(toFindText))
264             return false;
265         Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
266         return true;
267     }
268
269     /** */
270     /**
271      * 全局替换图片
272      *
273      * @param toFindText
274      *            查找字符串
275      * @param imagePath
276      *            图片路径
277      */
278     public void replaceAllImage(String toFindText, String imagePath) {
279         while (find(toFindText)) {
280             Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
281             Dispatch.call(selection, "MoveRight");
282         }
283     }
284
285     /** */
286     /**
287      * 在当前插入点插入图片
288      *
289      * @param imagePath
290      *            图片路径
291      */
292     public void insertImage(String imagePath) {
293         if (imagePath != "" && imagePath != null) {
294             Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(), "AddPicture", imagePath);
295         }
296     }
297
298     /** */
299     /**
300      * 合并单元格
301      *
302      * @param tableIndex
303      * @param fstCellRowIdx
304      * @param fstCellColIdx
305      * @param secCellRowIdx
306      * @param secCellColIdx
307      */
308     public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx, int secCellRowIdx, int secCellColIdx) {
309         // 所有表格
310         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
311         // 要填充的表格
312         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
313         Dispatch fstCell = Dispatch.call(table, "Cell", new Variant(fstCellRowIdx), new Variant(fstCellColIdx))
314                 .toDispatch();
315         Dispatch secCell = Dispatch.call(table, "Cell", new Variant(secCellRowIdx), new Variant(secCellColIdx))
316                 .toDispatch();
317         Dispatch.call(fstCell, "Merge", secCell);
318     }
319
320     /** */
321     /**
322      * 在指定的单元格里填写数据
323      *
324      * @param tableIndex
325      *            文档中的第tIndex个Table,即tIndex为索引取
326      * @param cellRowIdx
327      *            cell在Table第row行
328      * @param cellColIdx
329      *            cell在Talbe第col列
330      * @param txt
331      *            填写的数据
332      */
333     public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx, String txt) {
334         // 所有表格
335         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
336         // 要填充的表格
337         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
338         Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch();
339         Dispatch.call(cell, "Select");
340         Dispatch.put(selection, "Text", txt);
341     }
342
343     /** */
344     /**
345      * 在指定的单元格里填写数据
346      *
347      * @param tableIndex
348      * @param cellRowIdx
349      * @param cellColIdx
350      * @param txt
351      */
352     public void putTxtToCellCenter(int tableIndex, int cellRowIdx, int cellColIdx, String txt) {
353         // 所有表格
354         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
355         // 要填充的表格
356         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
357         Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch();
358         Dispatch.call(cell, "Select");
359         Dispatch alignment = Dispatch.get(selection, "ParagraphFormat").toDispatch();
360         Dispatch.put(alignment, "Alignment", "3");
361         Dispatch.put(selection, "Text", txt);
362     }
363
364     /**
365      *
366      * 得到当前文档的tables集合
367      */
368     public Dispatch getTables() throws Exception {
369         if (this.doc == null) {
370             throw new Exception("there is not a document can‘t be operate!!!");
371         }
372         return Dispatch.get(doc, "Tables").toDispatch();
373     }
374
375     /**
376      *
377      * 得到当前文档的表格数
378      *
379      * @param Dispatch
380      */
381     public int getTablesCount(Dispatch tables) throws Exception {
382         int count = 0;
383         try {
384             this.getTables();
385         } catch (Exception e) {
386             throw new Exception("there is not any table!!");
387         }
388         count = Dispatch.get(tables, "Count").getInt();
389         return count;
390     }
391
392     /** */
393     /**
394      * 在当前文档拷贝剪贴板数据
395      *
396      * @param pos
397      */
398     public void pasteExcelSheet(String pos) {
399         moveStart();
400         if (this.find(pos)) {
401             Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
402             Dispatch.call(textRange, "Paste");
403         }
404     }
405
406     /** */
407     /**
408      * 在当前文档指定的位置拷贝表格
409      *
410      * @param pos
411      *            当前文档指定的位置
412      * @param tableIndex
413      *            被拷贝的表格在word文档中所处的位置
414      */
415     public void copyTable(/*String pos, */int tableIndex) {
416         // 所有表格
417         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
418         // 要填充的表格
419         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
420         Dispatch range = Dispatch.get(table, "Range").toDispatch();
421         Dispatch.call(range, "Copy");
422         Dispatch.call(selection, "Paste");
423 //        if (this.find(pos)) {
424 //            Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
425 //            Dispatch.call(textRange, "Paste");
426 //        }
427     }
428
429     /** */
430     /**
431      * 在当前文档指定的位置拷贝来自另一个文档中的表格
432      *
433      * @param anotherDocPath
434      *            另一个文档的磁盘路径
435      * @param tableIndex
436      *            被拷贝的表格在另一格文档中的位置
437      * @param pos
438      *            当前文档指定的位置
439      */
440     public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex, String pos) {
441         Dispatch doc2 = null;
442         try {
443             doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
444             // 所有表格
445             Dispatch tables = Dispatch.get(doc2, "Tables").toDispatch();
446             // 要填充的表格
447             Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
448             Dispatch range = Dispatch.get(table, "Range").toDispatch();
449             Dispatch.call(range, "Copy");
450             if (this.find(pos)) {
451                 Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
452                 Dispatch.call(textRange, "Paste");
453             }
454         } catch (Exception e) {
455             e.printStackTrace();
456         } finally {
457             if (doc2 != null) {
458                 Dispatch.call(doc2, "Close", new Variant(saveOnExit));
459                 doc2 = null;
460             }
461         }
462     }
463
464     /** */
465     /**
466      * 在当前文档指定的位置拷贝来自另一个文档中的图片
467      *
468      * @param anotherDocPath
469      *            另一个文档的磁盘路径
470      * @param shapeIndex
471      *            被拷贝的图片在另一格文档中的位置
472      * @param pos
473      *            当前文档指定的位置
474      */
475     public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex, String pos) {
476         Dispatch doc2 = null;
477         try {
478             doc2 = Dispatch.call(documents, "Open", anotherDocPath).toDispatch();
479             Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch();
480             Dispatch shape = Dispatch.call(shapes, "Item", new Variant(shapeIndex)).toDispatch();
481             Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch();
482             Dispatch.call(imageRange, "Copy");
483             if (this.find(pos)) {
484                 Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
485                 Dispatch.call(textRange, "Paste");
486             }
487         } catch (Exception e) {
488             e.printStackTrace();
489         } finally {
490             if (doc2 != null) {
491                 Dispatch.call(doc2, "Close", new Variant(saveOnExit));
492                 doc2 = null;
493             }
494         }
495     }
496
497     /** */
498     /**
499      * 创建表格
500      *
501      * @param pos
502      *            位置
503      * @param cols
504      *            列数
505      * @param rows
506      *            行数
507      */
508     public void createTable(String pos, int numCols, int numRows) {
509         if (find(pos)) {
510             Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
511             Dispatch range = Dispatch.get(selection, "Range").toDispatch();
512             Dispatch newTable = Dispatch.call(tables, "Add", range, new Variant(numRows), new Variant(numCols))
513                     .toDispatch();
514             Dispatch.call(selection, "MoveRight");
515         }
516     }
517
518     /** */
519     /**
520      * 在指定行前面增加行
521      *
522      * @param tableIndex
523      *            word文件中的第N张表(从1开始)
524      * @param rowIndex
525      *            指定行的序号(从1开始)
526      */
527     public void addTableRow(int tableIndex, int rowIndex) {
528         // 所有表格
529         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
530         // 要填充的表格
531         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
532         // 表格的所有行
533         Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
534         Dispatch row = Dispatch.call(rows, "Item", new Variant(rowIndex)).toDispatch();
535         Dispatch.call(rows, "Add", new Variant(row));
536     }
537
538     /** */
539     /**
540      * 在第1行前增加一行
541      *
542      * @param tableIndex
543      *            word文档中的第N张表(从1开始)
544      */
545     public void addFirstTableRow(int tableIndex) {
546         // 所有表格
547         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
548         // 要填充的表格
549         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
550         // 表格的所有行
551         Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
552         Dispatch row = Dispatch.get(rows, "First").toDispatch();
553         Dispatch.call(rows, "Add", new Variant(row));
554     }
555
556     /** */
557     /**
558      * 在最后1行前增加一行
559      *
560      * @param tableIndex
561      *            word文档中的第N张表(从1开始)
562      */
563     public void addLastTableRow(int tableIndex) {
564         // 所有表格
565         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
566         // 要填充的表格
567         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
568         // 表格的所有行
569         Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
570         Dispatch row = Dispatch.get(rows, "Last").toDispatch();
571         Dispatch.call(rows, "Add", new Variant(row));
572     }
573
574     /** */
575     /**
576      * 增加一行
577      *
578      * @param tableIndex
579      *            word文档中的第N张表(从1开始)
580      */
581     public void addRow(int tableIndex) {
582         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
583         // 要填充的表格
584         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
585         // 表格的所有行
586         Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
587         Dispatch.call(rows, "Add");
588     }
589
590     /** */
591     /**
592      * 增加一列
593      *
594      * @param tableIndex
595      *            word文档中的第N张表(从1开始)
596      */
597     public void addCol(int tableIndex) {
598         // 所有表格
599         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
600         // 要填充的表格
601         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
602         // 表格的所有行
603         Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
604         Dispatch.call(cols, "Add").toDispatch();
605         Dispatch.call(cols, "AutoFit");
606     }
607
608     /** */
609     /**
610      * 在指定列前面增加表格的列
611      *
612      * @param tableIndex
613      *            word文档中的第N张表(从1开始)
614      * @param colIndex
615      *            制定列的序号 (从1开始)
616      */
617     public void addTableCol(int tableIndex, int colIndex) {
618         // 所有表格
619         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
620         // 要填充的表格
621         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
622         // 表格的所有行
623         Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
624         System.out.println(Dispatch.get(cols, "Count"));
625         Dispatch col = Dispatch.call(cols, "Item", new Variant(colIndex)).toDispatch();
626         // Dispatch col = Dispatch.get(cols, "First").toDispatch();
627         Dispatch.call(cols, "Add", col).toDispatch();
628         Dispatch.call(cols, "AutoFit");
629     }
630
631     /** */
632     /**
633      * 在第1列前增加一列
634      *
635      * @param tableIndex
636      *            word文档中的第N张表(从1开始)
637      */
638     public void addFirstTableCol(int tableIndex) {
639         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
640         // 要填充的表格
641         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
642         // 表格的所有行
643         Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
644         Dispatch col = Dispatch.get(cols, "First").toDispatch();
645         Dispatch.call(cols, "Add", col).toDispatch();
646         Dispatch.call(cols, "AutoFit");
647     }
648
649     /** */
650     /**
651      * 在最后一列前增加一列
652      *
653      * @param tableIndex
654      *            word文档中的第N张表(从1开始)
655      */
656     public void addLastTableCol(int tableIndex) {
657         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
658         // 要填充的表格
659         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
660         // 表格的所有行
661         Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
662         Dispatch col = Dispatch.get(cols, "Last").toDispatch();
663         Dispatch.call(cols, "Add", col).toDispatch();
664         Dispatch.call(cols, "AutoFit");
665     }
666
667     /** */
668     /**
669      * 设置当前选定内容的字体
670      *
671      * @param boldSize
672      * @param italicSize
673      * @param underLineSize
674      *            下划线
675      * @param colorSize
676      *            字体颜色
677      * @param size
678      *            字体大小
679      * @param name
680      *            字体名称
681      */
682     public void setFont(boolean bold, boolean italic, boolean underLine, String colorSize, String size, String name) {
683         Dispatch font = Dispatch.get(selection, "Font").toDispatch();
684         Dispatch.put(font, "Name", new Variant(name));
685         Dispatch.put(font, "Bold", new Variant(bold));
686         Dispatch.put(font, "Italic", new Variant(italic));
687         Dispatch.put(font, "Underline", new Variant(underLine));
688         Dispatch.put(font, "Color", colorSize);
689         Dispatch.put(font, "Size", size);
690     }
691
692     public void setFontCenter(String name) {
693         Dispatch font = Dispatch.get(selection, "Font").toDispatch();
694         Dispatch alignment = Dispatch.get(selection, "ParagraphFormat").toDispatch();
695         Dispatch.put(alignment, "Alignment", "3");
696         Dispatch.call(selection, "TypeText", name);
697     }
698
699     /** */
700     /**
701      * 文件保存或另存为
702      *
703      * @param savePath
704      *            保存或另存为路径
705      */
706     public void save(String savePath) {
707         Dispatch.call(doc, "SaveAs", savePath); // 保存
708         /**//*
709              * Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),
710              * "FileSaveAs", savePath);
711              */
712     }
713
714     /** */
715     /**
716      * 关闭当前word文档
717      *
718      */
719     public void closeDocument() {
720         if (doc != null) {
721             Dispatch.call(doc, "Save");
722             Dispatch.call(doc, "Close", new Variant(saveOnExit));
723             doc = null;
724         }
725     }
726
727     /** */
728     /**
729      * 关闭全部应用
730      *
731      */
732     public void close() {
733         closeDocument();
734         if (word != null) {
735             Dispatch.call(word, "Quit");
736             word = null;
737         }
738         selection = null;
739         documents = null;
740         ComThread.Release();
741     }
742
743     /** */
744     /**
745      * 打印当前word文档
746      *
747      */
748     public void printFile() {
749         if (doc != null) {
750             Dispatch.call(doc, "PrintOut");
751         }
752     }
753
754     /** */
755     /**
756      * 删除一行
757      *
758      * @param tableIndex
759      *            word文档中的第N张表(从1开始)
760      */
761     public void delRow(int tableIndex) {
762         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
763         // 要填充的表格
764         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
765         // 表格的所有行
766         Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
767         Object temp1 = Dispatch.get(rows, "Count");
768         String temp2 = temp1.toString();
769         int count = Integer.parseInt(temp2);
770         while (count > 1) {
771             Dispatch row = Dispatch.get(rows, "Last").toDispatch();
772             Dispatch.call(row, "Delete");
773             rows = Dispatch.get(table, "Rows").toDispatch();
774             temp1 = Dispatch.get(rows, "Count");
775             temp2 = temp1.toString();
776             count = Integer.parseInt(temp2);
777         }
778     }
779
780     public void setProp(String sName, String sValue) {
781         Dispatch props = Dispatch.get(doc, "CustomDocumentProperties").toDispatch();
782         Dispatch prop = Dispatch.call(props, "Item", sName).toDispatch();
783         String sOldVal = Dispatch.get(prop, "Value").toString();
784         if (!sOldVal.equals(sValue))
785             Dispatch.put(prop, "Value", sValue);
786     }
787
788     /** */
789     /**
790      * @param nType:
791      *            1, number; 2,bool; 3,date; 4,str;
792      */
793     public void addProp(String sName, int nType, String sValue) {
794         Dispatch props = Dispatch.get(doc, "CustomDocumentProperties").toDispatch();
795         Dispatch prop = null;
796         try {
797             prop = Dispatch.call(props, "Item", sName).toDispatch();
798         } catch (Exception e) {
799             prop = null;
800         }
801         if (prop != null)
802             return;
803         // 1, number; 2,bool; 3,date; 4,str;
804         prop = Dispatch.call(props, "Add", sName, false, nType, sValue).toDispatch();
805         Dispatch.put(prop, "Value", sValue);
806     }
807
808     public String getProp(String sName) {
809         String sValue = null;
810         Dispatch props = Dispatch.get(doc, "CustomDocumentProperties").toDispatch();
811         Dispatch prop = Dispatch.call(props, "Item", sName).toDispatch();
812
813         sValue = Dispatch.get(prop, "Value").toString();
814         @SuppressWarnings("unused")
815         String sType = Dispatch.get(prop, "Type").toString();
816
817         try {
818             Dispatch prop0 = Dispatch.call(doc, "CustomDocumentProperties", sName).toDispatch();
819             sValue = Dispatch.get(prop0, "Value").toString();
820         } catch (Exception e) {
821             e.printStackTrace();
822         }
823         return sValue;
824     }
825
826     public void fack_change() {
827         Dispatch _sel = Dispatch.call(doc, "Range", 0, 0).toDispatch();
828         Dispatch.call(_sel, "InsertBefore", "A");
829         Dispatch.call(_sel, "Select");
830         Dispatch.call(_sel, "Delete");
831     }
832
833     /**
834      * 从第tIndex个Table中取出值第row行,第col列的值
835      *
836      * @param tableIndex
837      *            文档中的第tIndex个Table,即tIndex为索引取
838      * @param cellRowIdx
839      *            cell在Table第row行
840      * @param cellColIdx
841      *            cell在Talbe第col列
842      * @return cell单元值
843      * @throws Exception
844      */
845     public String getCellString(int tableIndex, int cellRowIdx, int cellColIdx) throws Exception {
846         // 所有表格
847         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
848         // 要取数据的表格
849         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
850         Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch();
851         Dispatch.call(cell, "Select");
852         return Dispatch.get(selection, "Text").toString();
853     }
854
855     /**
856      * 从第tableIndex个Table中取出值第cellRowIdx行,第cellColIdx列的值
857      *
858      * @param tIndex
859      *            文档中的第tIndex个Table,即tIndex为索引取
860      * @param cellRowIdx
861      *            cell在Table第row行
862      * @param cellColIdx
863      *            cell在Talbe第col列
864      * @return cell单元值
865      * @throws Exception
866      */
867     public void getCellValue(int tableIndex, int cellRowIdx, int cellColIdx) throws Exception {
868
869         // 所有表格
870         Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
871         // 要取数据的表格
872         Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex)).toDispatch();
873         Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx), new Variant(cellColIdx)).toDispatch();
874         Dispatch.call(cell, "Select");
875         Dispatch.call(selection, "Copy");
876
877     }
878
879
880 }

3. 这里比较关键

需要调用宏来写代码,才能实现更多的功能

调用word宏 
    第一步,录制宏 
    在d盘根目录下(文档存放在哪里没有要求)新建一个word文档,名为test1.doc,打开,然后录制一段宏(具体录制哪类宏自便,调用时无需传参数即可,但是宏的保存方式要选择“所有文档(Normal)”,这样任何文档都可以调用这个宏了),宏名为macro1。 
    第二步,将test1.doc中宏macro1产生的影响撤销(比如那段宏是输入一段文字,那么就把这段文字删除)并保存,以便观察测试。 
    第三步,编写java调用代码

1 ActiveXComponent word=new ActiveXComponent("Word.Application");
2 Dispatch documents = word.getProperty("Documents").toDispatch();
3 Dispatch document = Dispatch.call(documents, "Open", "d:/test1.doc").toDispatch();//指定要打开的文档并且打开它
4 Dispatch.call(word, "Run", new Variant("macro1"));//在这个文档上运行宏  

第四步,执行这段java代码 
    执行完成之后,可以发现被撤销的宏影响又回来了,说明宏调用成功。 
    第五步,高级特性 
    在相同目录下(文档存放目录没有规定)新建一个空白的word文档test2.doc,然后将以上代码修改为:

1 ActiveXComponent word=new ActiveXComponent("Word.Application");
2 Dispatch documents = word.getProperty("Documents").toDispatch();
3 Dispatch document = Dispatch.call(documents, "Open", "d:/test2.doc").toDispatch();//指定要打开的文档并且打开它
4 Dispatch.call(word, "Run", new Variant("macro1"));//在这个文档上运行宏  

执行以上代码,可以发现,我们在test1.doc上录制的宏也可以在test2.doc上运行成功(当然选择宏保存时必须要保存到“所有文档(Normal)”中)。

调用excel宏 
    调用excel宏和调用word宏有点区别,因为excel不能将宏保存到“所有文档(Normal)”上,因此在调用宏的时候需要指明宏所在的具体文档,最后一条语句需要这么写:

1 Variant result = Dispatch.call(excel, "Run", new Variant("test.xls!Module1.test"),//这里需要说明宏所在的文档
2                                         new Variant(arg1),
3                                         new Variant(arg2)); 

4.  插入分节符代码这么来写;

首先录制一个宏,命名为InsertBreakWdSectionBreakNextPage

在程序中用jacob调用它。 
Dispatch.call(app, "Run", new Variant("InsertBreakWdSectionBreakNextPage"));

参考:

1. 合并word文档时,用Jacob 插入分节符以达到保持原来的页眉的一个可行方案

2. java调用microsoft office(如word、excel)的宏

时间: 2024-12-08 16:55:29

jacob 操作word的相关文章

Java使用Jacob操作word

近期项目需要根据word模板动态生成word文档,在网上看了些资料,在介绍的几种方法中选择了jacob方式,根据网上的资料,能解决大部分的问题,比如,生成表格,设置字体.段落格式,插入图片.设置图片格式. 可是项目中生成的word 文档还需要生成目录页,分割章节,网上找了很多资料,都没找到相关的方法,最后看到一篇博客,提供了一个思路,Java通过jacob操作office的宏,加上之前有过写宏的经验,一步步的实验终于搞定了. 博客地址:http://men4661273.iteye.com/bl

主题:jacob操作word excel

项目开发过程中,需求涉及到了各种文档转换为HTML或者网页易显示格式,现在将实现方式整理如下:  一.了解Jacob 先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的.这是一个开始于1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献. 下载地址:http://sourceforge.net/project/showfiles.php?grou

jacob操作word (转)

1 /** 2 * 感觉很厉害的样子就转了,原帖地址:http://wang-ping001.iteye.com/blog/1452057 3 */ 4 package com.xaeds.taecs.common.util; 5 6 import com.jacob.activeX.ActiveXComponent; 7 import com.jacob.com.Dispatch; 8 import com.jacob.com.Variant; 9 10 /** 11 * @author Ad

Jacob操作office文档(Word,PPT,Excel)

public boolean doc2pdf(String srcFilePath, String pdfFilePath) { ActiveXComponent app = null; Dispatch doc = null; try { ComThread.InitSTA(); app = new ActiveXComponent("Word.Application"); app.setProperty("Visible", false); Dispatch d

java调用com组件操作word使用总结(jacob)

ava调用com组件操作word使用总结(jacob) 简单描述 在此处输入简单摘要 特别声明:使用java-com技术可以完成任何VBA可以完成的office文档操作; 一.准备工作 先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的.这是一个开始于 1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献. Jacob下载地址: http://s

使用jacob打印word或excel

在看PDF打印的时候顺便也看了看word和excel的打印,这里只简单的知道如何使用,原理没有深究~ 首先这里只说打印,至于生成word或者excel,可以使用poi(jacob貌似也可以) JACOB是一个 JAVA到微软的COM接口的桥梁.使用JACOB允许任何JVM访问COM对象,从而使JAVA应用程序能够调用COM对象.如果你要对 MS Word.Excel 进行处理,JACOB 是一个好的选择. 而关于打印的话,总结起来有这么几个步骤. 1.使用Jacob创建 ActiveX部件对象:

利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

先下载jacob.jar包. 解压后将jacob.dll放到windows/system32以下或\jre\bin以下. 将jacob.jar增加项目. 这样项目的环境基本上搭建完毕,接下来就是书写相关的代码: /** * 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段.Value代表用来替换的值. * word模板中全部要替换的字段(即HashMap中的Key)以特殊字符开头和结尾. * 如:$code$.$date$--.以免执行错误的替换. * 全部要替换为图片

[转]Java Jacob操作Excel

Jacob项目:https://sourceforge.net/projects/jacob-project/ 转自:https://blog.csdn.net/ZY_extreme/article/details/80019009 转自:http://www.360doc.com/content/14/0310/11/12385684_359224303.shtml 转自:https://blog.csdn.net/ZY_extreme/article/details/80007232 转自:

C#操作Word的超详细总结

本文中用C#来操作Word,包括: 创建Word: 插入文字,选择文字,编辑文字的字号.粗细.颜色.下划线等: 设置段落的首行缩进.行距: 设置页面页边距和纸张大小: 设置页眉.页码: 插入图片,设置图片宽高以及给图片添加标题: 插入表格,格式化表格,往表格中插入数据: 保存Word,打印Word: 重新打开Word等. Visual studio版本:Visual Studio 2012(2010应该也可以) 准备工作: /* 1. 添加引用COM里面的 Microsoft Word 12.0