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 Administrator
12 *
13 */
14 public class WordBean {
15
16 // word文档
17 private Dispatch doc;
18
19 // word运行程序对象
20 private ActiveXComponent word;
21
22 // 所有word文档集合
23 private Dispatch documents;
24
25 // 选定的范围或插入点
26 private Dispatch selection;
27
28 private boolean saveOnExit = true;
29
30 public WordBean(boolean visible) throws Exception {
31 if (word == null) {
32 word = new ActiveXComponent("Word.Application");
33 word.setProperty("Visible", new Variant(visible)); // 不可见打开word
34 word.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏
35 }
36 if (documents == null)
37 documents = word.getProperty("Documents").toDispatch();
38 }
39
40 /**
41 * 设置退出时参数
42 *
43 * @param saveOnExit
44 * boolean true-退出时保存文件,false-退出时不保存文件
45 */
46 public void setSaveOnExit(boolean saveOnExit) {
47 this.saveOnExit = saveOnExit;
48 }
49
50 /**
51 * 创建一个新的word文档
52 *
53 */
54 public void createNewDocument() {
55 doc = Dispatch.call(documents, "Add").toDispatch();
56 selection = Dispatch.get(word, "Selection").toDispatch();
57 }
58
59 /**
60 * 打开一个已存在的文档
61 *
62 * @param docPath
63 */
64 public void openDocument(String docPath) {
65 closeDocument();
66 doc = Dispatch.call(documents, "Open", docPath).toDispatch();
67 selection = Dispatch.get(word, "Selection").toDispatch();
68 }
69
70 /**
71 * 打开一个保护文档,
72 *
73 * @param docPath
74 * -文件全名
75 * @param pwd
76 * -密码
77 */
78 public void openDocumentOnlyRead(String docPath, String pwd)
79 throws Exception {
80 closeDocument();
81 doc = Dispatch.callN(
82 documents,
83 "Open",
84 new Object[] { docPath, new Variant(false), new Variant(true),
85 new Variant(true), pwd, "", new Variant(false) })
86 .toDispatch();
87 selection = Dispatch.get(word, "Selection").toDispatch();
88 }
89
90 public void openDocument(String docPath, String pwd) throws Exception {
91 closeDocument();
92 doc = Dispatch.callN(
93 documents,
94 "Open",
95 new Object[] { docPath, new Variant(false), new Variant(false),
96 new Variant(true), pwd }).toDispatch();
97 selection = Dispatch.get(word, "Selection").toDispatch();
98 }
99
100 /**
101 * 把选定的内容或插入点向上移动
102 *
103 * @param pos
104 * 移动的距离
105 */
106 public void moveUp(int pos) {
107 if (selection == null)
108 selection = Dispatch.get(word, "Selection").toDispatch();
109 for (int i = 0; i < pos; i++)
110 Dispatch.call(selection, "MoveUp");
111
112 }
113
114 /**
115 * 把选定的内容或者插入点向下移动
116 *
117 * @param pos
118 * 移动的距离
119 */
120 public void moveDown(int pos) {
121 if (selection == null)
122 selection = Dispatch.get(word, "Selection").toDispatch();
123 for (int i = 0; i < pos; i++)
124 Dispatch.call(selection, "MoveDown");
125 }
126
127 /**
128 * 把选定的内容或者插入点向左移动
129 *
130 * @param pos
131 * 移动的距离
132 */
133 public void moveLeft(int pos) {
134 if (selection == null)
135 selection = Dispatch.get(word, "Selection").toDispatch();
136 for (int i = 0; i < pos; i++) {
137 Dispatch.call(selection, "MoveLeft");
138 }
139 }
140
141 /**
142 * 把选定的内容或者插入点向右移动
143 *
144 * @param pos
145 * 移动的距离
146 */
147 public void moveRight(int pos) {
148 if (selection == null)
149 selection = Dispatch.get(word, "Selection").toDispatch();
150 for (int i = 0; i < pos; i++)
151 Dispatch.call(selection, "MoveRight");
152 }
153
154 /**
155 * 把插入点移动到文件首位置
156 *
157 */
158 public void moveStart() {
159 if (selection == null)
160 selection = Dispatch.get(word, "Selection").toDispatch();
161 Dispatch.call(selection, "HomeKey", new Variant(6));
162 }
163 public void enterStart(){
164 if (selection == null)
165 selection = Dispatch.get(word, "Selection").toDispatch();
166 Dispatch.call(selection, "TypeParagraph");
167 }
168 /**
169 * 从选定内容或插入点开始查找文本
170 *
171 * @param toFindText
172 * 要查找的文本
173 * @return boolean true-查找到并选中该文本,false-未查找到文本
174 */
175 @SuppressWarnings("static-access")
176 public boolean find(String toFindText) {
177 if (toFindText == null || toFindText.equals(""))
178 return false;
179 // 从selection所在位置开始查询
180 Dispatch find = word.call(selection, "Find").toDispatch();
181 // 设置要查找的内容
182 Dispatch.put(find, "Text", toFindText);
183 // 向前查找
184 Dispatch.put(find, "Forward", "True");
185 // 设置格式
186 Dispatch.put(find, "Format", "True");
187 // 大小写匹配
188 Dispatch.put(find, "MatchCase", "True");
189 // 全字匹配
190 Dispatch.put(find, "MatchWholeWord", "True");
191 // 查找并选中
192 return Dispatch.call(find, "Execute").getBoolean();
193 }
194
195 /**
196 * 把选定选定内容设定为替换文本
197 *
198 * @param toFindText
199 * 查找字符串
200 * @param newText
201 * 要替换的内容
202 * @return
203 */
204 public boolean replaceText(String toFindText, String newText) {
205 if (!find(toFindText))
206 return false;
207 Dispatch.put(selection, "Text", newText);
208 return true;
209 }
210
211 /**
212 * 全局替换文本
213 *
214 * @param toFindText
215 * 查找字符串
216 * @param newText
217 * 要替换的内容
218 */
219 public void replaceAllText(String toFindText, String newText) {
220 while (find(toFindText)) {
221 Dispatch.put(selection, "Text", newText);
222 Dispatch.call(selection, "MoveRight");
223 }
224 }
225
226 /**
227 * 在当前插入点插入字符串
228 *
229 * @param newText
230 * 要插入的新字符串
231 */
232 public void insertText(String newText) {
233 Dispatch.put(selection, "Text", newText);
234 }
235
236 /**
237 *
238 * @param toFindText
239 * 要查找的字符串
240 * @param imagePath
241 * 图片路径
242 * @return
243 */
244 public boolean replaceImage(String toFindText, String imagePath) {
245 if (!find(toFindText))
246 return false;
247 Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),
248 "AddPicture", imagePath);
249 return true;
250 }
251
252 /**
253 * 全局替换图片
254 *
255 * @param toFindText
256 * 查找字符串
257 * @param imagePath
258 * 图片路径
259 */
260 public void replaceAllImage(String toFindText, String imagePath) {
261 while (find(toFindText)) {
262 Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),
263 "AddPicture", imagePath);
264 Dispatch.call(selection, "MoveRight");
265 }
266 }
267
268 /**
269 * 在当前插入点插入图片
270 *
271 * @param imagePath
272 * 图片路径
273 */
274 public void insertImage(String imagePath) {
275 Dispatch.call(Dispatch.get(selection, "InLineShapes").toDispatch(),
276 "AddPicture", imagePath);
277 }
278
279 /**
280 * 合并当前表格指定的单元格 如果需要一次合并几个单元格只需要指出第一个单元格和最后一个单元格
281 *
282 * @param fstCellRowIndex
283 * 第一个单元格的行索引
284 * @param fstCellColIndex
285 * 第一个单元格的列索引
286 * @param secCellRowIndex
287 * 第二个单元格的行索引
288 * @param secCellColIndex
289 * 第二个单元格的列索引
290 */
291 public void mergeCell(int tableIndex, int fstCellRowIdx, int fstCellColIdx,
292 int secCellRowIdx, int secCellColIdx) {
293 // 所有表格
294 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
295 // 要填充的表格
296 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
297 .toDispatch();
298 Dispatch fstCell = Dispatch.call(table, "Cell",
299 new Variant(fstCellRowIdx), new Variant(fstCellColIdx))
300 .toDispatch();
301 Dispatch secCell = Dispatch.call(table, "Cell",
302 new Variant(secCellRowIdx), new Variant(secCellColIdx))
303 .toDispatch();
304 Dispatch.call(fstCell, "Merge", secCell);
305 }
306
307 /**
308 * 在指定的单元格里填写数据
309 *
310 * @param tableIndex
311 * @param cellRowIdx
312 * @param cellColIdx
313 * @param txt
314 */
315 public void putTxtToCell(int tableIndex, int cellRowIdx, int cellColIdx,
316 String txt) {
317 // 所有表格
318 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
319 // 要填充的表格
320 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
321 .toDispatch();
322 Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx),
323 new Variant(cellColIdx)).toDispatch();
324 Dispatch.call(cell, "Select");
325 Dispatch.put(selection, "Text", txt);
326 }
327
328 /**
329 * 获得指定的单元格里数据
330 *
331 * @param tableIndex
332 * @param cellRowIdx
333 * @param cellColIdx
334 * @return
335 */
336 public String getTxtFromCell(int tableIndex, int cellRowIdx, int cellColIdx) {
337 // 所有表格
338 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
339 // 要填充的表格
340 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
341 .toDispatch();
342 Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx),
343 new Variant(cellColIdx)).toDispatch();
344 Dispatch.call(cell, "Select");
345 String ret = "";
346 ret = Dispatch.get(selection, "Text").toString();
347 ret = ret.substring(0, ret.length() - 1); // 去掉最后的回车符;
348 return ret;
349 }
350
351 /**
352 * 在当前文档拷贝剪贴板数据
353 *
354 * @param pos
355 */
356 public void pasteExcelSheet(String pos) {
357 moveStart();
358 if (this.find(pos)) {
359 Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
360 Dispatch.call(textRange, "Paste");
361 }
362 }
363
364 /**
365 * 在当前文档指定的位置拷贝表格
366 *
367 * @param pos
368 * 当前文档指定的位置
369 * @param tableIndex
370 * 被拷贝的表格在word文档中所处的位置
371 */
372 public void copyTable(String pos, int tableIndex) {
373 // 所有表格
374 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
375 // 要填充的表格
376 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
377 .toDispatch();
378 Dispatch range = Dispatch.get(table, "Range").toDispatch();
379 Dispatch.call(range, "Copy");
380 if (this.find(pos)) {
381 Dispatch textRange = Dispatch.get(selection, "Range").toDispatch();
382 Dispatch.call(textRange, "Paste");
383 }
384 }
385
386 /**
387 * 在当前文档指定的位置拷贝来自另一个文档中的表格
388 *
389 * @param anotherDocPath
390 * 另一个文档的磁盘路径
391 * @param tableIndex
392 * 被拷贝的表格在另一格文档中的位置
393 * @param pos
394 * 当前文档指定的位置
395 */
396 public void copyTableFromAnotherDoc(String anotherDocPath, int tableIndex,
397 String pos) {
398 Dispatch doc2 = null;
399 try {
400 doc2 = Dispatch.call(documents, "Open", anotherDocPath)
401 .toDispatch();
402 // 所有表格
403 Dispatch tables = Dispatch.get(doc2, "Tables").toDispatch();
404 // 要填充的表格
405 Dispatch table = Dispatch.call(tables, "Item",
406 new Variant(tableIndex)).toDispatch();
407 Dispatch range = Dispatch.get(table, "Range").toDispatch();
408 Dispatch.call(range, "Copy");
409 if (this.find(pos)) {
410 Dispatch textRange = Dispatch.get(selection, "Range")
411 .toDispatch();
412 Dispatch.call(textRange, "Paste");
413 }
414 } catch (Exception e) {
415 e.printStackTrace();
416 } finally {
417 if (doc2 != null) {
418 Dispatch.call(doc2, "Close", new Variant(saveOnExit));
419 doc2 = null;
420 }
421 }
422 }
423
424 /**
425 * 在当前文档指定的位置拷贝来自另一个文档中的图片
426 *
427 * @param anotherDocPath
428 * 另一个文档的磁盘路径
429 * @param shapeIndex
430 * 被拷贝的图片在另一格文档中的位置
431 * @param pos
432 * 当前文档指定的位置
433 */
434 public void copyImageFromAnotherDoc(String anotherDocPath, int shapeIndex,
435 String pos) {
436 Dispatch doc2 = null;
437 try {
438 doc2 = Dispatch.call(documents, "Open", anotherDocPath)
439 .toDispatch();
440 Dispatch shapes = Dispatch.get(doc2, "InLineShapes").toDispatch();
441 Dispatch shape = Dispatch.call(shapes, "Item",
442 new Variant(shapeIndex)).toDispatch();
443 Dispatch imageRange = Dispatch.get(shape, "Range").toDispatch();
444 Dispatch.call(imageRange, "Copy");
445 if (this.find(pos)) {
446 Dispatch textRange = Dispatch.get(selection, "Range")
447 .toDispatch();
448 Dispatch.call(textRange, "Paste");
449 }
450 } catch (Exception e) {
451 e.printStackTrace();
452 } finally {
453 if (doc2 != null) {
454 Dispatch.call(doc2, "Close", new Variant(saveOnExit));
455 doc2 = null;
456 }
457 }
458 }
459
460 /**
461 * 创建表格
462 *
463 * @param pos
464 * 位置
465 * @param cols
466 * 列数
467 * @param rows
468 * 行数
469 */
470 public void createTable(String pos, int numCols, int numRows) {
471 if (find(pos)) {
472 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
473 Dispatch range = Dispatch.get(selection, "Range").toDispatch();
474 @SuppressWarnings("unused")
475 Dispatch newTable = Dispatch.call(tables, "Add", range,
476 new Variant(numRows), new Variant(numCols),new Variant(1)).toDispatch();
477 Dispatch.call(selection, "MoveRight");
478 } else {
479 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
480 Dispatch range = Dispatch.get(selection, "Range").toDispatch();
481 @SuppressWarnings("unused")
482 Dispatch newTable = Dispatch.call(tables, "Add", range,
483 new Variant(numRows), new Variant(numCols),new Variant(1)).toDispatch();
484 Dispatch.call(selection, "MoveRight");
485 }
486 }
487
488 /**
489 * 在指定行前面增加行
490 *
491 * @param tableIndex
492 * word文件中的第N张表(从1开始)
493 * @param rowIndex
494 * 指定行的序号(从1开始)
495 */
496 public void addTableRow(int tableIndex, int rowIndex) {
497 // 所有表格
498 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
499 // 要填充的表格
500 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
501 .toDispatch();
502 // 表格的所有行
503 Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
504 Dispatch row = Dispatch.call(rows, "Item", new Variant(rowIndex))
505 .toDispatch();
506 Dispatch.call(rows, "Add", new Variant(row));
507 }
508
509 /**
510 * 在第1行前增加一行
511 *
512 * @param tableIndex
513 * word文档中的第N张表(从1开始)
514 */
515 public void addFirstTableRow(int tableIndex) {
516 // 所有表格
517 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
518 // 要填充的表格
519 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
520 .toDispatch();
521 // 表格的所有行
522 Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
523 Dispatch row = Dispatch.get(rows, "First").toDispatch();
524 Dispatch.call(rows, "Add", new Variant(row));
525 }
526
527 /**
528 * 在最后1行前增加一行
529 *
530 * @param tableIndex
531 * word文档中的第N张表(从1开始)
532 */
533 public void addLastTableRow(int tableIndex) {
534 // 所有表格
535 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
536 // 要填充的表格
537 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
538 .toDispatch();
539 // 表格的所有行
540 Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
541 Dispatch row = Dispatch.get(rows, "Last").toDispatch();
542 Dispatch.call(rows, "Add", new Variant(row));
543 }
544
545 /**
546 * 增加一行
547 *
548 * @param tableIndex
549 * word文档中的第N张表(从1开始)
550 */
551 public void addRow(int tableIndex) {
552 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
553 // 要填充的表格
554 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
555 .toDispatch();
556 // 表格的所有行
557 Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
558 Dispatch.call(rows, "Add");
559 }
560
561 /**
562 * 增加一列
563 *
564 * @param tableIndex
565 * word文档中的第N张表(从1开始)
566 */
567 public void addCol(int tableIndex) {
568 // 所有表格
569 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
570 // 要填充的表格
571 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
572 .toDispatch();
573 // 表格的所有行
574 Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
575 Dispatch.call(cols, "Add").toDispatch();
576 Dispatch.call(cols, "AutoFit");
577 }
578
579 /**
580 * 在指定列前面增加表格的列
581 *
582 * @param tableIndex
583 * word文档中的第N张表(从1开始)
584 * @param colIndex
585 * 制定列的序号 (从1开始)
586 */
587 public void addTableCol(int tableIndex, int colIndex) {
588 // 所有表格
589 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
590 // 要填充的表格
591 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
592 .toDispatch();
593 // 表格的所有行
594 Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
595 System.out.println(Dispatch.get(cols, "Count"));
596 Dispatch col = Dispatch.call(cols, "Item", new Variant(colIndex))
597 .toDispatch();
598 // Dispatch col = Dispatch.get(cols, "First").toDispatch();
599 Dispatch.call(cols, "Add", col).toDispatch();
600 Dispatch.call(cols, "AutoFit");
601 }
602
603 /**
604 * 在第1列前增加一列
605 *
606 * @param tableIndex
607 * word文档中的第N张表(从1开始)
608 */
609 public void addFirstTableCol(int tableIndex) {
610 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
611 // 要填充的表格
612 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
613 .toDispatch();
614 // 表格的所有行
615 Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
616 Dispatch col = Dispatch.get(cols, "First").toDispatch();
617 Dispatch.call(cols, "Add", col).toDispatch();
618 Dispatch.call(cols, "AutoFit");
619 }
620
621 /**
622 * 在最后一列前增加一列
623 *
624 * @param tableIndex
625 * word文档中的第N张表(从1开始)
626 */
627 public void addLastTableCol(int tableIndex) {
628 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
629 // 要填充的表格
630 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
631 .toDispatch();
632 // 表格的所有行
633 Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
634 Dispatch col = Dispatch.get(cols, "Last").toDispatch();
635 Dispatch.call(cols, "Add", col).toDispatch();
636 Dispatch.call(cols, "AutoFit");
637 }
638
639 /**
640 * 自动调整表格
641 *
642 */
643 public void autoFitTable() {
644 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
645 int count = Dispatch.get(tables, "Count").toInt();
646 for (int i = 0; i < count; i++) {
647 Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1))
648 .toDispatch();
649 Dispatch cols = Dispatch.get(table, "Columns").toDispatch();
650 Dispatch.call(cols, "AutoFit");
651 }
652 }
653
654 /**
655 * 调用word里的宏以调整表格的宽度,其中宏保存在document下
656 *
657 */
658 public void callWordMacro() {
659 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
660 int count = Dispatch.get(tables, "Count").toInt();
661 Variant vMacroName = new Variant("Normal.NewMacros.tableFit");
662 @SuppressWarnings("unused")
663 Variant vParam = new Variant("param1");
664 @SuppressWarnings("unused")
665 Variant para[] = new Variant[] { vMacroName };
666 for (int i = 0; i < count; i++) {
667 Dispatch table = Dispatch.call(tables, "Item", new Variant(i + 1))
668 .toDispatch();
669 Dispatch.call(table, "Select");
670 Dispatch.call(word, "Run", "tableFitContent");
671 }
672 }
673
674 /**
675 * 设置当前选定内容的字体
676 *
677 * @param boldSize
678 * @param italicSize
679 * @param underLineSize
680 * 下划线
681 * @param colorSize
682 * 字体颜色
683 * @param size
684 * 字体大小
685 * @param name
686 * 字体名称
687 */
688 public void setFont(boolean bold, boolean italic, boolean underLine,
689 String size, String name) {
690 Dispatch font = Dispatch.get(selection, "Font").toDispatch();
691 Dispatch.put(font, "Name", new Variant(name));
692 Dispatch.put(font, "Bold", new Variant(bold));
693 Dispatch.put(font, "Italic", new Variant(italic));
694 Dispatch.put(font, "Underline", new Variant(underLine));
695 Dispatch.put(font, "Size", size);
696 }
697
698 /**
699 * 设置单元格被选中
700 *
701 * @param tableIndex
702 * @param cellRowIdx
703 * @param cellColIdx
704 */
705 public void setTableCellSelected(int tableIndex, int cellRowIdx,
706 int cellColIdx) {
707 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
708 Dispatch table = Dispatch.call(tables, "Item", new Variant(tableIndex))
709 .toDispatch();
710 Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx),
711 new Variant(cellColIdx)).toDispatch();
712 Dispatch.call(cell, "Select");
713 }
714
715 /**
716 * 设置选定单元格的垂直对起方式, 请使用setTableCellSelected选中一个单元格
717 *
718 * @param align
719 * 0-顶端, 1-居中, 3-底端
720 */
721 public void setCellVerticalAlign(int verticalAlign) {
722 Dispatch cells = Dispatch.get(selection, "Cells").toDispatch();
723 Dispatch.put(cells, "VerticalAlignment", new Variant(verticalAlign));
724 }
725
726 /**
727 * 设置当前文档中所有表格水平居中方式及其它一些格式,用在将word文件转化为html中,针对申报表
728 */
729 public void setApplyTableFormat() {
730 Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
731 int tabCount = Integer
732 .valueOf(Dispatch.get(tables, "Count").toString()); // System.out.println(tabCount);
733 System.out
734 .println("*******************************************************");
735 for (int i = 1; i <= tabCount; i++) {
736 Dispatch table = Dispatch.call(tables, "Item", new Variant(i))
737 .toDispatch();
738 Dispatch rows = Dispatch.get(table, "Rows").toDispatch();
739
740 if (i == 1) {
741 Dispatch.put(rows, "Alignment", new Variant(2)); // 1-居中,2-Right
742 continue;
743 }
744 Dispatch.put(rows, "Alignment", new Variant(1)); // 1-居中
745 Dispatch.call(table, "AutoFitBehavior", new Variant(1));// 设置自动调整表格方式,1-根据窗口自动调整
746 Dispatch.put(table, "PreferredWidthType", new Variant(1));
747 Dispatch.put(table, "PreferredWidth", new Variant(700));
748 System.out.println(Dispatch.get(rows, "HeightRule").toString());
749 Dispatch.put(rows, "HeightRule", new Variant(1)); // 0-自动wdRowHeightAuto,1-最小值wdRowHeightAtLeast,
750 // 2-固定wdRowHeightExactly
751 Dispatch.put(rows, "Height", new Variant(0.04 * 28.35));
752 // int oldAlign = Integer.valueOf(Dispatch.get(rows,
753 // "Alignment").toString());
754 // System.out.println("Algin:" + oldAlign);
755 }
756 }
757
758 /**
759 * 设置段落格式
760 *
761 * @param alignment
762 * 0-左对齐, 1-右对齐, 2-右对齐, 3-两端对齐, 4-分散对齐
763 * @param lineSpaceingRule
764 * @param lineUnitBefore
765 * @param lineUnitAfter
766 * @param characterUnitFirstLineIndent
767 */
768 public void setParagraphsProperties(int alignment, int lineSpaceingRule,
769 int lineUnitBefore, int lineUnitAfter,
770 int characterUnitFirstLineIndent) {
771 Dispatch paragraphs = Dispatch.get(selection, "Paragraphs")
772 .toDispatch();
773 Dispatch.put(paragraphs, "Alignment", new Variant(alignment)); // 对齐方式
774 Dispatch.put(paragraphs, "LineSpacingRule", new Variant(
775 lineSpaceingRule)); // 行距
776 Dispatch.put(paragraphs, "LineUnitBefore", new Variant(lineUnitBefore)); // 段前
777 Dispatch.put(paragraphs, "LineUnitAfter", new Variant(lineUnitAfter)); // 段后
778 Dispatch.put(paragraphs, "CharacterUnitFirstLineIndent", new Variant(
779 characterUnitFirstLineIndent)); // 首行缩进字符数
780 }
781
782 /**
783 * 设置当前段落格式, 使用前,请先选中段落
784 */
785 public void getParagraphsProperties() {
786 Dispatch paragraphs = Dispatch.get(selection, "Paragraphs")
787 .toDispatch();
788 String val = Dispatch.get(paragraphs, "LineSpacingRule").toString(); // 行距
789 val = Dispatch.get(paragraphs, "Alignment").toString(); // 对齐方式
790 val = Dispatch.get(paragraphs, "LineUnitBefore").toString(); // 段前行数
791 val = Dispatch.get(paragraphs, "LineUnitAfter").toString(); // 段后行数
792 val = Dispatch.get(paragraphs, "FirstLineIndent").toString(); // 首行缩进
793 val = Dispatch.get(paragraphs, "CharacterUnitFirstLineIndent")
794 .toString(); // 首行缩进字符数
795 }
796
797 /**
798 * 文件保存或另存为
799 *
800 * @param savePath
801 * 保存或另存为路径
802 */
803 public void save(String savePath) {
804 Dispatch.call(Dispatch.call(word, "WordBasic").getDispatch(),
805 "FileSaveAs", savePath);
806 }
807
808 /**
809 * 文件保存为html格式
810 *
811 * @param savePath
812 * @param htmlPath
813 */
814 public void saveAsHtml(String htmlPath) {
815 Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {
816 htmlPath, new Variant(8) }, new int[1]);
817 }
818
819 /**
820 * 关闭文档
821 *
822 * @param val
823 * 0不保存修改 -1 保存修改 -2 提示是否保存修改
824 */
825 public void closeDocument(int val) {
826 Dispatch.call(doc, "Close", new Variant(val));
827 doc = null;
828 }
829
830 /**
831 * 关闭当前word文档
832 *
833 */
834 public void closeDocument() {
835 if (doc != null) {
836 Dispatch.call(doc, "Save");
837 Dispatch.call(doc, "Close", new Variant(saveOnExit));
838 doc = null;
839 }
840 }
841
842 public void closeDocumentWithoutSave() {
843 if (doc != null) {
844 Dispatch.call(doc, "Close", new Variant(false));
845 doc = null;
846 }
847 }
848
849 /**
850 * 关闭全部应用
851 *
852 */
853 public void close() {
854 // closeDocument();
855 if (word != null) {
856 Dispatch.call(word, "Quit");
857 word = null;
858 }
859 selection = null;
860 documents = null;
861 }
862
863 /**
864 * 打印当前word文档
865 *
866 */
867 public void printFile() {
868 if (doc != null) {
869 Dispatch.call(doc, "PrintOut");
870 }
871 }
872
873 /**
874 * 保护当前档,如果不存在, 使用expression.Protect(Type, NoReset, Password)
875 *
876 * @param pwd
877 * WdProtectionType 可以是下列 WdProtectionType 常量之一:
878 * 1-wdAllowOnlyComments, 2-wdAllowOnlyFormFields,
879 * 0-wdAllowOnlyRevisions, -1-wdNoProtection,
880 * 3-wdAllowOnlyReading
881 *
882 * 使用参照 main1()
883 */
884 public void protectedWord(String pwd) {
885 String protectionType = Dispatch.get(doc, "ProtectionType").toString();
886 if (protectionType.equals("-1")) {
887 Dispatch.call(doc, "Protect", new Variant(3), new Variant(true),
888 pwd);
889 }
890 }
891
892 /**
893 * 解除文档保护,如果存在
894 *
895 * @param pwd
896 * WdProtectionType 常量之一(Long 类型,只读):
897 * 1-wdAllowOnlyComments,2-wdAllowOnlyFormFields、
898 * 0-wdAllowOnlyRevisions,-1-wdNoProtection, 3-wdAllowOnlyReading
899 *
900 * 使用参照 main1()
901 */
902 public void unProtectedWord(String pwd) {
903 String protectionType = Dispatch.get(doc, "ProtectionType").toString();
904 if (protectionType.equals("3")) {
905 Dispatch.call(doc, "Unprotect", pwd);
906 }
907 }
908
909 /**
910 * 设置word文档安全级别
911 *
912 * @param value
913 * 1-msoAutomationSecurityByUI 使用“安全”对话框指定的安全设置。
914 * 2-msoAutomationSecurityForceDisable
915 * 在程序打开的所有文件中禁用所有宏,而不显示任何安全提醒。 3-msoAutomationSecurityLow
916 * 启用所有宏,这是启动应用程序时的默认值。
917 */
918 public void setAutomationSecurity(int value) {
919 word.setProperty("AutomationSecurity", new Variant(value));
920 }
921
922 /**
923 * 读取文档中第paragraphsIndex段文字的内容;
924 *
925 * @param paragraphsIndex
926 * @return
927 */
928 public String getParagraphs(int paragraphsIndex) {
929 String ret = "";
930 Dispatch paragraphs = Dispatch.get(doc, "Paragraphs").toDispatch(); // 所有段落
931 int paragraphCount = Dispatch.get(paragraphs, "Count").getInt(); // 一共的段落数
932 Dispatch paragraph = null;
933 Dispatch range = null;
934 if (paragraphCount > paragraphsIndex && 0 < paragraphsIndex) {
935 paragraph = Dispatch.call(paragraphs, "Item",
936 new Variant(paragraphsIndex)).toDispatch();
937 range = Dispatch.get(paragraph, "Range").toDispatch();
938 ret = Dispatch.get(range, "Text").toString();
939 }
940 return ret;
941 }
942
943 /**
944 * 设置页眉文字
945 *
946 * @param cont
947 * @return
948 *
949 * Sub AddHeaderText() '设置页眉或页脚中的文字 '由 Headers、Footers 和
950 * HeaderFooter 属性返回 HeaderFooter 对象。下列示例更改当前页眉中的文字。 With
951 * ActiveDocument.ActiveWindow.View .SeekView =
952 * wdSeekCurrentPageHeader Selection.HeaderFooter.Range.Text =
953 * "Header text" .SeekView = wdSeekMainDocument End With End Sub
954 */
955 public void setHeaderContent(String cont) {
956 Dispatch activeWindow = Dispatch.get(doc, "ActiveWindow").toDispatch();
957 Dispatch view = Dispatch.get(activeWindow, "View").toDispatch();
958 // Dispatch seekView = Dispatch.get(view, "SeekView").toDispatch();
959 Dispatch.put(view, "SeekView", new Variant(9)); // wdSeekCurrentPageHeader-9
960
961 Dispatch headerFooter = Dispatch.get(selection, "HeaderFooter")
962 .toDispatch();
963 Dispatch range = Dispatch.get(headerFooter, "Range").toDispatch();
964 Dispatch.put(range, "Text", new Variant(cont));
965 // String content = Dispatch.get(range, "Text").toString();
966 Dispatch font = Dispatch.get(range, "Font").toDispatch();
967
968 Dispatch.put(font, "Name", new Variant("宋体 (中文正文)"));
969 Dispatch.put(font, "Bold", new Variant(false));
970 // Dispatch.put(font, "Italic", new Variant(true));
971 // Dispatch.put(font, "Underline", new Variant(true));
972 Dispatch.put(font, "Size", 9);
973
974 Dispatch.put(view, "SeekView", new Variant(0)); // wdSeekMainDocument-0恢复视图;
975 }
976 }