使用 VSTO 读取和修改 Word 文档的文本

Abd*_*bar 3 .net c# vsto ms-word

我正在编写一个 MS Word 插件。仍处于学习 VSTO 的早期阶段。所以基本上到目前为止,我在 Word 文档中所拥有的是一些用户编写的文本(一个完整的 Word 文档),形式如下:

Hello, my name is <%NAME%>. I am <%AGE%> years old and i live in <%COUNTRY%>.
Run Code Online (Sandbox Code Playgroud)

那些 <%%> 是用户从自定义任务窗格中拖放的变量。

我要做的是用从某个数据文件中读取的一些实际数据值替换这些变量。但是现在我正在寻找一种方法来读取字符串中当前活动文档的内容,然后暂时用虚拟数据值替换这些变量,然后用这个新的替换实际值的变量值替换旧文档代替 NAME、AGE 等。最好在 onSaveAs 事件中,但由于它不可用,所以我必须在BeforeSave事件中进行。

简而言之,我正在寻找一种方法:

  • 阅读当前文档的内容。
  • 修改那些内容。
  • 把它们写回去。

我已经在网络和 MSDN 上搜索了几个小时,但真的找不到任何有用的东西,或者可能无法实现它,因为我是这方面的新手。

我阅读的一些文章是:

VSTO 中的插件 - 如何使用带按钮的功能区从 Word 文档中获取文本

如何在 C# 中使用 VSTO 从 Word 文档中读取和写入文本

Globals.ThisAddIn.Application.Selection.Text;
Run Code Online (Sandbox Code Playgroud)

这仅提供选定的文本,但我需要选定和未选定文档的所有文本。

我 ThisAddin.cs 中的当前代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Word = Microsoft.Office.Interop.Word;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Word;


namespace dragdrop
{
    public partial class ThisAddIn
    {

        private void ThisAddIn_Startup(object sender, System.EventArgs e){Globals.ThisAddIn.CustomTaskPanes.Add(new OrdersListUserControl(), "Drag and Drop List Items on Word Doc").Visible = true;}       
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e){}
        public void OnDropOccurred(object data) //adding dropped text on current cursor position.
        {
            Word.Selection currentSelection = Application.Selection;
            currentSelection.TypeText(data.ToString());
        }
        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);

        }


        #endregion
    }
}
Run Code Online (Sandbox Code Playgroud)

任何形式的帮助/指示都非常受欢迎。谢谢。

编辑:我设法使用以下方法获取内容:

Globals.ThisAddIn.Application.ActiveDocument.Range(0, 5).Text
Run Code Online (Sandbox Code Playgroud)

但问题是,如果结束范围超过文档的总长度,它将崩溃!那么如何获取文档的长度以将其作为第二个参数提供,或者有更好的方法吗?另外我想知道只是阅读文本并将其写回会使文本失去其格式和样式,所以有没有办法保留它以实现我想要实现的目标?非常感谢您清除所有这些困惑。

小智 5

使用文档的 Content 属性获取文档范围的第一个和最后一个索引

Microsoft.Office.Interop.Word._Document oDoc = 
     Globals.ThisAddIn.Application.ActiveDocument;
Object start = oDoc.Content.Start;
Object end = oDoc.Content.End;

// select entire document 
oDoc.Range(ref start,ref end).Select();
Run Code Online (Sandbox Code Playgroud)