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

本文关键字:文档 文本 Word 修改 VSTO 读取 使用 | 更新日期: 2023-09-27 18:26:44

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

Hello, my name is <%NAME%>. I am <%AGE%> years old and i live in <%COUNTRY%>.

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

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

简言之,我所寻找的只是一种方法:

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

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

我读到的一些文章是为了实现这一点:

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

如何阅读&在C#中使用VSTO从Word文档中编写文本

Globals.ThisAddIn.Application.Selection.Text;

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

我的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
    }
}

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

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

Globals.ThisAddIn.Application.ActiveDocument.Range(0, 5).Text

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

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

使用文档的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();