原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com

得益于微软系强大的共通能力和Visual Studio的开发支持,做Office插件不是什么难事。一点经验记录如下:

1. 如果要同时开发Word和Outlook插件,那么可将复用的代码封闭到独立的Library中。

2. 在可安装.NET Framework 4的系统上,可以嵌入WPF组件。

3. 由于Office的安全模型,安装部署里需要可信任证书的签名。

4. 初始化代码可在ThisAddIn添加,如Startup、Shutdown、Application.NewMailEx...

代码集锦


1. 获取文件名:

app = Globals.ThisAddIn.Application;

Path.GetExtension(app.ActiveDocument.FullName)

2.检查文档是否保存:

app = Globals.ThisAddIn.Application;

if (!app.ActiveDocument.Saved)

{

    if (MessageBox.Show("This command publish the disk version of a file to the server. Do you want to save your changes to disk before proceeding?", "warning",

        MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)

    {

        try

        {

            app.ActiveDocument.Save();

            MessageBox.Show("save succeeded", "information", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        catch (Exception ex)

        {

            MessageBox.Show("saved failed." + ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);

            return;

        }

    }

}

3. 获取文档内容,并添加自己的信息

public byte[] GetDocumentContent(Word.Document wordDoc, string headerText, string footerText)

{

    //使用Mail.RTFBody获取文档内容会丢失部分格式,所以这里还是采用剪贴板方式。

    //复制文档内容到剪贴板

    wordDoc.Content.Copy();

    using (RichTextBox rtb = new RichTextBox())

    {

        //添加头部信息

        rtb.AppendText(headerText);

        rtb.SelectAll();

        rtb.SelectionFont = new Font("Courier New", );

        rtb.SelectionColor = Color.Green;

        //添加正文

        rtb.Select(rtb.TextLength, );

        rtb.Paste();

        Clipboard.Clear();

        //添加尾部信息

        rtb.SelectionFont = new Font("Courier New", );

        rtb.SelectionColor = Color.Green;

        rtb.AppendText(footerText);

        using (System.IO.MemoryStream stream = new MemoryStream())

        {

            rtb.SaveFile(stream, RichTextBoxStreamType.RichText);

            return stream.ToArray();

        }

    }

}

4. outlook邮件正文转换为word文档:

object selObject = currentExplorer.Selection[];

MailItem mail = selObject as MailItem;

if (mail == null)

{

    MessageBox.Show("non-mail item not supported.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);

    return;

}

Word.Document wordDoc = (Word.Document)mail.GetInspector.WordEditor;

资源下载


Office Control Identifiers: http://www.microsoft.com/en-us/download/details.aspx?id=6627

Office Document Extractor: http://code.msdn.microsoft.com/office/CSOfficeDocumentFileExtract-e5afce86

记录Office Add-in开发经验的更多相关文章

  1. 使用VS2012开发基于Office 2013的AddIn程序

    默认VS2012开发的Office Add是基于2010的,如下所示: 如果你机器上安装的Office版本是2013,那么使用VS2012创建的工程是无法运行的,弹出如下的错误: 那么此时怎么办呢?将 ...

  2. ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

    上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...

  3. (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

    ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念 ...

  4. Python学习day3作业

    days3作业 作业需求 HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除 ...

  5. csc.rsp Nuget MVC/WebAPI、SignalR、Rx、Json、EntityFramework、OAuth、Spatial

    # This file contains command-line options that the C# # command line compiler (CSC) will process as ...

  6. Codeforces 307 div2 E.GukiZ and GukiZiana 分块

    time limit per test 10 seconds memory limit per test 256 megabytes input standard input output stand ...

  7. 总结/PSP初体验—排球计分程序1.0

    要做一个排球计分程序,墨迹了很长时间才做出个的东西,过程很不爽: 功能:这个软件有两个页面,可以实现窗体A的部分变化控制窗体B的部分变化.A是操作人员使用看到的,B是投放给观众的,完全由A操控: 学到 ...

  8. 我的git与github学习历程

    因为想要知道如何把代码放到github上,所以就百度了一下,然后找到一个<如何从github上面拷贝源码>的文章,就先进行练习了下   1.首先到git官网下载git版本控制工具的安装包, ...

  9. 初探Backbone

    Backbone简介 中文API:http://www.csser.com/tools/backbone/backbone.js.html 英文API:http://backbonejs.org/ B ...

随机推荐

  1. POJ 3009 Curling 2.0【带回溯DFS】

    POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...

  2. git学习(五):克隆和推送远程仓库

    这里我已经注册好了GitHub账号了 生成本地的ssh和在github上添加ssh 在本地 ssh-keygen -t rsa -C "carryhjr@gmail.com" 一路 ...

  3. vue-cli

    vue-cli 脚手架   vue-loader 作用:提供基本项目结构 本身集成了很多项目模板:simple,webpack ,webpack-simple; simple:几乎没什么用: webp ...

  4. Python 学习第二十天 django知识

    一,django models 1,django ORM获取后台数据的方式,总共有三种 (1)v1 = models.Business.objects.all()   返回值为QuerySet类型,内 ...

  5. Servlet读取Excel标准化数据库过程记录

    完成数据库的连接 获取连接参数 拷贝1.数据库URL 2.驱动程序类 3.用户 编写Servlet 1.创建连接对象 Connection con = null; PreparedStatement ...

  6. 服务升级中的zookeeper

    服务升级中zookeeper可以管理服务中的配置以及作为leader选举以及分布式事务等, 在这次主要用于配置管理,关于配置管理主要设计如下,通过zookeeper管理配置项,通过 管理界面来管理数据 ...

  7. ShowMessageFmt 用法

    举例:ShowMessageFmt('n1:%x; n2:%x', [n1,n2]);  显示Params 为 array[integer] of TvarRec 进制表示 %o(8)   print ...

  8. 揭开Java IO流中的flush()的神秘面纱

    大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...

  9. # git 操作拾遗

    如何删除本地库 find . -name ".git" | xargs rm -Rf fatal: refusing to merge unrelated histories gi ...

  10. linux下 SVN切换仓库地址命令

    svn switch --relocate (Old Repository Root) (New Repository Root)