一 创建Office项目
新建项目,出现 “新建项目”对话框。
在对话框顶部的组合框中,选择 “.NET Framework 3.5”或 “.NET Framework 4”。
在“模板”窗格中想要使用的语言节点下,展开 “Office”。
选择 “2010”或 “2007”节点。
在项目模板的列表中,出现各种Office模板;可根据需要选择,如下图;
二 创建一个 Excel 文档级自定义项
在项目模板列表中,选择 “Excel 2007 工作簿”或 “Excel 2010 工作簿”;出现下图;输入文档名称;
出现下图,点确定;
可以通过修改在设计器中打开的工作表来设计自定义项的用户界面 (UI)。例如,可以向单元格添加文本、应用公式或添加 Excel 控件;如下图;
以编程方式向工作表中添加文本
用下面的代码替换 Sheet1_Startup 事件处理程序。 Sheet1 打开后,此代码便会向此工作表中添加第二行文本。
private void Sheet1_Startup(object sender, System.EventArgs e)
{
Microsoft.Office.Tools.Excel.NamedRange nr =
this.Controls.AddNamedRange(this.Range["A2", missing], "NamedRange1");
nr.Value2 = "此文本由代码添加";
}
运行程序,自动打开Excel并显示如下内容;
清理项目;完成项目的开发后,应移除生成输出文件夹中的文件和生成过程创建的安全设置。
在 Visual Studio 的 “生成”菜单中,单击 “清理解决方案”。
三 创建一个 Excel 应用程序级外接程序
新建项目,在项目模板列表中,选择 “Excel 2007 外接程序”或 “Excel 2010 外接程序”。
编写用于向保存的工作簿中添加文本的代码
在 ThisAddIn 代码文件中,将下面的代码添加到 ThisAddIn 类中。
void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook Wb, bool SaveAsUI, ref bool Cancel)
{
Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);
Excel.Range firstRow = activeWorksheet.get_Range("A1", missing);
firstRow.EntireRow.Insert(Excel.XlInsertShiftDirection.xlShiftDown, System.Type.Missing);
Excel.Range newFirstRow = activeWorksheet.get_Range("A1", missing);
newFirstRow.Value2 = "Excel是个好东西";
}
以下代码添加到 ThisAddIn_Startup 事件处理程序中。
this.Application.WorkbookBeforeSave += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler(Application_WorkbookBeforeSave);
运行,结果如下图;单击 保存 按钮时,在程序中添加的文本出现在Excel中。
四 在运行时在应用程序级项目中向工作表中添加控件
在 “项目”菜单上,单击 “添加新项”;
在 “添加新项”对话框中,选择 “功能区(可视化设计器)”,再单击 “添加”;
名为 Ribbon1.cs 的文件将在功能区设计器中打开,并显示一个默认选项卡和组;
从 “工具箱”的 “Office 功能区控件”选项卡中将 CheckBox 控件拖到 “group1”上;如此添加三个CheckBox;
并把其名称和Text属性改为:Button,Button;NamedRange,NamedRange;ListObject,ListObject
并把其名称和Text属性分别改为:Button,Button;NamedRange,NamedRange;ListObject,ListObject
操作过程如下三图所示;
为Button控件添加如下代码,其他两个CheckBox类似;
private void Button_Click(object sender, RibbonControlEventArgs e)
{
Worksheet worksheet = Globals.Factory.GetVstoObject(
Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[1]);
string buttonName = "MyButton";
if (((RibbonCheckBox)sender).Checked)
{
Excel.Range selection = Globals.ThisAddIn.Application.Selection as Excel.Range;
if (selection != null)
{
Microsoft.Office.Tools.Excel.Controls.Button button =
new Microsoft.Office.Tools.Excel.Controls.Button();
worksheet.Controls.AddControl(button, selection, buttonName);
}
}
else
{
worksheet.Controls.Remove(buttonName);
}
}
引用如下的命名空间;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Excel;
using Microsoft.Office.Tools.Excel.Extensions;
如果 using Microsoft.Office.Tools.Excel.Extensions;
出错;
手动添加引用:
C:\Program Files\Reference Assemblies\Microsoft\VSTO40\v4.0.Framework\Microsoft.Office.Tools.Excel.v4.0.Utilities.dll
将下面的方法添加到 ThisAddIn 类中。
void Application_WorkbookBeforeSave(Microsoft.Office.Interop.Excel.Workbook workbook,
bool SaveAsUI, ref bool Cancel)
{
Excel.Worksheet worksheet =
workbook.Worksheets[1] as Excel.Worksheet;
if (Globals.Factory.HasVstoObject(worksheet) &&
Globals.Factory.GetVstoObject(worksheet).Controls.Count > 0)
{
Worksheet vstoWorksheet = Globals.Factory.GetVstoObject(worksheet);
while (vstoWorksheet.Controls.Count > 0)
{
object vstoControl = vstoWorksheet.Controls[0];
vstoWorksheet.Controls.Remove(vstoControl);
}
}
}
用下面的代码替换 ThisAddIn_Startup 方法。
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
this.Application.WorkbookBeforeSave +=
new Microsoft.Office.Interop.Excel.AppEvents_WorkbookBeforeSaveEventHandler
(Application_WorkbookBeforeSave);
}
运行,结果如下图;
选择 Sheet1 中的任何单元格;单击 选择 加载项 选项卡;
在 “group1”组中,单击 “Button”,一个按钮显示在所选单元格中;
选择 Sheet1 中的另一个单元格,在 “group1”组中,单击 “NamedRange”,将为所选单元格定义一个命名区域;
选择 Sheet1 中的一系列单元格,在 “group1”组中,单击 “ListObject”,将为所选单元格添加一个列表对象。
五 创建一个 PowerPoint 应用程序级外接程序
新建项目,在项目模板列表中,选择 “PowerPoint 2007 外接程序”或 “PowerPoint 2010 外接程序”。
编写向每张新幻灯片中添加文本的代码
将下面的代码添加到 ThisAddIn 类中。
当用户将新幻灯片添加到活动演示文稿时,此事件处理程序会将文本框添加到新幻灯片的顶部,然后向文本框中添加一些文本。
void Application_PresentationNewSlide(PowerPoint.Slide Sld)
{
PowerPoint.Shape textBox = Sld.Shapes.AddTextbox(
Office.MsoTextOrientation.msoTextOrientationHorizontal, 0, 0, 500, 50);
textBox.TextFrame.TextRange.InsertAfter("此文本由代码生成.");
}
将以下代码添加到 ThisAddIn_Startup 事件处理程序中。
this.Application.PresentationNewSlide +=
new PowerPoint.EApplication_PresentationNewSlideEventHandler(
Application_PresentationNewSlide);
运行程序,文本添加到幻灯片顶部的新文本框中,如下图;
六 创建一个 Word 文档级自定义项
新建项目,选择 “Word 2007 文档”或 “Word 2010 文档”,或 Word 2010 模板;
可以通过修改在设计器中打开的文档来设计自定义项的用户界面 (UI)。例如,可以添加文本、表或 Word 控件;
以编程方式向文档中添加文本
用下面的代码替换 ThisDocument_Startup 事件处理程序;
private void ThisDocument_Startup(object sender, System.EventArgs e)
{
this.Paragraphs[1].Range.InsertParagraphAfter();
this.Paragraphs[2].Range.Text = "此文本由代码生成";
}
运行程序,文档中出现由代码添加的文本,如下图;
七 运行时在应用程序级外接程序中向文档添加控件
首先创建 Word 外接程序项目;
提供用于向文档添加控件的 UI;
在 “项目”菜单上,单击 “添加新项”;
在 “添加新项”对话框中,选择 “功能区(可视化设计器)”;单击 “添加”;
在功能区设计器中,单击 “group1”组;
将 “group1”的 “Label”属性更改为“添加控件”;
从 “工具箱”的 “Office 功能区控件”选项卡中将 “CheckBox”控件拖到 “group1”上,更改其名称和Text属性为addButtonComboBox和 添加按钮 ;
向 “group1”再添加一个复选框,更改其名称和Text属性为addRichTextCheckBox和添加多格式文本控件;
将下面的代码添加到 ThisAddIn 类中;
private Microsoft.Office.Tools.Word.Controls.Button button = null;
private RichTextContentControl richTextControl = null;
将下面的方法添加到 ThisAddIn 类中;
internal void ToggleButtonOnDocument()
{
Document vstoDocument = Globals.Factory.GetVstoObject(this.Application.ActiveDocument);
string name = "MyButton";
if (Globals.Ribbons.MyRibbon.addButtonCheckBox.Checked)
{
Word.Selection selection = this.Application.Selection;
if (selection != null && selection.Range != null)
{
button = vstoDocument.Controls.AddButton(
selection.Range, 100, 30, name);
}
}
else
{
vstoDocument.Controls.Remove(name);
}
}
将下面的方法添加到 ThisAddIn 类中;当用户单击功能区中的“添加多格式文本控件”复选框时,如果选中了该复选框,此方法会向文档中的当前选定内容中添加一个 RichTextContentControl;如果清除了该复选框,此方法会移除 RichTextContentControl;
internal void ToggleRichTextControlOnDocument()
{
Document vstoDocument = Globals.Factory.GetVstoObject(this.Application.ActiveDocument);
string name = "MyRichTextBoxControl";
if (Globals.Ribbons.MyRibbon.addRichTextCheckBox.Checked)
{
Word.Selection selection = this.Application.Selection;
if (selection != null && selection.Range != null)
{
richTextControl = vstoDocument.Controls.AddRichTextContentControl(
selection.Range, name);
}
}
else
{
vstoDocument.Controls.Remove(name);
}
}
在 ThisAddIn.cs 中,将下面的方法添加到 ThisAddIn 类中
private void Application_DocumentBeforeSave(Word.Document Doc,
ref bool SaveAsUI, ref bool Cancel)
{
bool isExtended = Globals.Factory.HasVstoObject(Doc);
if (isExtended)
{
Microsoft.Office.Tools.Word.Document vstoDocument = Globals.Factory.GetVstoObject(Doc);
if (vstoDocument.Controls.Contains(button))
{
vstoDocument.Controls.Remove(button);
Globals.Ribbons.MyRibbon.addButtonCheckBox.Checked = false;
}
}
}
将下面的代码添加到 ThisAddIn_Startup 事件处理程序中;
this.Application.DocumentBeforeSave +=
new Word.ApplicationEvents4_DocumentBeforeSaveEventHandler(
Application_DocumentBeforeSave);
在Ribbon.cs 或 MyRibbon.vb 代码文件中,将生成的 addButtonCheckBox_Click 和 addRichTextCheckBox_Click 事件处理程序替换为下面的代码;
private void addButtonCheckBox_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.ToggleButtonOnDocument();
}
private void addRichTextCheckBox_Click(object sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.ToggleRichTextControlOnDocument();
}
运行程序;在Word文档中,多次按 Enter 以向文档添加新的空段落;
选择一个段落;选择 加载项 选项卡;
在 “添加控件”组中,单击 “添加按钮”,一个按钮随即显示在第一个段落中;
选择最后一个段落,在 “添加控件”组中,单击 “添加多格式文本控件”;一个多格式文本内容控件随即添加到最后一个段落中;
如下图所示;
以上项目的源码下载:
http://pan.baidu.com/s/1eQy9RPK
需要安装VS2010和Office 2010,才能运行;若装的是Office 2007,按上述步骤操作,把模板类型改为Office 2007类型;