记录Office Add-in开发经验
原创文章转载请注明出处:@协思, 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开发经验的更多相关文章
- 使用VS2012开发基于Office 2013的AddIn程序
		
默认VS2012开发的Office Add是基于2010的,如下所示: 如果你机器上安装的Office版本是2013,那么使用VS2012创建的工程是无法运行的,弹出如下的错误: 那么此时怎么办呢?将 ...
 - ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章
		
上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...
 - (1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6
		
ASP.NET从MVC5升级到MVC6 总目录 MVC5项目结构 带有Areas和Filter的项目结构 一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念 ...
 - Python学习day3作业
		
days3作业 作业需求 HAproxy配置文件操作 根据用户输入,输出对应的backend下的server信息 可添加backend 和sever信息 可修改backend 和sever信息 可删除 ...
 - 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 ...
 - Codeforces 307 div2 E.GukiZ and GukiZiana 分块
		
time limit per test 10 seconds memory limit per test 256 megabytes input standard input output stand ...
 - 总结/PSP初体验—排球计分程序1.0
		
要做一个排球计分程序,墨迹了很长时间才做出个的东西,过程很不爽: 功能:这个软件有两个页面,可以实现窗体A的部分变化控制窗体B的部分变化.A是操作人员使用看到的,B是投放给观众的,完全由A操控: 学到 ...
 - 我的git与github学习历程
		
因为想要知道如何把代码放到github上,所以就百度了一下,然后找到一个<如何从github上面拷贝源码>的文章,就先进行练习了下 1.首先到git官网下载git版本控制工具的安装包, ...
 - 初探Backbone
		
Backbone简介 中文API:http://www.csser.com/tools/backbone/backbone.js.html 英文API:http://backbonejs.org/ B ...
 
随机推荐
- 解决C# WinForm Graphics绘制闪烁问题
			
不直接使用form的CreateGraphics创建Graphics进行绘制,可以先在Form上面放一个需要大小的PictureBox,再创建一个同大小的Bitmap,将这个Bitmap设置为Pict ...
 - 阿里开源消息中间件RocketMQ的前世今生-转自阿里中间件
			
昨天,我们将分布式消息中间件RocketMQ捐赠给了开源软件基金会Apache. 孵化成功后,RocketMQ或将成为国内首个互联网中间件在Apache上的顶级项目. 消息一出,本以为群众的反应是这样 ...
 - Python 学习第十六天 html 前端内容总结
			
一,css知识总结 1, css属性 css的属性包括以下内容 position:规定元素的定位类型 background:属性在一个声明中设置所有的背景属性 可以设置的如下属性: (1)back ...
 - 压力测试相关之ab命令
			
1. 短时压力测试工具 ab 命令(apache的工具) 关键指标: Requests per second: 98.52 [#/sec] (mean) ###平均每秒的请求数 Tim ...
 - java-并发-高级并发对象2
			
浏览以下内容前,请点击并阅读 声明 并发集合 java.util.concurrent包包含了许多对于java集合框架的补充,根据提供的接口可以将这些集合分为以下几类: BlockingQueue 定 ...
 - oracle EXP导出一张表时使用query参数指定where条件
			
oracle exp 导出一个表的部分内容,使用query参数可加上SQL的where条件进行过滤 注意:如果需要使用到日期字符串格式等单引号,需要使用双引号将where条件括起来,而且双引号要用\做 ...
 - 4.3 多线程进阶篇<中>(GCD)
			
更正:队列名称的作用的图中,箭头标注的有些问题,已修正 本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 本文源码 Demo 详见 Gith ...
 - java 测试:iterator foreach for 三种迭代方式哪种更快?
			
代码: public class main { public static void main(String[] p_args){ ArrayList<String> _l_string ...
 - es6  数组的工具类
			
根据Es6中map和Set的特性,实现了对array的分组和转换操作. exports.mapToObj = function (strMap) { let obj = Object.create(n ...
 - Torch Problems: require some packages doesn't work
			
I've recently got a problem. require 'cutorch' doesn't work. But it was ok yesterday, although I hav ...