记录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 ...
随机推荐
- POJ 3009 Curling 2.0【带回溯DFS】
POJ 3009 题意: 给出一个w*h的地图,其中0代表空地,1代表障碍物,2代表起点,3代表终点,每次行动可以走多个方格,每次只能向附近一格不是障碍物的方向行动,直到碰到障碍物才停下来,此时障碍物 ...
- git学习(五):克隆和推送远程仓库
这里我已经注册好了GitHub账号了 生成本地的ssh和在github上添加ssh 在本地 ssh-keygen -t rsa -C "carryhjr@gmail.com" 一路 ...
- vue-cli
vue-cli 脚手架 vue-loader 作用:提供基本项目结构 本身集成了很多项目模板:simple,webpack ,webpack-simple; simple:几乎没什么用: webp ...
- Python 学习第二十天 django知识
一,django models 1,django ORM获取后台数据的方式,总共有三种 (1)v1 = models.Business.objects.all() 返回值为QuerySet类型,内 ...
- Servlet读取Excel标准化数据库过程记录
完成数据库的连接 获取连接参数 拷贝1.数据库URL 2.驱动程序类 3.用户 编写Servlet 1.创建连接对象 Connection con = null; PreparedStatement ...
- 服务升级中的zookeeper
服务升级中zookeeper可以管理服务中的配置以及作为leader选举以及分布式事务等, 在这次主要用于配置管理,关于配置管理主要设计如下,通过zookeeper管理配置项,通过 管理界面来管理数据 ...
- ShowMessageFmt 用法
举例:ShowMessageFmt('n1:%x; n2:%x', [n1,n2]); 显示Params 为 array[integer] of TvarRec 进制表示 %o(8) print ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- # git 操作拾遗
如何删除本地库 find . -name ".git" | xargs rm -Rf fatal: refusing to merge unrelated histories gi ...
- linux下 SVN切换仓库地址命令
svn switch --relocate (Old Repository Root) (New Repository Root)