【小丸类库系列】Word操作类
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 }