我是C#的新手,目前正在使用Visual Studio 2015尝试为Word 2013创建基于功能区的VSTO插件,点击按钮即可完成以下任务:
我目前能够执行第一次和最后任务。具有讽刺意味的是,我直接从MSDN article on Find & Replace使用了代码,但是遇到了阻止我构建的错误。我尝试过多种解决方案,包括将Application.Selection.Find
替换为Word.Selection.Find
和WordApp.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); }
}
}
}
答案 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;