原创文章转载请注明出处:@协思, 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. 获取文件名:

  1. app = Globals.ThisAddIn.Application;
  2.  
  3. Path.GetExtension(app.ActiveDocument.FullName)

2.检查文档是否保存:

  1. app = Globals.ThisAddIn.Application;
  2.  
  3. if (!app.ActiveDocument.Saved)
  4.  
  5. {
  6.  
  7. 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",
  8.  
  9. MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
  10.  
  11. {
  12.  
  13. try
  14.  
  15. {
  16.  
  17. app.ActiveDocument.Save();
  18.  
  19. MessageBox.Show("save succeeded", "information", MessageBoxButtons.OK, MessageBoxIcon.Information);
  20.  
  21. }
  22.  
  23. catch (Exception ex)
  24.  
  25. {
  26.  
  27. MessageBox.Show("saved failed." + ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  28.  
  29. return;
  30.  
  31. }
  32.  
  33. }
  34.  
  35. }

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

  1. public byte[] GetDocumentContent(Word.Document wordDoc, string headerText, string footerText)
  2.  
  3. {
  4.  
  5. //使用Mail.RTFBody获取文档内容会丢失部分格式,所以这里还是采用剪贴板方式。
  6.  
  7. //复制文档内容到剪贴板
  8.  
  9. wordDoc.Content.Copy();
  10.  
  11. using (RichTextBox rtb = new RichTextBox())
  12.  
  13. {
  14.  
  15. //添加头部信息
  16.  
  17. rtb.AppendText(headerText);
  18.  
  19. rtb.SelectAll();
  20.  
  21. rtb.SelectionFont = new Font("Courier New", );
  22.  
  23. rtb.SelectionColor = Color.Green;
  24.  
  25. //添加正文
  26.  
  27. rtb.Select(rtb.TextLength, );
  28.  
  29. rtb.Paste();
  30.  
  31. Clipboard.Clear();
  32.  
  33. //添加尾部信息
  34.  
  35. rtb.SelectionFont = new Font("Courier New", );
  36.  
  37. rtb.SelectionColor = Color.Green;
  38.  
  39. rtb.AppendText(footerText);
  40.  
  41. using (System.IO.MemoryStream stream = new MemoryStream())
  42.  
  43. {
  44.  
  45. rtb.SaveFile(stream, RichTextBoxStreamType.RichText);
  46.  
  47. return stream.ToArray();
  48.  
  49. }
  50.  
  51. }
  52.  
  53. }

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

  1. object selObject = currentExplorer.Selection[];
  2.  
  3. MailItem mail = selObject as MailItem;
  4.  
  5. if (mail == null)
  6.  
  7. {
  8.  
  9. MessageBox.Show("non-mail item not supported.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
  10.  
  11. return;
  12.  
  13. }
  14.  
  15. 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. asp.net core的TagHelper简单使用

    TagHelper(标签助手)是ASP.NET Core非常好的一种新特性.可以扩展视图,让其看起来像一个原生HTML标签. 应该使用TagHelper替换HtmlHelper,因其更简洁更易用,且支 ...

  2. d3 中exit() remove()正确工作的方式

    在官网中给出的代码[1]是有问题的,如下的代码并不能正常工作: // Update… var p = d3.select("body").selectAll("p&quo ...

  3. dvd管理系统

    >>>>>>>>>>>>>>>>>>>> 语言:java 工具:eclipse ...

  4. animation_Frame动画图片轮播

    我们刚接触的时候想弄一个轮播图片的一个小案例,但一开始我们以为和以前写java一样,要写一下方法,逻辑:但今天你学了这个Frame动画就可以轻松搞定!下面我们来看看这个Frame是怎么实现的. 第一步 ...

  5. for in 结构

    in 运算符也是一个二元运算符,但是对运算符左右两个操作数的要求比较严格.in 运算符要求第 1 个(左边的)操作数必须是字符串类型或可以转换为字符串类型的其他类型,而第 2 个(右边的)操作数必须是 ...

  6. 一个快速排序(分类)及使用类似思想实现选择问题[c++实现]

    一.快速排序(快速分类)算法: 问题描述:给定线性集中n个元素和一个整数k,1<=k<=n,要求找出这n个元素中第k小的元素. 思想:选取数组A中的某个元素 t=A[s],然后将其他元素重 ...

  7. 编译原理词法分析 java简单实现

    package com.csray; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundEx ...

  8. 基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法

    基于孪生卷积网络(Siamese CNN)和短时约束度量联合学习的tracklet association方法 Siamese CNN Temporally Constrained Metrics T ...

  9. 【转】iOS学习之适配iOS10

    适配iOS10 2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从N ...

  10. 使用IHTMLDocument2解决弹出"为了让该网站给你提供个人化信息,是否允许在你计算机放置cookie?"

    mshtml可以说是一个不错的解析html利器,对于像我这样一直都是不用webbrowser,直接用socket或者WebRequest进行HTTP通讯 然后再用IHTMLDocument2.writ ...