C#开发word(wps)插件(com加载项)作为一个web前端开发,不搞点后端...

WPS Office 插件

C#开发word(wps)插件(com加载项)

作为一个web前端开发,不搞点后端的东西玩玩也说不过去。除了常见的nodejs 或者java以外,最近收到需求,要搞一个word(wps)插件,用于方便总裁办的同事发布写一些公文,格式化版头,标题,附件等。所以最近也一直在研究这方面的知识。奈何网上参考的文献太少,太杂。于是这里我便总结一下开发全过程,供大家参考交流。 关于word(wps)插件,要实现的最终效果,无非如下两种: 对比上述两种方案,我们发现,通过com加载项来实现word(wps)插件对使用者来说是相当简洁和便利的,一目了然。因此,我们确定需求,就按照这个来实现,产出xxx.dll等相关文件。 因为这些基于microsoft office的上做的二次开发,必须要基于window系统,参考我微软的技术栈开发。微软的技术主要的无非两种: 两者无所谓好坏,但我个人对vb不太感冒,而且气语法跟java的有点点差异的,因此技术选型选择C#。 于此同时,本次我是基于金山软件wps(国内很多公司,尤其是国企央企等电话都会统一安装wps)开发的插件,调用word的接口方法跟microsoft office一模一样。因此开发环境准备如下: 建议安装完 Microsoft Visual Studio后以管理员身份运行启动 选中解决方案下的项目---【右键】---【属性】,开始如下设置: 【生成】---勾选【为com互操作注册】 【调试】---选中【启动外部程序】---选择wps安装路径 我这里是wps文字,因此选中后的完成路径是: C:\Program Files (x86)\Kingsoft\WPS Office\10.8.0.6370\office6\wps.exe 如果你们是基于wps 表格 C:\Program Files (x86)\Kingsoft\WPS Office\10.8.0.6370\office6\et.exe wps ppt 的话 C:\Program Files (x86)\Kingsoft\WPS Office\10.8.0.6370\office6\wpp.exe 【签名】--【新建签名】 图中的xx_officialDocument.pfx就是此处下拉框选则【新建】后当场生成的。 至此,新建项目完毕, 因为我们要掉office的相关接口,所以就必须引用office 和kingsoft 相关的dll,即类库, Upgrade WPS Office 3.0 Object Library对应的是WPS文字、Upgrade WPS Spreadsheets 3.0 Object Library对应的是WPS表格。 提示:若添加后提示引用出错,可以尝试的解决方法有: 引用添加完毕后,我们可以看到我们总共依赖了哪些引用 在Properties上右键→添加→新建项→找到“资源文件”→输入或保持默认名称→添加 打开Resource1.resx后--【添加资源】---【添加新文本文件】---【输入MyRibbon】 这个MyRibbon.txt文件就是一个xml菜单文件,配置你在wps中的菜单的显示 双击MyRibbon.txt后进入编辑,输入如下文本 关于这个ribbon,详情可以参考微软官方文档: Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3) 这里的主类,就是我们一开始把Class1.cs该成了OfficialDocument.cs这个文件。当然你可以命名为其他。 打开了OfficialDocument.cs: 文件最上方就是我们引用的类,都写进来 继续往下写 有红色的波浪线,提示我们有错,不过没关系,鼠标悬浮在上面,点击黄色灯泡图标的下拉箭头---【实现接口】,visual studio 会自动实现其接口。IRibbonExtensibility 这个也一样这么操作一下。 得到修复后的代码如下: 在OnConnection事件中初始化app和wordDoc对象 在GetCustomUI事件中调用在Resource1.resx中添加的MyRibbon.txt,获取菜单配置文件 添加事件试试。我们在MyRibbon.txt文件中的每一项按钮里面,都有一个onAction,这个就是绑定的事件。需要我们在Class1.cs文件中去实现 我们来实现一个addFontSpace,当你点击这个按钮的时候,就触发了此事件 提示:MessageBox需要引用System.Windows.Forms。引用方法如下: 在第三部中,我们实现了一个自定义的菜单,并期望其加到wps的菜单栏中,具体展示结果如下 怎么样才能展示这个菜单呢? 在【开发工具】---【com加载项】选中我们的实现的com加载项(wps专业版才有【开发工具】这个菜单选项): 那么问题又来了,怎么样才能在这里显示这么多的com加载项来供我们选中? 这里我们要自定义Zxxx.OfficialDocument这个com加载项,就必须操作注册表,在启动wps的时候会自动读取相关的内容(实际情况会更复杂)。现在来实现实现一个reg文件,操作注册表 新增一个空的txt记事本文件→ 修改后缀名,另存为install.reg→ 右键此文件编辑→ 拷贝如下代码: 需要注意的是: 这里 [HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Word\Addins固定不变,后面的xxx1.xxx2,表示 xxx1是你项目的名,xxx2是你cs入口文件的类名,本例中就是yourProjectName.Class1 以上,写入注册表信息install.reg文件完成。 但是,如果你想清理掉这个注册表信息,你可以手动在命令行输入regedt,打开操作界面,你也可以专门生成一个unistall.reg文件,双击实行即可。 unistall.reg 内容如下: 注意减号(横杠)“-”,还有xxx1.xxx2(本例子中是Zhjk.OfficialDocument)要与你安装的install.reg里面的保持一致。若开发的是WPS文字、WPS表格的外接程序,则注册路径中HKEY_CURRENT_USER\SOFTWARE\Microsoft后面:WPS文字对应的是Word和WPS;WPS表格对应的是Excel和ET 某些电脑可能要用管理权权限来运行这个reg文件 命令行输入 regedit 沿着这个HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\Word\Addins路径一直打开目录,如果看到如下,即说明写入注册表成功 之前做了那么多准备工作,现在可以启动调试,看看我们的wps 文字到底有没有按照预定的情况加载自定义菜单。 打开visual studio 界面,在degug模式下,点击启动按钮: 然后自动自动wps文字(如果此前你打开了wps文字应用,或者word,请先关掉) 看到此界面,说明我们的自定义com加载项本地调试成功。 详情请见我的另一篇文章。 部署之前,我们要先对我们的dll签名,保证系统信任此文件 后面我们需要这三个dll。 若用户是WPS专业版则不需要,为了兼容性,推荐进行强签名。 另外,如果项目中引用了第三方未签名的dll,则必须进行强签名才能引用。 可以看到强签名后的文件如下: Word.dll、Office.dll这两个强签名的,就是我们后面需要的文件。 凑齐这么多dll等相关的文件,我们可以召唤神龙了。 在此前的步骤中,我们拿到了强签名的dll 和Release 模式下应用生曾的dll, 现在开始对window系统进行操作了。 这个文件夹路径 你可以在命令行,一行行输入命令来实现。这里我们推荐用批处理命令。 把所有的命令都放在一个xxx.bat文件里。 这里我们的在当前Release目录下新增一个install.bat,里面内容如下: 同样,再建一个卸载的bat批处理命令文件 uninstall.bat: %~dp0是bat文件当前文件夹路径;RegAsm是程序集注册工具,需要用户先安装Microsoft .Net Framework 4.0;gacutil.exe是全局程序集缓存工具,用户电脑一般没有,所以需要我们将NETFX 4.8 Tools文件夹附带在安装包里 最终输出包如下:


            C#开发word(wps)插件(com加载项)