DSOFramerControl简单使用
以前大学做项目(Web的毕业论系统)就看见过在网页中嵌入Office的word,那时候用了哪个控件当时没记下来,我倒是忘了,最近发现在WinForm要嵌入Office的话,可以使用DSOFramerControl。
环境
使用之前要注册一下COM组件才行,使用 regsvr32注册 dsoframer.ocx。要是用这个的话,系统里面肯定要有装Office,要是很好使用的话,还得有Office开发组件,获得这组件的途径可以是在安装Office时把PIA也安装上。在这里可以找到添加上工具箱

当然这篇文章中只涉及到Word的使用,这个控件其实能给Office的其余成员——Excel,Visio和PowerPoint使用。
外观
控件运行起来就好比把一整个Word的窗口嵌在了当前开发的窗体中。

控件也大致包含了一个正常WinForm的基本元素,标题栏,工具栏,菜单栏。不过我用的是Office2013,它的标题栏和工具栏外观比较特殊,采用选项卡形式,导致控件的菜单栏只有一个File按钮。下面是网上看的到别的版本的Office的效果,菜单栏是齐的。

若要对标题栏,工具栏,菜单栏这些元素的显示状态进行更改,可设置以下几个属性
- Titlebar
- Menubar
- Toolbar
这三个属性都是布尔类型,光看名字就知道是设那个栏了。
基本文件操作
对一个Office的文件一般操作包括打开,关闭,保存。而打开可分为读写打开还有只读打开;保存又可分成保存和另存为。
打开可以调用Open方法,声明如下
public virtual void Open(object document);
public virtual void Open(object document, object readOnly, object progId, object webUsername, object webPassword);
Document参数是一个object类型,一般可以传一个文件的全名过去
this.officeWord.Open(@"C:\Users\居士\Desktop\temp\博文\系统特殊路径一览.docx");
如果要只读打开的话,可以使用重载的方法,第二个参数传个False进去,打开的文档虽然可以编辑,但是无法保存的。这个涉及到保存那个操作了,延后说。
关闭文档则调用
public virtual void Close();
还有一种关闭则是涉及到Microsoft.Office.Interop.Word.DocumentClass
这个对象的,在过往使用中,曾经在关闭的时候没处理好,导致word文档一直处于被锁状态,每次打开只能以只读方式打开。于是我会在窗体或者控件的Dispose中调用这么写道
Microsoft.Office.Interop.Word.Document doc = this.officeWord.ActiveDocument as Microsoft.Office.Interop.Word.Document;
object missObj=null;
doc.Close(ref missObj,ref missObj,ref missObj);
或者能把上面这段代码封装一下,然后在Form_Closing或者Form_Closed调用。
保存的方法声明如下
public virtual void Save();
public virtual void Save(object saveAsDocument, object overwriteExisting, object webUsername, object webPassword);
一般保存的话可以直接调用Save()方法,但是如果是在控件的菜单栏里新建的文档,该文档还不是一个物理文件时,调用Save()方法则会引发异常。
利用DocumentClass保存。DocumentClass实现了Document接口,Documenet有以下几个方法
void Save();
void SaveAs(ref object FileName = Type.Missing, ref object FileFormat = Type.Missing, ref object LockComments = Type.Missing, ref object Password = Type.Missing, ref object AddToRecentFiles = Type.Missing, ref object WritePassword = Type.Missing, ref object ReadOnlyRecommended = Type.Missing, ref object EmbedTrueTypeFonts = Type.Missing, ref object SaveNativePictureFormat = Type.Missing, ref object SaveFormsData = Type.Missing, ref object SaveAsAOCELetter = Type.Missing, ref object Encoding = Type.Missing, ref object InsertLineBreaks = Type.Missing, ref object AllowSubstitutions = Type.Missing, ref object LineEnding = Type.Missing, ref object AddBiDiMarks = Type.Missing); void SaveAs2(ref object FileName = Type.Missing, ref object FileFormat = Type.Missing, ref object LockComments = Type.Missing, ref object Password = Type.Missing, ref object AddToRecentFiles = Type.Missing, ref object WritePassword = Type.Missing, ref object ReadOnlyRecommended = Type.Missing, ref object EmbedTrueTypeFonts = Type.Missing, ref object SaveNativePictureFormat = Type.Missing, ref object SaveFormsData = Type.Missing, ref object SaveAsAOCELetter = Type.Missing, ref object Encoding = Type.Missing, ref object InsertLineBreaks = Type.Missing, ref object AllowSubstitutions = Type.Missing, ref object LineEnding = Type.Missing, ref object AddBiDiMarks = Type.Missing, ref object CompatibilityMode = Type.Missing); void SaveAs2000(ref object FileName = Type.Missing, ref object FileFormat = Type.Missing, ref object LockComments = Type.Missing, ref object Password = Type.Missing, ref object AddToRecentFiles = Type.Missing, ref object WritePassword = Type.Missing, ref object ReadOnlyRecommended = Type.Missing, ref object EmbedTrueTypeFonts = Type.Missing, ref object SaveNativePictureFormat = Type.Missing, ref object SaveFormsData = Type.Missing, ref object SaveAsAOCELetter = Type.Missing);
Save()就用在直接保存的,如果文档不存在,则会弹出“另存为”的文件保存对话框。SaveAs是用于另存为的。至于SaveAs2和SaveAs2000则是对应着docx和doc两种不同格式的文件。
上面提及到的文档只读问题。如果以只读方式打开的话,调用AxFramerControl的Save方法是会抛异常的。如果用重载的话,第二个参数overwriteExisting并且第一个参数文件名是原本打开的文件的话,是可以保存成功的。如果利用Document接口,调用Save()则会弹出另存为的则会弹出一个“另存为”的文件保存对话框。如果调用的是SaveAs,文件名是原本打开的文件的话,也是可以覆盖保存的。
这里提到的利用AxFramerControl的ActiveDocument属性,它是一个Object类型的,它可以转成DocumentClass类型,也可以转成DocumentClass2类型。能用哪种类型还取决于用户的系统上装了哪个版本的Office,如果装了Office 2007或以后版本的则可以使用DocumentClass和DocumentClass2;如果装了Office 2007以前的版本的话,那只能用DocumentClass了。
下面内容则涉及到对Word文档内容的编辑,这里觉得有部分概念要先提一下。
- 关于换行:Word文档的换行符其实是“\r”,这有别于平常的程序开发里面用到的“\n”或者“\r\n”。它识别不了“\n”这个字符,如果在文字编辑时用了“\n”则会显示别的字符上去。
- 在Word里面是以Word(单词或中文的词)作为一个文字的基本单元,平时在编辑文档时看到的红色波浪下划线就是Word里面识别到这个word有错误才打上去的,一个或者多个的word可以组成Range,这个Range会在文字替换成图片的地方用到。
不过下面部分的内容都是Microsoft.Office.Interop.Word.Document接口的使用
替换文字
替换文字的方法可定义如下,其中oMissing可以是一个object类型的字段
public void Replace(Document doc,string oldString, string newString)
{
doc.Content.Find.Text = oldString;
object FindText, ReplaceWith, ReplaceAll; FindText = oldString;
ReplaceWith = newString;
ReplaceAll = word.WdReplace.wdReplaceAll;
doc.Content.Find.Execute(ref FindText,
ref oMissing,
ref oMissing,
ref oMissing,
ref oMissing,
ref oMissing,
ref oMissing,
ref oMissing,
ref oMissing,
ref ReplaceWith,
ref ReplaceAll,
ref oMissing,
ref oMissing,
ref oMissing,
ref oMissing); }
查找内容
查找内容的方法就用到Range这个类了。方法是我自己写的,比较菜,而且只适用于查找第一个匹配的内容,往后匹配的都被忽略掉了。其实改改还是可以实现查询所有匹配内容的。
public Range FindRange(Document doc, string text)
{
Range range;
object start,end;
for (int i = ; true; i++)
{
start=i;end=i+text.Length;
try{
range = doc.Range(ref start, ref end);
if (range.Text == text) return range;
}
catch (Exception ex) { break; }
} return null;
}
插入图片
插入图片要也要用到Range,其实上面的查找方法算是为调用这个方法而定义的。至于调整图片的样式,目前还没有去考究
private void AddImage(Document doc, string imageFile,Range range)
{
string fileName = imageFile; //要插入的图片
Object oLinkToFile = false; //缺省
Object oSaveWithDocument = true;// 缺省
doc.InlineShapes.AddPicture(fileName, ref oLinkToFile, ref oSaveWithDocument, ref oMissed);
}
此外在网上也找了一份DSOFramerControl的API文档,附带一下
以上有什么说错的说漏的欢迎大家批评指出,谢谢!
DSOFramerControl简单使用的更多相关文章
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面
前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...
- 简单入门canvas - 通过刮奖效果来学习
一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...
随机推荐
- Java多线程系列--“JUC锁”06之 Condition条件
概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...
- GLFW初体验
GLFW - 很遗憾,没有找到FW的确切含义,Wiki上没有,GLFW主页也没有.猜测F表示for,W表示Window GLFW是干啥用的? 一个轻量级的,开源的,跨平台的library.支持Open ...
- 如何成为一个Xamarin专家
近期,我们发布了 Xamarin studio 6,这个版本充满了美妙的新特性,能够更有效的帮助我们的开发工作.由于其深层次的 IDE 比较复杂,同时我们也很难去发现并记得那些对我们最有帮助的特性,所 ...
- Windows Live Writer 初次使用
Windows Live Writer 博客园文章的一款发布器,这篇文章就是通过其发布的,可以先在word中写好博客内容,直接粘贴到这里发布就OK,之前我都是先在Word中写好一份,然后在blogs ...
- okhttp教程——起步篇
okhttp教程--起步篇 这篇文章主要总结Android著名网络框架-okhttp的基础使用,后续可能会有关于他的高级使用. okhttp是什么 okhttp是Android端的一个Http客户端, ...
- Android开发学习之路-SimpleAdapter源码分析学习
今天在课堂上,老师用到了SimpleAdapter,然后女神在边上问我为什么这个SimpleAdapter不能做到我app那种带有进度条的效果,言语说不清,然后就开始看源代码,发现这个Adapter的 ...
- salesforce 零基础开发入门学习(八)数据分页简单制作
本篇介绍通过使用VF自带标签和Apex实现简单的数据翻页功能. 代码上来之前首先简单介绍一下本篇用到的主要知识: 1.ApexPages命名空间 此命名空间下的类用于VF的控制. 主要的类包括但不限于 ...
- IOS开发之控件篇UINavigationController第二章 - 标题
1.什么是标题(Title) NavigationController里面的viewcontroller,每一页都会有一个标题,如图3r就是这个页面的标题 2. 如何设置标题 一般都会在这个Navig ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- Python数据类型之“文本序列(Text Sequence)”
Python中的文本序列类型 Python中的文本数据由str对象或字符串进行处理. 1.字符串 字符串是Unicode码值的不可变序列.字符串字面量有多种形式: 单引号:'允许嵌入"双&q ...