1 using Microsoft.Office.Interop.Word;
2 using System;
3 using System.Collections.Generic;
4 using System.Drawing;
5 using System.IO;
6 using System.Linq;
7 using System.Reflection;
8 using System.Text.RegularExpressions;
9
10 namespace OtaReportTool
11 {
12 public class WordHelper
13 {
14 #region 成员变量
15
16 private bool isWordVisible = false;
17 private object missing = Missing.Value;
18 private Application app;
19 private Document doc;
20
21 #endregion 成员变量
22
23 #region 构造函数
24
25 /// <summary>
26 /// 构造函数,新建一个工作簿
27 /// </summary>
28 public WordHelper()
29 {
30 app = new Application();
31 app.Visible = isWordVisible;
32 doc = app.Documents.Add(ref missing, ref missing, ref missing, ref missing);
33 }
34
35 /// <summary>
36 /// 构造函数,打开一个已有的工作簿
37 /// </summary>
38 /// <param name="fileName">Excel文件名</param>
39 public WordHelper(string fileName)
40 {
41 if (!File.Exists(fileName))
42 throw new Exception("指定路径的Word文件不存在!");
43
44 //创建Word进程
45 app = new Application();
46 app.Visible = isWordVisible;
47
48 //打开Word文件
49 object objFileName = fileName;
50 object objIsWordVisible = isWordVisible;
51 object objIsWordReadOnly = true;
52 object objEncoding = Microsoft.Office.Core.MsoEncoding.msoEncodingUTF8;
53 doc = app.Documents.Open(ref objFileName,
54 ref missing, ref objIsWordReadOnly, ref missing,
55 ref missing, ref missing, ref missing, ref missing,
56 ref missing, ref missing, ref objEncoding, ref objIsWordVisible,
57 ref missing, ref missing, ref missing, ref missing);
58 doc.Activate();
59
60 //将视图从 页面视图 切换到 普通视图,避免因为分页计算而延迟word响应时间
61 if (doc.ActiveWindow.View.SplitSpecial == WdSpecialPane.wdPaneNone)
62 {
63 doc.ActiveWindow.ActivePane.View.Type = WdViewType.wdNormalView;
64 }
65 else
66 {
67 doc.ActiveWindow.View.Type = WdViewType.wdNormalView;
68 }
69 }
70
71 #endregion 构造函数
72
73 #region 文本操作
74
75 /// <summary>
76 /// 设置字体
77 /// </summary>
78 /// <param name="sFontName"></param>
79 public void SetFont(string sFontName)
80 {
81 doc.Select();
82 app.Selection.Font.Name = sFontName;
83 }
84
85 /// <summary>
86 /// 插入文本 Inserts the specified text.
87 /// </summary>
88 /// <param name="text"></param>
89 public void InsertText(string text)
90 {
91 app.Selection.TypeText(text);
92 }
93
94 /// <summary>
95 /// Enter(换行) Inserts a new, blank paragraph.
96 /// </summary>
97 public void InsertLineBreak()
98 {
99 app.Selection.TypeParagraph();
100 }
101
102 /// <summary>
103 /// 插入分页符
104 /// </summary>
105 public void InsertBreak()
106 {
107 Paragraph para = doc.Content.Paragraphs.Add(missing);
108 object pBreak = (int)WdBreakType.wdSectionBreakNextPage;
109 para.Range.InsertBreak(ref pBreak);
110 }
111
112 /// <summary>
113 /// 插入图片(图片大小自适应)
114 /// </summary>
115 /// <param name="fileName">图片名(包含路径)</param>
116 public void InsertPic(string fileName)
117 {
118 object range = app.Selection.Range;
119 InsertPic(fileName, missing, missing, range);
120 }
121
122 /// <summary>
123 /// 插入图片(带标题)
124 /// </summary>
125 /// <param name="fileName">图片名</param>
126 /// <param name="caption">标题</param>
127 public void InsertPic(string fileName, string caption)
128 {
129 object range = app.Selection.Range;
130 InsertPic(fileName, missing, missing, range, 0, 0, caption);
131 }
132
133 /// <summary>
134 /// 插入图片
135 /// </summary>
136 /// <param name="fileName">图片名(包含路径)</param>
137 /// <param name="width">设置宽度</param>
138 /// <param name="height">设置高度</param>
139 public void InsertPic(string fileName, float width, float height)
140 {
141 object range = app.Selection.Range;
142 InsertPic(fileName, missing, missing, range, width, height);
143 }
144
145 /// <summary>
146 /// 插入图片(带标题)
147 /// </summary>
148 /// <param name="fileName">图片名(包含路径)</param>
149 /// <param name="width">设置宽度</param>
150 /// <param name="height">设置高度<</param>
151 /// <param name="caption">标题或备注文字</param>
152 public void InsertPic(string fileName, float width, float height, string caption)
153 {
154 object range = app.Selection.Range;
155 InsertPic(fileName, missing, missing, range, width, height, caption);
156 }
157
158 /// <summary>
159 /// 插入图片(带标题)
160 /// </summary>
161 public void InsertPic(string FileName, object LinkToFile, object SaveWithDocument, object Range, float Width, float Height, string caption)
162 {
163 app.Selection.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Range).Select();
164 if (Width > 0)
165 {
166 app.Selection.InlineShapes[1].Width = Width;
167 }
168 if (Height > 0)
169 {
170 app.Selection.InlineShapes[1].Height = Height;
171 }
172
173 object Label = WdCaptionLabelID.wdCaptionFigure;
174 object Title = caption;
175 object TitleAutoText = "";
176 object Position = WdCaptionPosition.wdCaptionPositionBelow;
177 object ExcludeLabel = true;
178 app.Selection.InsertCaption(ref Label, ref Title, ref TitleAutoText, ref Position, ref ExcludeLabel);
179 MoveRight();
180 }
181
182 /// <summary>
183 /// Adds a picture to a document.
184 /// </summary>
185 /// <param name="FileName">Required String. The path and file name of the picture.</param>
186 /// <param name="LinkToFile">Optional Object. True to link the picture to the file from which it was created. False to make the picture an independent copy of the file. The default value is False.</param>
187 /// <param name="SaveWithDocument">Optional Object. True to save the linked picture with the document. The default value is False.</param>
188 /// <param name="Range">Optional Object. The location where the picture will be placed in the text. If the range isn't collapsed, the picture replaces the range; otherwise, the picture is inserted. If this argument is omitted, the picture is placed automatically.</param>
189 /// <param name="Width">Sets the width of the specified object, in points. </param>
190 /// <param name="Height">Sets the height of the specified inline shape. </param>
191 public void InsertPic(string FileName, object LinkToFile, object SaveWithDocument, object Range, float Width, float Height)
192 {
193 app.Selection.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Range).Select();
194 app.Selection.InlineShapes[1].Width = Width;
195 app.Selection.InlineShapes[1].Height = Height;
196 MoveRight();
197 }
198
199 /// <summary>/// Adds a picture to a document.
200 /// </summary>
201 /// <param name="FileName">Required String. The path and file name of the picture.</param>
202 /// <param name="LinkToFile">Optional Object. True to link the picture to the file from which it was created. False to make the picture an independent copy of the file. The default value is False.</param>
203 /// <param name="SaveWithDocument">Optional Object. True to save the linked picture with the document. The default value is False.</param>
204 /// <param name="Range">Optional Object. The location where the picture will be placed in the text. If the range isn't collapsed, the picture replaces the range; otherwise, the picture is inserted. If this argument is omitted, the picture is placed automatically.</param>
205 public void InsertPic(string FileName, object LinkToFile, object SaveWithDocument, object Range)
206 {
207 app.Selection.InlineShapes.AddPicture(FileName, ref LinkToFile, ref SaveWithDocument, ref Range);
208 }
209
210 /// <summary>
211 /// 获取段落的文本
212 /// </summary>
213 /// <param name="index">段落编号</param>
214 /// <returns></returns>
215 public string Paragraph(int index)
216 {
217 Paragraph para = doc.Content.Paragraphs[index]; ///这是一个设定对应的某一段
218 return para.Range.Text;
219 }
220
221 public void DeleteParagraph(int index)
222 {
223 Paragraph para = doc.Content.Paragraphs[index]; ///这是一个设定对应的某一段
224 para.Range.Delete();
225 return;
226 }
227
228 public string Section(int index)
229 {
230 return doc.Sections[index].Range.Text;
231 }
232
233 public void DeleteSection(int index)
234 {
235 Sections secs = doc.Sections;
236 Section sec = secs[index];
237
238 sec.Range.Delete();
239 return;
240 }
241
242 /// <summary>
243 /// 替换文档中的文本
244 /// </summary>
245 /// <param name="oldString">原有内容</param>
246 /// <param name="newString">替换后的内容</param>
247 public void ReplaceString(string oldString, string newString)
248 {
249 doc.Content.Find.Text = oldString;
250 object FindText, ReplaceWith, ReplaceAll;
251 FindText = oldString;
252 ReplaceWith = newString;
253 ReplaceAll = WdReplace.wdReplaceAll;
254 doc.Content.Find.Execute(ref FindText,
255 ref missing,
256 ref missing,
257 ref missing,
258 ref missing,
259 ref missing,
260 ref missing,
261 ref missing,
262 ref missing,
263 ref ReplaceWith,
264 ref ReplaceAll,
265 ref missing,
266 ref missing,
267 ref missing,
268 ref missing);
269 }
270
271 /// <summary>
272 /// 获取word文档的纯文本
273 /// </summary>
274 /// <returns></returns>
275 public string GetText()
276 {
277 return doc.Content.Text;
278 }
279
280 #endregion 文本操作
281
282 #region 格式操作
283
284 /// <summary>
285 /// 设置对齐方式
286 /// </summary>
287 /// <param name="rng"></param>
288 /// <param name="alignment"></param>
289 /// <returns></returns>
290 public WdParagraphAlignment SetAlignment(Range rng, Alignment alignment)
291 {
292 rng.ParagraphFormat.Alignment = SetAlignment(alignment);
293 return SetAlignment(alignment);
294 }
295
296 public WdParagraphAlignment SetAlignment(Alignment alignment)
297 {
298 if (alignment == Alignment.居中)
299 {
300 return WdParagraphAlignment.wdAlignParagraphCenter;
301 }
302 else if (alignment == Alignment.左对齐)
303 {
304 return WdParagraphAlignment.wdAlignParagraphLeft;
305 }
306 else
307 { return WdParagraphAlignment.wdAlignParagraphRight; }
308 }
309
310 //字体格式设定
311 public void GetWordFont(Microsoft.Office.Interop.Word.Font wordFont, System.Drawing.Font font)
312 {
313 wordFont.Name = font.Name;
314 wordFont.Size = font.Size;
315 if (font.Bold) { wordFont.Bold = 1; }
316 if (font.Italic) { wordFont.Italic = 1; }
317 if (font.Underline == true)
318 {
319 wordFont.Underline = WdUnderline.wdUnderlineNone;
320 }
321 wordFont.UnderlineColor = WdColor.wdColorAutomatic;
322
323 if (font.Strikeout)
324 {
325 wordFont.StrikeThrough = 1;//删除线
326 }
327 }
328
329 public void SetCenterAlignment()
330 {
331 app.Selection.Range.ParagraphFormat.Alignment = SetAlignment(Alignment.居中);
332 }
333
334 #endregion 格式操作
335
336 #region 表格操作
337
338 /// <summary>
339 /// 获取表格
340 /// </summary>
341 /// <param name="index">段落编号</param>
342 /// <returns></returns>
343 public Table Table(int index)
344 {
345 Table table = doc.Tables[index]; ///这是一个设定对应的某一段
346 return table;
347 }
348
349 public string ReadTableContent(int tableIdx, int rowIdx, int colIdx)
350 {
351 return doc.Tables[tableIdx].Cell(rowIdx, colIdx).Range.Text.Trim('\r', '\a', '\n').Trim();
352 }
353
354 public string ReadTableContent(Table table, int rowIdx, int colIdx)
355 {
356 try
357 {
358 return table.Cell(rowIdx, colIdx).Range.Text.Trim('\r', '\a', '\n').Trim();
359 }
360 catch (Exception)
361 {
362 return string.Empty;
363 }
364 }
365
366 public int GetTableRowCount(int tableIdx)
367 {
368 return doc.Tables[tableIdx].Rows.Count;
369 }
370
371 public Table GetTable(int tableIndex)
372 {
373 if (doc.Tables.Count >= tableIndex)
374 {
375 return doc.Tables[tableIndex];
376 }
377 return null;
378 }
379
380 public Table InsertTableRow(Table table)
381 {
382 if (table != null)
383 {
384 table.Rows.Add();
385 }
386
387 return table;
388 }
389
390 public Table InsertTableColumn(Table table)
391 {
392 if (table != null)
393 {
394 table.Columns.Add();
395 }
396 return table;
397 }
398
399 public Table InsertTableColumns(Table table, int columnCount)
400 {
401 for (int i = 0; i < columnCount; i++)
402 {
403 table = InsertTableColumn(table);
404 }
405 return table;
406 }
407
408 public Table DeleteTableRows(Table table, List<int> rowIndexs)
409 {
410 if (table != null)
411 {
412 foreach (var i in rowIndexs)
413 {
414 table = DeleteTableRow(table, i);
415 }
416 }
417 return table;
418 }
419
420 public Table DeleteTableRow(Table table, int rowIndex)
421 {
422 try
423 {
424 if (table != null)
425 {
426 table.Rows[rowIndex].Delete();
427 }
428 }
429 catch (Exception ex)
430 {
431 throw new Exception(ex.Message);
432 }
433
434 return table;
435 }
436
437 /// <summary>
438 /// 删除单元格
439 /// </summary>
440 /// <param name="table"></param>
441 /// <param name="rowIndex"></param>
442 /// <param name="columnIndex"></param>
443 /// <param name="shiftcells">删除类型</param>
444 /// wdDeleteCellsEntireColumn 3 Delete the entire column of cells from the table.
445 /// wdDeleteCellsEntireRow 2 Delete the entire row of cells from the table.
446 /// wdDeleteCellsShiftLeft 0 Shift remaining cells left in the row where the deletion occurred after a cell or range of cells has been deleted.
447 /// wdDeleteCellsShiftUp 1 Shift remaining cells up in the column where the deletion occurred after a cell or range of cells has been deleted.
448 /// <returns></returns>
449 public Table DeleteTableCell(Table table, int rowIndex, int columnIndex, int shiftcells)
450 {
451 try
452 {
453 if (table != null)
454 {
455 table.Cell(rowIndex, columnIndex).Delete(shiftcells);
456 }
457 }
458 catch (Exception ex)
459 {
460 throw new Exception(ex.Message);
461 }
462
463 return table;
464 }
465
466 public Table DeleteTableColumn(Table table, int columnIndex)
467 {
468 try
469 {
470 if (table != null)
471 {
472 table.Columns[columnIndex].Delete();
473 }
474 }
475 catch (Exception ex)
476 {
477 throw new Exception(ex.Message);
478 }
479
480 return table;
481 }
482
483 public bool WriteTableCellContent(Table table, int rowIndex, int colIndex, string content)
484 {
485 try
486 {
487 table.Cell(rowIndex, colIndex).Range.Delete();
488 table.Cell(rowIndex, colIndex).Range.Text = content;
489 }
490 catch (Exception exception)
491 {
492 return false;
493 }
494 return true;
495 }
496
497 public bool DeleteTableCellContent(Table table, int rowIndex, int colIndex)
498 {
499 try
500 {
501 table.Cell(rowIndex, colIndex).Range.Delete();
502 }
503 catch (Exception exception)
504 {
505 return false;
506 }
507 return true;
508 }
509
510 public int GetTableCount()
511 {
512 int tableCount = 0;
513 try
514 {
515 tableCount = doc.Tables.Count;
516 }
517 catch (Exception exception)
518 {
519 }
520 return tableCount;
521 }
522
523 public bool DeleteTable(int index)
524 {
525 try
526 {
527 doc.Tables[index].Delete();
528 }
529 catch (Exception exception)
530 {
531 return false;
532 }
533 return true;
534 }
535
536 public bool DeleteTable(Table table)
537 {
538 try
539 {
540 table.Delete();
541 }
542 catch (Exception exception)
543 {
544 return false;
545 }
546 return true;
547 }
548
549 public bool DeleteTables(List<int> tableIndexs)
550 {
551 try
552 {
553 if (tableIndexs.Count > 0)
554 {
555 foreach (var i in tableIndexs)
556 {
557 doc.Tables[i].Delete();
558 }
559 }
560 }
561 catch (Exception exception)
562 {
563 return false;
564 }
565 return true;
566 }
567
568 public void MergeRowCells(int tableIndexs, int rowIndex)
569 {
570 try
571 {
572 doc.Tables[tableIndexs].Rows[rowIndex].Cells.Merge();
573 }
574 catch (Exception exception)
575 {
576 }
577 }
578
579 public void MergeRowCells(Table table, int rowIndex)
580 {
581 try
582 {
583 table.Rows[rowIndex].Cells.Merge();
584 }
585 catch (Exception exception)
586 {
587 }
588 }
589
590 public void MergeColumnCells(Table table, int columnIndex)
591 {
592 try
593 {
594 table.Columns[columnIndex].Cells.Merge();
595 }
596 catch (Exception exception)
597 {
598 }
599 }
600
601 public void MergeCells(Table table, int rowIndex, int columnIndex, int rowIndex2, int columnIndex2)
602 {
603 try
604 {
605 table.Cell(rowIndex, columnIndex).Merge(table.Cell(rowIndex2, columnIndex2));
606 }
607 catch (Exception exception)
608 {
609 }
610 }
611
612 public void MergeCells2(Table table, int rowIndex, int columnIndex, int length)
613 {
614 try
615 {
616 table.Cell(rowIndex, columnIndex).Select(); //选中一行
617 object moveUnit1 = WdUnits.wdLine;
618 object moveCount1 = length;
619 object moveExtend1 = WdMovementType.wdExtend;
620 app.Selection.MoveDown(ref moveUnit1, ref moveCount1, ref moveExtend1);
621 app.Selection.Cells.Merge();
622 }
623 catch (Exception exception)
624 {
625 }
626 }
627
628 //插入表格 -
629 public bool InsertTable(System.Data.DataTable dt, bool haveBorder, float[] colWidths)
630 {
631 try
632 {
633 object missing = System.Reflection.Missing.Value;
634
635 int lenght = doc.Characters.Count - 1;
636 object start = lenght;
637 object end = lenght;
638
639 //表格起始坐标
640 Range tableLocation = doc.Range(ref start, ref end);
641
642 //添加Word表格
643 Table table = doc.Tables.Add(tableLocation, dt.Rows.Count + 1, dt.Columns.Count, ref missing, ref missing);//Word.WdAutoFitBehavior.wdAutoFitContent,Word.WdAutoFitBehavior.wdAutoFitWindow);
644
645 if (colWidths != null)
646 {
647 for (int i = 0; i < colWidths.Length; i++)
648 {
649 table.Columns[i + 1].Width = (float)(28.5F * colWidths[i]);
650 }
651 }
652
653 ///设置TABLE的样式
654 table.Rows.HeightRule = WdRowHeightRule.wdRowHeightAtLeast;
655 table.Rows.Height = app.CentimetersToPoints(float.Parse("0.8"));
656 table.Range.Font.Size = 10.5F;
657 table.Range.Font.Name = "宋体";
658 table.Range.Font.Bold = 0;
659 table.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
660 table.Range.Cells.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter;
661
662 if (haveBorder == true)
663 {
664 //设置外框样式
665 table.Borders.OutsideLineStyle = WdLineStyle.wdLineStyleSingle;
666 table.Borders.InsideLineStyle = WdLineStyle.wdLineStyleSingle;
667 //样式设置结束
668 }
669 for (int i = 1; i <= dt.Columns.Count; i++)
670 {
671 string colname = dt.Columns[i - 1].ColumnName;
672 table.Cell(1, i).Range.Text = colname;
673 }
674
675 for (int row = 0; row < dt.Rows.Count; row++)
676 {
677 for (int col = 0; col < dt.Columns.Count; col++)
678 {
679 table.Cell(row + 2, col + 1).Range.Text = dt.Rows[row][col].ToString();
680 }
681 }
682
683 return true;
684 }
685 catch (Exception e)
686 {
687 Console.WriteLine((e.ToString()));
688 return false;
689 }
690 finally
691 {
692 }
693 }
694
695 public bool InsertTable(System.Data.DataTable dt, bool haveBorder)
696 {
697 return InsertTable(dt, haveBorder, null);
698 }
699
700 public bool InsertTable(System.Data.DataTable dt)
701 {
702 return InsertTable(dt, false, null);
703 }
704
705 #endregion 表格操作
706
707 #region 查找替换
708
709 /// <summary>
710 /// 获得字符的所在Paragraph的index(耗时过长不建议使用)
711 /// </summary>
712 /// <param name="strKey"></param>
713 /// <returns></returns>
714 public int FindParagraph(string strKey)
715 {
716 int i = 0;
717 Find wfnd;
718 if (doc.Paragraphs != null && doc.Paragraphs.Count > 0)
719 {
720 for (i = 1; i <= doc.Paragraphs.Count; i++)
721 {
722 wfnd = doc.Paragraphs[i].Range.Find;
723 wfnd.ClearFormatting();
724 wfnd.Text = strKey;
725 if (wfnd.Execute(ref missing, ref missing,
726 ref missing, ref missing,
727 ref missing, ref missing,
728 ref missing, ref missing,
729 ref missing, ref missing,
730 ref missing, ref missing,
731 ref missing, ref missing,
732 ref missing))
733 {
734 return i;
735 }
736 }
737 }
738 return -1;
739 }
740
741 /// <summary>
742 /// 删除字符的所在段落(耗时过长不建议使用)
743 /// </summary>
744 /// <param name="strKeys"></param>
745 public void DeleteParagraphByKeywords(List<string> strKeys)
746 {
747 List<int> indexDeleted = new List<int>();
748
749 int i = 0;
750 Find wfnd;
751 if (doc.Paragraphs != null && doc.Paragraphs.Count > 0)
752 {
753 for (i = 1; i <= doc.Paragraphs.Count; i++)
754 {
755 wfnd = doc.Paragraphs[i].Range.Find;
756 wfnd.ClearFormatting();
757 foreach (string strKey in strKeys)
758 {
759 wfnd.Text = strKey;
760 if (wfnd.Execute(ref missing, ref missing,
761 ref missing, ref missing,
762 ref missing, ref missing,
763 ref missing, ref missing,
764 ref missing, ref missing,
765 ref missing, ref missing,
766 ref missing, ref missing,
767 ref missing))
768 {
769 indexDeleted.Add(i);
770 }
771 }
772 }
773 }
774 foreach (int index in indexDeleted.OrderByDescending(x => x).ToList())
775 {
776 DeleteParagraph(index);
777 }
778 }
779
780 /// <summary>
781 /// 删除字符的所在段落
782 /// </summary>
783 /// <param name="FindWord"></param>
784 /// <returns></returns>
785 public bool DeleteParagraphByKeywords(string FindWord)
786 {
787 bool findover = false;
788 Selection currentselect = app.Selection;//实例化一个selection接口
789 WdUnits storyUnit = WdUnits.wdStory;
790 currentselect.HomeKey(storyUnit);
791 currentselect.Find.ClearFormatting();
792 currentselect.Find.Text = FindWord;//查询的文字
793 currentselect.Find.Wrap = WdFindWrap.wdFindStop;//查询完成后停止
794 findover = currentselect.Find.Execute(ref missing, ref missing,
795 ref missing, ref missing,
796 ref missing, ref missing,
797 ref missing, ref missing,
798 ref missing, ref missing,
799 ref missing, ref missing,
800 ref missing, ref missing,
801 ref missing);
802 WdUnits paraUnit = WdUnits.wdParagraph;
803 currentselect.Expand(paraUnit);
804 currentselect.Range.Delete();
805 return findover;
806 }
807
808 /// <summary>
809 /// 判断文档中是否含有特定字符
810 /// </summary>
811 /// <param name="strKey"></param>
812 /// <returns></returns>
813 public bool HasWord(string strKey)
814 {
815 doc.Content.Find.Text = strKey;
816 if (doc.Content.Find.Execute(ref missing, ref missing,
817 ref missing, ref missing,
818 ref missing, ref missing,
819 ref missing, ref missing,
820 ref missing, ref missing,
821 ref missing, ref missing,
822 ref missing, ref missing,
823 ref missing))
824 {
825 return true;
826 }
827 else
828 {
829 return false;
830 }
831 }
832
833 /// <summary>
834 /// 将特定字符改为黄色
835 /// </summary>
836 /// <param name="FindWord"></param>
837 /// <returns></returns>
838 public bool MarkWord(string FindWord)
839 {
840 bool findover = false;
841 Selection currentselect = app.Selection;//实例化一个selection接口
842 currentselect.Find.ClearFormatting();
843 currentselect.Find.Text = FindWord;//查询的文字
844 currentselect.Find.Wrap = WdFindWrap.wdFindStop;//查询完成后停止
845 findover = currentselect.Find.Execute(ref missing, ref missing,
846 ref missing, ref missing,
847 ref missing, ref missing,
848 ref missing, ref missing,
849 ref missing, ref missing,
850 ref missing, ref missing,
851 ref missing, ref missing,
852 ref missing);
853 currentselect.Font.Color = WdColor.wdColorYellow;//设置颜色为黄
854 return findover;
855 }
856
857 /// <summary>
858 /// 替换文字
859 /// </summary>
860 /// <param name="oldText">待替换的文本</param>
861 /// <param name="newText">替换后的文本</param>
862 /// <param name="range">范围</param>
863 /// <returns></returns>
864 public bool Replace(string oldText, string newText, Range range)
865 {
866 object matchCase = false;
867 object findText = oldText;
868 object replaceWith = newText;
869 object wdReplace = WdReplace.wdReplaceOne;
870 return range.Find.Execute(ref findText, ref matchCase, ref missing, ref missing,
871 ref missing, ref missing, ref missing, ref missing, ref missing, ref replaceWith,
872 ref wdReplace, ref missing, ref missing, ref missing, ref missing);
873 }
874
875 /// <summary>
876 /// 替换
877 /// </summary>
878 /// <param name="oldText">待替换的文本</param>
879 /// <param name="newText">替换后的文本</param>
880 /// <param name="replaceType">All:替换所有、None:不替换、FirstOne:替换第一个</param>
881 /// <param name="isCaseSensitive">大小写是否敏感</param>
882 /// <returns></returns>
883 public bool Replace(string oldText, string newText, string replaceType, bool isCaseSensitive)
884 {
885 if (doc == null)
886 {
887 doc = app.ActiveDocument;
888 }
889 object findText = oldText;
890 object replaceWith = newText;
891 object wdReplace;
892 object matchCase = isCaseSensitive;
893 switch (replaceType)
894 {
895 case "All":
896 wdReplace = WdReplace.wdReplaceAll;
897 break;
898
899 case "None":
900 wdReplace = WdReplace.wdReplaceNone;
901 break;
902
903 case "FirstOne":
904 wdReplace = WdReplace.wdReplaceOne;
905 break;
906
907 default:
908 wdReplace = WdReplace.wdReplaceOne;
909 break;
910 }
911 doc.Content.Find.ClearFormatting();//移除Find的搜索文本和段落格式设置
912
913 return doc.Content.Find.Execute(ref findText, ref matchCase, ref missing, ref missing,
914 ref missing, ref missing, ref missing, ref missing, ref missing, ref replaceWith,
915 ref wdReplace, ref missing, ref missing, ref missing, ref missing);
916 }
917
918 /// <summary>
919 /// 替换指定Paragraph中的文本
920 /// </summary>
921 /// <param name="oldText"></param>
922 /// <param name="newText"></param>
923 /// <param name="replaceType"></param>
924 /// <param name="isCaseSensitive"></param>
925 /// <param name="index"></param>
926 /// <returns></returns>
927 public bool Replace(string oldText, string newText, string replaceType, bool isCaseSensitive, int index)
928 {
929 if (doc == null)
930 {
931 doc = app.ActiveDocument;
932 }
933 object findText = oldText;
934 object replaceWith = newText;
935 object wdReplace;
936 object matchCase = isCaseSensitive;
937 switch (replaceType)
938 {
939 case "All":
940 wdReplace = WdReplace.wdReplaceAll;
941 break;
942
943 case "None":
944 wdReplace = WdReplace.wdReplaceNone;
945 break;
946
947 case "FirstOne":
948 wdReplace = WdReplace.wdReplaceOne;
949 break;
950
951 default:
952 wdReplace = WdReplace.wdReplaceOne;
953 break;
954 }
955 doc.Content.Find.ClearFormatting();//移除Find的搜索文本和段落格式设置
956 return doc.Paragraphs[index].Range.Find.Execute(ref findText, ref matchCase, ref missing, ref missing,
957 ref missing, ref missing, ref missing, ref missing, ref missing, ref replaceWith,
958 ref wdReplace, ref missing, ref missing, ref missing, ref missing);
959 }
960
961 #endregion 查找替换
962
963 #region 复制粘贴
964
965 /// <summary>
966 /// 复制
967 /// </summary>
968 public void Copy()
969 {
970 app.Selection.Copy();
971 }
972
973 /// <summary>
974 /// 全选文档
975 /// </summary>
976 public void Paste()
977 {
978 app.Selection.Paste();
979 }
980
981 #endregion 复制粘贴
982
983 #region 光标位置
984
985 /// <summary>
986 /// 全选文档
987 /// </summary>
988 public void SelectWholeDocument()
989 {
990 app.Selection.WholeStory();
991 }
992
993 /// <summary>
994 /// 移动到文档起始位置
995 /// </summary>
996 public void MoveToTop()
997 {
998 app.Selection.HomeKey(WdUnits.wdStory);
999 }
1000
1001 /// <summary>
1002 /// 移动到文档结束位置
1003 /// </summary>
1004 public void MoveToBottom()
1005 {
1006 app.Selection.EndKey(WdUnits.wdStory);
1007 }
1008
1009 /// <summary>
1010 /// 光标移动到指定书签位置,书签不存在时不移动
1011 /// </summary>
1012 /// <param name="bookMarkName"></param>
1013 /// <returns></returns>
1014 public bool GoToBookMark(string bookMarkName)
1015 {
1016 //是否存在书签
1017 if (doc.Bookmarks.Exists(bookMarkName))
1018 {
1019 object what = WdGoToItem.wdGoToBookmark;
1020 object name = bookMarkName;
1021 GoTo(what, missing, missing, name);
1022 return true;
1023 }
1024 return false;
1025 }
1026
1027 /// <summary>
1028 /// 移动光标
1029 /// Moves the insertion point to the character position immediately preceding the specified item.
1030 /// </summary>
1031 /// <param name="what">Optional Object. The kind of item to which the selection is moved. Can be one of the WdGoToItem constants.</param>
1032 /// <param name="which">Optional Object. The item to which the selection is moved. Can be one of the WdGoToDirection constants. </param>
1033 /// <param name="count">Optional Object. The number of the item in the document. The default value is 1.</param>
1034 /// <param name="name">Optional Object. If the What argument is wdGoToBookmark, wdGoToComment, wdGoToField, or wdGoToObject, this argument specifies a name.</param>
1035 public void GoTo(object what, object which, object count, object name)
1036 {
1037 app.Selection.GoTo(ref what, ref which, ref count, ref name);
1038 }
1039
1040 /// <summary>
1041 /// 光标上移
1042 /// Moves the selection up and returns the number of units it's been moved.
1043 /// </summary>
1044 /// <param name="unit">Optional Object. The unit by which to move the selection. Can be one of the following WdUnits constants: wdLine, wdParagraph, wdWindow or wdScreen etc. The default value is wdLine.</param>
1045 /// <param name="count">Optional Object. The number of units the selection is to be moved. The default value is 1.</param>
1046 /// <param name="extend">Optional Object. Can be either wdMove or wdExtend. If wdMove is used, the selection is collapsed to the end point and moved up. If wdExtend is used, the selection is extended up. The default value is wdMove.</param>
1047 /// <returns></returns>
1048 public void MoveUp(int num = 1)
1049 {
1050 object unit = WdUnits.wdCharacter;
1051 object count = num;
1052 MoveUp(unit, count, missing);
1053 }
1054
1055 /// <summary>
1056 /// 光标上移
1057 /// Moves the selection up and returns the number of units it's been moved.
1058 /// </summary>
1059 /// <param name="unit">Optional Object. The unit by which to move the selection. Can be one of the following WdUnits constants: wdLine, wdParagraph, wdWindow or wdScreen etc. The default value is wdLine.</param>
1060 /// <param name="count">Optional Object. The number of units the selection is to be moved. The default value is 1.</param>
1061 /// <param name="extend">Optional Object. Can be either wdMove or wdExtend. If wdMove is used, the selection is collapsed to the end point and moved up. If wdExtend is used, the selection is extended up. The default value is wdMove.</param>
1062 /// <returns></returns>
1063 public int MoveUp(object unit, object count, object extend)
1064 {
1065 return app.Selection.MoveUp(ref unit, ref count, ref extend);
1066 }
1067
1068 /// <summary>
1069 /// 向下移动一个字符
1070 /// </summary>
1071 public void MoveDown()
1072 {
1073 MoveDown(1);
1074 }
1075
1076 /// <summary>
1077 /// 光标下移
1078 /// Moves the selection down and returns the number of units it's been moved.
1079 /// 参数说明详见MoveUp
1080 /// </summary>
1081 public void MoveDown(int num = 1)
1082 {
1083 object unit = WdUnits.wdCharacter;
1084 object count = num;
1085 object extend = WdMovementType.wdMove;
1086 MoveDown(unit, count, extend);
1087 }
1088
1089 /// <summary>
1090 /// 光标下移
1091 /// Moves the selection down and returns the number of units it's been moved.
1092 /// 参数说明详见MoveUp
1093 /// </summary>
1094 public int MoveDown(object unit, object count, object extend)
1095 {
1096 return app.Selection.MoveDown(ref unit, ref count, ref extend);
1097 }
1098
1099 /// <summary>
1100 /// 光标左移
1101 /// Moves the selection to the left and returns the number of units it's been moved.
1102 /// 参数说明详见MoveUp
1103 /// </summary>
1104 public void MoveLeft(int num = 1)
1105 {
1106 object unit = WdUnits.wdCharacter;
1107 object count = num;
1108 MoveLeft(unit, count, missing);
1109 }
1110
1111 /// <summary>
1112 /// 光标左移
1113 /// Moves the selection to the left and returns the number of units it's been moved.
1114 /// 参数说明详见MoveUp
1115 /// </summary>
1116 public int MoveLeft(object unit, object count, object extend)
1117 {
1118 return app.Selection.MoveLeft(ref unit, ref count, ref extend);
1119 }
1120
1121 /// <summary>
1122 /// 向右移动N个字符
1123 /// </summary>
1124 /// <param name="num"></param>
1125 public void MoveRight(int num = 1)
1126 {
1127 object unit = WdUnits.wdCharacter;
1128 object count = num;
1129 MoveRight(unit, count, missing);
1130 }
1131
1132 /// <summary>
1133 /// 光标右移
1134 /// Moves the selection to the left and returns the number of units it's been moved.
1135 /// 参数说明详见MoveUp
1136 /// </summary>
1137 public int MoveRight(object unit, object count, object extend)
1138 {
1139 return app.Selection.MoveRight(ref unit, ref count, ref extend);
1140 }
1141
1142 #endregion 光标位置
1143
1144 #region 书签操作
1145
1146 public void WriteIntoDocument(string bookmarkName, string context)
1147 {
1148 try
1149 {
1150 object _bookmarkName = bookmarkName;
1151 Bookmark bm = doc.Bookmarks.get_Item(ref _bookmarkName); //返回书签
1152 if (bm != null)
1153 {
1154 bm.Range.Text = context; //设置书签域的内容
1155 }
1156 }
1157 catch (Exception exception)
1158 {
1159 return;
1160 }
1161 }
1162
1163 /// <summary>
1164 /// 插入书签
1165 /// 如过存在同名书签,则先删除再插入
1166 /// </summary>
1167 /// <param name="bookMarkName">书签名</param>
1168 public void InsertBookMark(string bookMarkName)
1169 {
1170 //存在则先删除
1171 if (doc.Bookmarks.Exists(bookMarkName))
1172 {
1173 DeleteBookMark(bookMarkName);
1174 }
1175 object range = app.Selection.Range;
1176 doc.Bookmarks.Add(bookMarkName, ref range);
1177 }
1178
1179 /// <summary>
1180 /// 删除书签
1181 /// </summary>
1182 /// <param name="bookMarkName">书签名</param>
1183 public void DeleteBookMark(string bookMarkName)
1184 {
1185 if (doc.Bookmarks.Exists(bookMarkName))
1186 {
1187 var bookMarks = doc.Bookmarks;
1188 for (int i = 1; i <= bookMarks.Count; i++)
1189 {
1190 object index = i;
1191 var bookMark = bookMarks.get_Item(ref index);
1192 if (bookMark.Name == bookMarkName)
1193 {
1194 bookMark.Delete();
1195 break;
1196 }
1197 }
1198 }
1199 }
1200
1201 /// <summary>
1202 /// 删除所有书签
1203 /// </summary>
1204 public void DeleteAllBookMark()
1205 {
1206 for (; doc.Bookmarks.Count > 0;)
1207 {
1208 object index = doc.Bookmarks.Count;
1209 var bookmark = doc.Bookmarks.get_Item(ref index);
1210 bookmark.Delete();
1211 }
1212 }
1213
1214 /// <summary>
1215 /// 替换书签内容
1216 /// </summary>
1217 /// <param name="bookMarkName">书签名</param>
1218 /// <param name="text">替换后的内容</param>
1219 public void ReplaceBookMark(string bookMarkName, string text)
1220 {
1221 bool isExist = GoToBookMark(bookMarkName);
1222 if (isExist)
1223 {
1224 InsertText(text);
1225 }
1226 }
1227
1228 /// <summary>
1229 /// 在书签中插入文本
1230 /// </summary>
1231 /// <param name="sBMName">书签名</param>
1232 /// <param name="sBMValue">文本内容</param>
1233 public void ReplaceBookMarkWithString(string sBMName, string sBMValue)
1234 {
1235 object oBmkName = sBMName;
1236 if (doc.Bookmarks.Exists(sBMName))
1237 {
1238 doc.Bookmarks.get_Item(ref oBmkName).Select();
1239 doc.Bookmarks.get_Item(ref oBmkName).Range.Text = sBMValue;
1240 }
1241 }
1242
1243 /// <summary>
1244 /// 在书签中插入图片
1245 /// </summary>
1246 /// <param name="bookmarkName">书签名</param>
1247 /// <param name="imagePath">图片路径</param>
1248 public void ReplaceBookMarkWithImage(string bookmarkName, string imagePath)
1249 {
1250 object oBmkName = bookmarkName;
1251
1252 if (doc.Bookmarks.Exists(bookmarkName) && File.Exists(imagePath))
1253 {
1254 object LinkToFile = false;
1255 object SaveWithDocument = true;
1256 doc.Bookmarks.get_Item(ref oBmkName).Select();
1257 app.Selection.InlineShapes.AddPicture(imagePath, ref LinkToFile, ref SaveWithDocument, ref missing);
1258 }
1259 }
1260
1261 /// <summary>
1262 /// 在书签中插入指定宽高的图片
1263 /// </summary>
1264 /// <param name="bookmarkName">书签名</param>
1265 /// <param name="imagePath">图片路径</param>
1266 /// <param name="Width">图片宽度</param>
1267 /// <param name="Height">图片高度</param>
1268 public void ReplaceBookMarkWithImage(string bookmarkName, string imagePath, int Width, int Height)
1269 {
1270 object oBmkName = bookmarkName;
1271
1272 //读取源图片尺寸
1273 Image picImage = Image.FromFile(imagePath);
1274 int sourcePicWidth = picImage.Width;
1275 int sourcePicHeight = picImage.Height;
1276 double widthHeightRatio = (double)sourcePicWidth / (double)sourcePicHeight;
1277 double heightWidthRatio = (double)sourcePicHeight / (double)sourcePicWidth;
1278
1279 //计算插入文档后图片尺寸
1280 int picWidth = Width;
1281 int picHeight = Height;
1282
1283 //根据图片原始宽高比得出缩放后的尺寸
1284 if (picWidth > (int)picHeight * widthHeightRatio)
1285 {
1286 picWidth = (int)(picHeight * widthHeightRatio);
1287 }
1288 else
1289 {
1290 picHeight = (int)(picWidth * heightWidthRatio);
1291 }
1292
1293 if (doc.Bookmarks.Exists(bookmarkName) && File.Exists(imagePath))
1294 {
1295 object LinkToFile = false;
1296 object SaveWithDocument = true;
1297 doc.Bookmarks.get_Item(ref oBmkName).Select();
1298 InlineShape inlineShape = app.Selection.InlineShapes.AddPicture(imagePath, ref LinkToFile, ref SaveWithDocument, ref missing);
1299 inlineShape.Width = picWidth;
1300 inlineShape.Height = picHeight;
1301 }
1302 }
1303
1304 #endregion 书签操作
1305
1306 #region 文件操作
1307
1308 /// <summary>
1309 /// 把Word文档装化为Html文件
1310 /// </summary>
1311 /// <param name="strFileName">要转换的Word文档</param>
1312 /// <param name="strSaveFileName">要生成的具体的Html页面</param>
1313 public bool WordToHtml(string strFileNameForWord, string strSaveFileName)
1314 {
1315 bool result = false;
1316 try
1317 {
1318 Type wordType = app.GetType();
1319 // 打开文件
1320 Type docsType = app.Documents.GetType();
1321 // 转换格式,另存为
1322 Type docType = doc.GetType();
1323 object saveFileName = strSaveFileName;
1324 docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { saveFileName, WdSaveFormat.wdFormatHTML });
1325
1326 #region 其它格式:
1327
1328 ///wdFormatHTML
1329 ///wdFormatDocument
1330 ///wdFormatDOSText
1331 ///wdFormatDOSTextLineBreaks
1332 ///wdFormatEncodedText
1333 ///wdFormatRTF
1334 ///wdFormatTemplate
1335 ///wdFormatText
1336 ///wdFormatTextLineBreaks
1337 ///wdFormatUnicodeText
1338 //-----------------------------------------------------------------------------------
1339 // docType.InvokeMember( "SaveAs", System.Reflection.BindingFlags.InvokeMethod,
1340 // null, oDoc, new object[]{saveFileName, Word.WdSaveFormat.wdFormatHTML} );
1341 // 退出 Word
1342 //wordType.InvokeMember( "Quit", System.Reflection.BindingFlags.InvokeMethod,
1343 // null, oWordApplic, null );
1344
1345 #endregion 其它格式:
1346
1347 result = true;
1348 }
1349 catch
1350 {
1351 //throw ( new Exception() );
1352 }
1353 return result;
1354 }
1355
1356 /// <summary>
1357 /// 保存当前项目
1358 /// </summary>
1359 public void SaveDocument()
1360 {
1361 if (app == null)
1362 throw new Exception("Create / Open Document first!");
1363 if (doc == null)
1364 throw new Exception("Create / Open Document first!");
1365 if (!doc.Saved)
1366 doc.Save();
1367 }
1368
1369 /// <summary>
1370 /// 项目另存为
1371 /// </summary>
1372 public void SaveAsDocument(object path)
1373 {
1374 if (app == null)
1375 throw new Exception("Create / Open Document first!");
1376 if (doc == null)
1377 throw new Exception("Create / Open Document first!");
1378 doc.SaveAs(ref path, ref missing, ref missing, ref missing, ref missing, ref missing,
1379 ref missing, ref missing, ref missing, ref missing, ref missing,
1380 ref missing, ref missing, ref missing, ref missing, ref missing);
1381 }
1382
1383 /// <summary>
1384 /// 关闭项目
1385 /// </summary>
1386 public void CloseDocument()
1387 {
1388 if (doc != null)
1389 {
1390 try
1391 {
1392 object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
1393 doc.Close(ref doNotSaveChanges, ref missing, ref missing);
1394 }
1395 catch
1396 {
1397 //Already Close
1398 }
1399 }
1400 if (app != null)
1401 {
1402 try
1403 {
1404 object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
1405 app.Documents.Close(ref doNotSaveChanges, ref missing, ref missing);
1406 }
1407 catch
1408 {
1409 //Already Close
1410 }
1411 }
1412 GC.Collect();
1413 GC.WaitForPendingFinalizers();
1414 }
1415
1416 /// <summary>
1417 /// 退出文档
1418 /// </summary>
1419 public void ExitDocument()
1420 {
1421 if (doc != null)
1422 {
1423 try
1424 {
1425 doc.Close(ref missing, ref missing, ref missing);
1426 }
1427 catch (Exception)
1428 {
1429 throw;
1430 }
1431 }
1432
1433 app.Quit();
1434 if (app != null)
1435 {
1436 app = null;
1437 }
1438 GC.Collect();
1439 GC.WaitForPendingFinalizers();
1440 }
1441
1442 #endregion 文件操作
1443
1444 #region 资源回收
1445
1446 private bool disposed = false;
1447
1448 ~WordHelper()
1449 {
1450 //必须为false
1451 Dispose(false);
1452 }
1453
1454 public void Dispose()
1455 {
1456 //必须为true
1457 Dispose(true);
1458 //通知垃圾回收机制不再调用终结器(析构器)
1459 GC.SuppressFinalize(this);
1460 }
1461
1462 private void Dispose(bool disposing)
1463 {
1464 if (disposed)
1465 {
1466 return;
1467 }
1468 if (disposing)
1469 {
1470 // 清理托管资源
1471 }
1472
1473 if (doc != null)
1474 {
1475 try
1476 {
1477 object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
1478 doc.Close(ref doNotSaveChanges, ref missing, ref missing);
1479 }
1480 catch
1481 {
1482 //Already Close
1483 }
1484 }
1485 if (app != null)
1486 {
1487 try
1488 {
1489 object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
1490 app.Documents.Close(ref doNotSaveChanges, ref missing, ref missing);
1491 }
1492 catch
1493 {
1494 //Already Close
1495 }
1496 }
1497
1498 //System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
1499 GC.Collect();
1500 GC.WaitForPendingFinalizers();
1501
1502 //让类型知道自己已经被释放
1503 disposed = true;
1504 }
1505
1506 #endregion 资源回收
1507
1508 #region 文档合并
1509
1510 /// <summary>
1511 /// 合并多个Word文档
1512 /// </summary>
1513 /// <param name="docPaths"></param>
1514 /// <param name="output"></param>
1515 public void InsertDocuments(List<string> docPaths, string bookmark)
1516 {
1517 object objIsWordVisible = false;
1518 object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
1519 Document outDoc = doc; // 插入到已经打开的文档
1520 foreach (string item in docPaths)
1521 {
1522 object fileName = item;
1523 Document partDoc = app.Documents.Open(
1524 ref fileName, //FileName
1525 ref missing, //ConfirmVersions
1526 ref missing, //ReadOnly
1527 ref missing, //AddToRecentFiles
1528 ref missing, //PasswordDocument
1529 ref missing, //PasswordTemplate
1530 ref missing, //Revert
1531 ref missing, //WritePasswordDocument
1532 ref missing, //WritePasswordTemplate
1533 ref missing, //Format
1534 ref missing, //Enconding
1535 ref objIsWordVisible, //Visible
1536 ref missing, //OpenAndRepair
1537 ref missing, //DocumentDirection
1538 ref missing, //NoEncodingDialog
1539 ref missing //XMLTransform
1540 );
1541 partDoc.Activate();
1542 app.Selection.WholeStory();
1543 app.Selection.Copy();
1544
1545 outDoc.Activate();
1546 GoToBookMark(bookmark);
1547 app.Selection.Paste();
1548
1549 partDoc.Close(ref doNotSaveChanges, ref missing, ref missing);
1550 }
1551 }
1552
1553 /// <summary>
1554 /// 合并多个Word文档
1555 /// </summary>
1556 /// <param name="docPaths"></param>
1557 /// <param name="output"></param>
1558 public void MergeDocuments(List<string> docPaths, string output)
1559 {
1560 object objIsWordVisible = false;
1561 object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges;
1562
1563 object outPath = output;
1564 Document outDoc = app.Documents.Open(
1565 ref outPath, //FileName
1566 ref missing, //ConfirmVersions
1567 ref missing, //ReadOnly
1568 ref missing, //AddToRecentFiles
1569 ref missing, //PasswordDocument
1570 ref missing, //PasswordTemplate
1571 ref missing, //Revert
1572 ref missing, //WritePasswordDocument
1573 ref missing, //WritePasswordTemplate
1574 ref missing, //Format
1575 ref missing, //Enconding
1576 ref objIsWordVisible, //Visible
1577 ref missing, //OpenAndRepair
1578 ref missing, //DocumentDirection
1579 ref missing, //NoEncodingDialog
1580 ref missing //XMLTransform
1581 );
1582
1583 foreach (string item in docPaths)
1584 {
1585 object fileName = item;
1586 Document partDoc = app.Documents.Open(
1587 ref fileName, //FileName
1588 ref missing, //ConfirmVersions
1589 ref missing, //ReadOnly
1590 ref missing, //AddToRecentFiles
1591 ref missing, //PasswordDocument
1592 ref missing, //PasswordTemplate
1593 ref missing, //Revert
1594 ref missing, //WritePasswordDocument
1595 ref missing, //WritePasswordTemplate
1596 ref missing, //Format
1597 ref missing, //Enconding
1598 ref objIsWordVisible, //Visible
1599 ref missing, //OpenAndRepair
1600 ref missing, //DocumentDirection
1601 ref missing, //NoEncodingDialog
1602 ref missing //XMLTransform
1603 );
1604 partDoc.Activate();
1605 app.Selection.WholeStory();
1606 app.Selection.Copy();
1607
1608 outDoc.Activate();
1609 MoveToBottom();
1610 app.Selection.Paste();
1611
1612 partDoc.Close(ref doNotSaveChanges, ref missing, ref missing);
1613 }
1614
1615 object path = output;
1616 outDoc.SaveAs(ref path, ref missing, ref missing, ref missing, ref missing, ref missing,
1617 ref missing, ref missing, ref missing, ref missing, ref missing,
1618 ref missing, ref missing, ref missing, ref missing, ref missing);
1619
1620 outDoc.Close(ref doNotSaveChanges, ref missing, ref missing);
1621 }
1622
1623 #endregion 文档合并
1624
1625 #region 页面设置
1626
1627 //设置页眉
1628 public void SetHeader(string titleText)
1629 {
1630 app.ActiveWindow.ActivePane.View.SeekView = WdSeekView.wdSeekCurrentPageHeader;
1631 app.Selection.WholeStory();
1632 app.Selection.TypeText(titleText);
1633 app.ActiveWindow.ActivePane.View.SeekView = WdSeekView.wdSeekMainDocument;
1634 }
1635
1636 //修改页眉 -
1637 public bool ReplacePageHeader(string oldtext, string newtext, int tbcount)
1638 {
1639 try
1640 {
1641 Range range;
1642 for (int i = 1; i <= tbcount; i++)
1643 {
1644 range = doc.Sections[i].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
1645 bool sig = range.Find.Execute(oldtext,
1646 ref missing,
1647 ref missing,
1648 ref missing,
1649 ref missing,
1650 ref missing,
1651 ref missing,
1652 ref missing,
1653 ref missing,
1654 newtext,
1655 WdReplace.wdReplaceAll,
1656 ref missing,
1657 ref missing,
1658 ref missing,
1659 ref missing);
1660 }
1661 return true;
1662 }
1663 catch (Exception ex)
1664 {
1665 Console.WriteLine(ex.Message);
1666 return false;
1667 }
1668 }
1669
1670 //页面设置
1671 public void SetPage(Orientation orientation, double width, double height, double topMargin, double leftMargin, double rightMargin, double bottomMargin)
1672 {
1673 doc.PageSetup.PageWidth = app.CentimetersToPoints((float)width);
1674 doc.PageSetup.PageHeight = app.CentimetersToPoints((float)height);
1675
1676 if (orientation == Orientation.横板)
1677 {
1678 doc.PageSetup.Orientation = WdOrientation.wdOrientLandscape;
1679 }
1680
1681 doc.PageSetup.TopMargin = (float)(topMargin * 25);//上边距
1682 doc.PageSetup.LeftMargin = (float)(leftMargin * 25);//左边距
1683 doc.PageSetup.RightMargin = (float)(rightMargin * 25);//右边距
1684 doc.PageSetup.BottomMargin = (float)(bottomMargin * 25);//下边距
1685 }
1686
1687 public void SetPage(Orientation orientation, double topMargin, double leftMargin, double rightMargin, double bottomMargin)
1688 {
1689 SetPage(orientation, 21, 29.7, topMargin, leftMargin, rightMargin, bottomMargin);
1690 }
1691
1692 public void SetPage(double topMargin, double leftMargin, double rightMargin, double bottomMargin)
1693 {
1694 SetPage(Orientation.竖板, 21, 29.7, topMargin, leftMargin, rightMargin, bottomMargin);
1695 }
1696
1697 //插入页脚 -
1698 public bool InsertPageFooter(string text, System.Drawing.Font font, Alignment alignment)
1699 {
1700 try
1701 {
1702 app.ActiveWindow.View.SeekView = WdSeekView.wdSeekCurrentPageFooter;//页脚
1703 app.Selection.InsertAfter(text);
1704 GetWordFont(app.Selection.Font, font);
1705
1706 SetAlignment(app.Selection.Range, alignment);
1707
1708 return true;
1709 }
1710 catch (Exception)
1711 {
1712 return false;
1713 }
1714 }
1715
1716 public bool InsertPageFooterNumber(System.Drawing.Font font, Alignment alignment)
1717 {
1718 try
1719 {
1720 app.ActiveWindow.View.SeekView = WdSeekView.wdSeekCurrentPageHeader;
1721 app.Selection.WholeStory();
1722 app.Selection.ParagraphFormat.Borders[WdBorderType.wdBorderBottom].LineStyle = WdLineStyle.wdLineStyleNone;
1723 app.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;
1724
1725 app.ActiveWindow.View.SeekView = WdSeekView.wdSeekCurrentPageFooter;//页脚
1726 app.Selection.TypeText("第");
1727
1728 object page = WdFieldType.wdFieldPage;
1729 app.Selection.Fields.Add(app.Selection.Range, ref page, ref missing, ref missing);
1730
1731 app.Selection.TypeText("页/共");
1732 object pages = WdFieldType.wdFieldNumPages;
1733
1734 app.Selection.Fields.Add(app.Selection.Range, ref pages, ref missing, ref missing);
1735 app.Selection.TypeText("页");
1736
1737 GetWordFont(app.Selection.Font, font);
1738 SetAlignment(app.Selection.Range, alignment);
1739 app.ActiveWindow.View.SeekView = WdSeekView.wdSeekMainDocument;
1740 return true;
1741 }
1742 catch (Exception)
1743 {
1744 return false;
1745 }
1746 }
1747
1748 //修改页脚
1749 public bool ReplacePageFooter(string oldtext, string newtext, int tbcount)
1750 {
1751 try
1752 {
1753 Range range;
1754 for (int i = 1; i <= tbcount; i++)
1755 {
1756 range = doc.Sections[i].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
1757 bool sig = range.Find.Execute(oldtext,
1758 ref missing,
1759 ref missing,
1760 ref missing,
1761 ref missing,
1762 ref missing,
1763 ref missing,
1764 ref missing,
1765 ref missing,
1766 newtext,
1767 WdReplace.wdReplaceAll,
1768 ref missing,
1769 ref missing,
1770 ref missing,
1771 ref missing);
1772 }
1773 return true;
1774 }
1775 catch (Exception ex)
1776 {
1777 Console.WriteLine(ex.Message);
1778 return false;
1779 }
1780 }
1781
1782 #endregion 页面设置
1783
1784 #region 常用方法
1785
1786 /// <summary>
1787 /// 给表头排序
1788 /// </summary>
1789 /// <param name="tableNo"></param>
1790 /// <param name="no"></param>
1791 /// <returns></returns>
1792 public bool TableTitleNumberOrder(string tableNo, int no)
1793 {
1794 bool findover = false;
1795 Selection currentselect = app.Selection;//实例化一个selection接口
1796 currentselect.Find.ClearFormatting();
1797 currentselect.Find.Text = tableNo;//查询的文字
1798 currentselect.Find.Wrap = WdFindWrap.wdFindStop;//查询完成后停止
1799 findover = currentselect.Find.Execute(ref missing, ref missing,
1800 ref missing, ref missing,
1801 ref missing, ref missing,
1802 ref missing, ref missing,
1803 ref missing, ref missing,
1804 ref missing, ref missing,
1805 ref missing, ref missing,
1806 ref missing);
1807
1808 currentselect.Expand(WdUnits.wdParagraph); //扩展选区到整行
1809 string oldWord = Regex.Match(currentselect.Range.Text, tableNo + @"\.\d+", RegexOptions.IgnoreCase).Value;
1810 string newWord = tableNo + "." + no.ToString();
1811 Replace(oldWord, newWord, currentselect.Range);
1812 currentselect.MoveDown(WdUnits.wdParagraph, 1);
1813 return findover;
1814 }
1815
1816 //获取Word中的颜色 -
1817 public WdColor GetWordColor(Color c)
1818 {
1819 UInt32 R = 0x1, G = 0x100, B = 0x10000;
1820 return (WdColor)(R * c.R + G * c.G + B * c.B);
1821 }
1822
1823 #endregion 常用方法
1824
1825 public enum Orientation
1826 {
1827 横板,
1828 竖板
1829 }
1830
1831 public enum Alignment
1832 {
1833 左对齐,
1834 居中,
1835 右对齐
1836 }
1837 }
1838 }