无法在Word 2013 VSTO插件中使用Application.Select.Find

时间:2016-04-08 03:35:50

标签: c# ms-word visual-studio-2015 ms-office vsto

我是C#的新手,目前正在使用Visual Studio 2015尝试为Word 2013创建基于功能区的VSTO插件,点击按钮即可完成以下任务:

  • 在文本框中接收用户的输入。
  • 查找一系列字符(" xxxxx"),并使用之前的用户输入替换整个文档中的集合。
  • 将文档另存为PDF格式。

我目前能够执行第一次最后任务。具有讽刺意味的是,我直接从MSDN article on Find & Replace使用了代码,但是遇到了阻止我构建的错误。我尝试过多种解决方案,包括将Application.Selection.Find替换为Word.Selection.FindWordApp.Selection.Find,但无济于事。

我的确切错误如下:" 错误CS0117'应用程序'不包含'选择'"

的定义

我觉得这里的胜利如此接近,这让我感到沮丧。我在下面发布了完整的代码。

非常感谢您提供的任何帮助和/或见解!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Tools.Ribbon;
using System.Windows.Forms;
using Word = Microsoft.Office.Interop.Word;
using Microsoft.Office.Tools.Word;

namespace RestRef_Automator_Test
{
    public partial class Ribbon1
    {
        private bool flag;

        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {

        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            //Get, Find, & Replace RID
            int myRID = 0;
            string myString = myRID.ToString();

            flag = int.TryParse(RID.Text, out myRID);
            if (flag == false)
            {
                MessageBox.Show("Please enter in a number.", "Input Error");
                return;
            }

            Word.Find findObject = Application.Selection.Find;
            findObject.ClearFormatting();
            findObject.Text = "xxxxx";
            findObject.Replacement.ClearFormatting();
            findObject.Replacement.Text = myString;

            object replaceALL = Word.WdReplace.wdReplaceAll;
            object missing = null;
            findObject.Execute(
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref replaceALL, ref missing, ref missing, ref missing, ref missing);

            //Save as PDF w/ applicable name.
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.FileName = "*";
            dlg.DefaultExt = "pdf";
            dlg.ValidateNames = true;
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            { Globals.ThisAddIn.Application.ActiveDocument.ExportAsFixedFormat(dlg.FileName, Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF, OpenAfterExport: true); }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

跟进原始问题下面的评论,当查看代码来做示例时,我注意到你在哪里使用了错误的应用程序对象。而不是要求Word女士找到您的选择,而不是询问您的C#应用​​程序。

我没有在我的计算机上安装Word,但内存不足,我说你应该改变

Word.Find findObject = Application.Selection.Find;

var app = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
Word.Find findObject = app.Selection.Find;

请记住,此解决方案希望Word已启动并正在运行。如果word没有运行,则会导致异常。

答案 1 :(得分:0)

Nick的分析是正确的,但建议的解决方案对于VSTO加载项并不是最佳的。

由于这是一个VSTO加载项,因此使用GetObject来获取Word.Application的实例是而不是正确的方法。 Word.Application可以通过任何VSTO加载项直接使用,因为加载项是使用Word.Application在进程中运行的。

ThisAddIn.cs课程中,通常在ThisAddIn_Startup活动中:

Word.Application wdApp = this.Application;

如果您希望/需要从其他类访问它,则将Word.Application对象声明为类成员并在ThisAddIn_Startup中分配

或者通过Globals对象访问它,这使您的代码可以访问所有类中的所有VSTO对象:

Word.Application app = Globals.ThisAddIn.Application;