.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发

一 创建Office项目

    新建项目,出现 “新建项目”对话框。
在对话框顶部的组合框中,选择 “.NET Framework 3.5”或 “.NET Framework 4”。 
在“模板”窗格中想要使用的语言节点下,展开 “Office”。
选择 “2010”或 “2007”节点。
在项目模板的列表中,出现各种Office模板;可根据需要选择,如下图;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第1张图片


二 创建一个 Excel 文档级自定义项

    在项目模板列表中,选择 “Excel 2007 工作簿”或 “Excel 2010 工作簿”;出现下图;输入文档名称;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第2张图片


出现下图,点确定;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第3张图片


可以通过修改在设计器中打开的工作表来设计自定义项的用户界面 (UI)。例如,可以向单元格添加文本、应用公式或添加 Excel 控件;如下图;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第4张图片


以编程方式向工作表中添加文本
用下面的代码替换 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并显示如下内容;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第5张图片


    清理项目;完成项目的开发后,应移除生成输出文件夹中的文件和生成过程创建的安全设置。
在 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中。

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第6张图片


四 在运行时在应用程序级项目中向工作表中添加控件

在 “项目”菜单上,单击 “添加新项”;
在 “添加新项”对话框中,选择 “功能区(可视化设计器)”,再单击 “添加”;
名为 Ribbon1.cs 的文件将在功能区设计器中打开,并显示一个默认选项卡和组;
从 “工具箱”的 “Office 功能区控件”选项卡中将 CheckBox 控件拖到 “group1”上;如此添加三个CheckBox;
并把其名称和Text属性改为:Button,Button;NamedRange,NamedRange;ListObject,ListObject

并把其名称和Text属性分别改为:Button,Button;NamedRange,NamedRange;ListObject,ListObject

操作过程如下三图所示;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第7张图片



.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第8张图片


.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第9张图片


为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”,将为所选单元格添加一个列表对象。

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第10张图片


五 创建一个 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);


运行程序,文本添加到幻灯片顶部的新文本框中,如下图;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第11张图片


六 创建一个 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 = "此文本由代码生成";
}

运行程序,文档中出现由代码添加的文本,如下图;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第12张图片


七 运行时在应用程序级外接程序中向文档添加控件
首先创建 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 以向文档添加新的空段落;
选择一个段落;选择 加载项 选项卡;
在 “添加控件”组中,单击 “添加按钮”,一个按钮随即显示在第一个段落中;
选择最后一个段落,在 “添加控件”组中,单击 “添加多格式文本控件”;一个多格式文本内容控件随即添加到最后一个段落中;
如下图所示;

.Net操作Office总结一 - 使用VS2010自带的Office模板进行开发_第13张图片


以上项目的源码下载:

http://pan.baidu.com/s/1eQy9RPK

需要安装VS2010和Office 2010,才能运行;若装的是Office 2007,按上述步骤操作,把模板类型改为Office 2007类型;


你可能感兴趣的:(原创教程)