dsoframer是微软提供一款开源的用于在线编辑、调用Word、 Excel 、PowerPoint等的ActiveX控件。国内很多著名的OA中间件,电子印章,签名留痕等大多数是依此改进而来的。

  一、现状

    1.官方有Dsoframer 1.3,支持Office2003和2007,也有远程保存的方法,但这个远程保存方法要求远程服务器的 HTTP 支持 Microsoft FrontPage Server Extensions (FPSE) 或 Web 分发创作和版本控制 (WebDAV) 协议扩展,有点不现实。
    2.网上广为流传的还有Dsoframer 2.2.1.2,该控件支持HttpPost远程保存,但不支持Office 2007. 
    3.Dsoframer 2.3.0.0,这个是网上改的2.2.1.2版使其支持Office 2007

  下载地址:

    1. Dsoframer 1.3:http://download.microsoft.com/download/7/1/2/712086b9-20de-4bf8-967b-2ef4b5ae4f6f/DsoFramer_KB311765_x86.exe 
    2. Dsoframer 2.2.1.2:http://download.csdn.net/source/1232750
    3. Dsoframer 2.3.0.0:http://download.csdn.net/source/1375531

  二、使用

    在下载的过程中可能出现exe等等,不要着急,安装一下就可以,得到的是一个后缀名为ocx的组件,那么,问题来了,怎么调用,怎么注册。

    1、注册(对于程序员来说,这不是问题,主要拷贝ocx组件到对应的目录)。

      32位:regsvr32.exe c:\windows\system32\dsoframer.ocx

      64位:regsvr32.exe c:\windows\sysWOW64\dsoframer.ocx

    2、添加组件(Visual Studio 2013)

      首先,选择项:

      

      然后选择com组件:

      

      选择了之后,点击确定即可。

      

      添加了组件之后,放置到我们的窗体上,然后右击属性,哈哈,是不是发现了很多东西哦。

      

    3、基本操作

      dsoFramer的主要目的是操作word,excel等相关组件,目前我自己用的时候我觉得还是挺稳定的,还不错吧,函数里面的基本信息,如Open(),Save(),Close()等等,诸如此类的,就不说了
      1、基本属性:TitileBar、MenuBar、ToolBar,均可以在属性栏设置隐藏。
      2、和普通组件一样,可以有Visable、Dock、Anchor(设置边缘)、broderStyle、Size、padding等一般控件的公有属性。
      3、当我们添加了toolTip控件之后,该组件和其他控件一样,有"tooltip上的ToolTip"这个属性。

    4、系统设置

      1、添加这个组件之后,可能会有一个”Unable to dispaly the inactive document。Click here to Reactive the Document“的字样,不要紧张,那是因为我们又一个属性没有设置,当前设置属性的时候也一定要注意一点。在构造这个窗体的时候”axFramerControl.ActivationPolicy = DSOFramer.dsoActivationPolicy.dsoKeepUIActiveOnAppDeactive;“,这句话是必不可少的,当然,为了防止报错,这句话我直接加了一个try{}catch{},因为当不需要打开文档的时候,去构造这个属性是不存在的。其实呢,还可以选择控件属性在ActivationPolicy通过下拉菜单选择属性为dsoKeepUIActiveOnAppDeactive。(注意,dsoFramer2.3以后的版本不会出现这个错误,这个是在引用wps的时候可能会出现的)
      2、添加了组件之后,可以把组件的Dock属性设置为Fill,当然,这些其实和其他的控件是一样的。
      注意:1、dsoFramer用的是不能同时存在一个线程里面的。也就是说可以单独开一个窗口,再绑定一个dsoFramer。
           2、dsoFramer因为采用的内嵌办公软件,所以呢,快捷键全部支持。

  三、事件

    因为本身采用的是word或者wps之类的办公软件,所以,可以直接调用word的接口或者说wps的接口直接操作。

    1、注册事件(当组件使用的时候,再去调用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/// <summary>
///
/// </summary>
private void RegisterInfo()
{
    Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)this.axFramerControlMain.ActiveDocument;
    doc.Application.WindowSelectionChange += new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowSelectionChangeEventHandler(this.SelectEvent);
    doc.Application.WindowActivate += new Microsoft.Office.Interop.Word.ApplicationEvents4_WindowActivateEventHandler(this.SettingInfomation);
}
/// <summary>
///
/// </summary>
/// <param name="doc"></param>
/// <param name="Wn"></param>
private void SettingInfomation(Microsoft.Office.Interop.Word.Document doc, Microsoft.Office.Interop.Word.Window Wn)
{
    doc = (Microsoft.Office.Interop.Word.Document)this.axFramerControlMain.ActiveDocument;
}
/// <summary>
///
/// </summary>
/// <param name="sel"></param>
private void SelectEvent(Microsoft.Office.Interop.Word.Selection sel)
{
    if (sel.Text != null)
    {
        if (Convert.ToString(sel.Text.Trim()) == "释义")
        {
            SettingWordInfo(240, 140, 150, 100, "对可能造成投资者理解障碍及有特定含义的名称缩写、专有名词等作出释义,应当在目录次页排印。");
        }
    }
}

    2、插入Shape对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// <summary>
/// 文本域提示信息
/// <param name="left">距左</param>
/// <param name="top">距上</param>
/// <param name="width">提示框宽度</param>
/// <param name="height">提示框高度</param>
/// <param name="text">提示信息</param>
/// <returns>当前对象</returns>
/// </summary>
private void SettingWordInfo(int left = 0, int top = 0, int width = 0, int height = 0, string text = null)
{
    Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)this.axFramerControlMain.ActiveDocument;
    Microsoft.Office.Interop.Word.Shape sp = doc.Shapes.AddShape(106,
        (left == 0) ? 100 : left, (top == 0) ? 20 : top, (width == 0) ? 100 : width, (height == 0) ? 30 : height,
        System.Reflection.Missing.Value);
    sp.TextFrame.TextRange.Text = (text == null) ? "提示信息!" : text;
    sp.Shadow.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
    sp.Shadow.OffsetX = 10;
    sp.Shadow.OffsetY = 2;
}

    3、设置显示的格式

1
2
3
4
5
6
7
8
9
10
11
/// <summary>
   /// 1、换行符不显示
   /// 2、设置word格式为web视图格式
   /// </summary>
   private void SettingWord()
   {
       Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)this.axFramerControlMain.ActiveDocument;
       ((Microsoft.Office.Interop.Word.Application)doc.Parent).ActiveWindow.View.ShowSpaces = true;//设置换行符不显示
       ((Microsoft.Office.Interop.Word.Application)doc.Parent).ActiveWindow.View.Type = Microsoft.Office.Interop.Word.WdViewType.wdWebView;//设置为web视图
       RegisterInfo();
   }

    4、在dsoFramer的当前位置插入图片(鼠标所在的位置)

/// <summary>/// /// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void toolStripButtonPic_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "*.png|*.png|*.jpg|*.jpg";if (ofd.ShowDialog() == DialogResult.OK){ImgFilePath = ofd.FileName.ToString();this.axFramerControlMain.Focus();////插入图片//Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)this.axFramerControlMain.ActiveDocument;((Microsoft.Office.Interop.Word.Application)doc.Parent).Selection.InlineShapes.AddPicture(ImgFilePath, false, true,((Microsoft.Office.Interop.Word.Application)doc.Parent).ActiveDocument.Application.Selection.Range);}}

    5、读取当前控件中的表格中的图片信息

/// <summary>/// 获取表格中的所有图片信息/// </summary>public List<string> GetDsoImgList(){if (System.IO.Directory.Exists(Application.StartupPath + "//Imgtemp")){System.IO.Directory.Delete(Application.StartupPath + "//Imgtemp",true);System.IO.Directory.CreateDirectory(Application.StartupPath + "//Imgtemp");}else{System.IO.Directory.CreateDirectory(Application.StartupPath + "//Imgtemp");}List<string> list = new List<string>();Microsoft.Office.Interop.Word.Application WordApp = new Microsoft.Office.Interop.Word.ApplicationClass();object Nothing = System.Reflection.Missing.Value;Microsoft.Office.Interop.Word.Table table = null;Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)this.axFramerControlMain.ActiveDocument;if (doc.Tables.Count == 0){MessageBox.Show("该文档不存在提取信息");}for (int k = 1; k < doc.Tables.Count + 1; k++){table = doc.Tables[k];for (int i = 1; i < table.Rows.Count + 1; i++)//必须从1开始{for (int j = 1; j < table.Columns.Count + 1; j++)//必须从1开始{var bmp = table.Cell(i, j).Range.InlineShapes;if (bmp.Count > 0){foreach (Microsoft.Office.Interop.Word.InlineShape shape in bmp){//判断类型if (shape.Type == Microsoft.Office.Interop.Word.WdInlineShapeType.wdInlineShapePicture){//利用剪贴板保存数据shape.Select(); //选定当前图片((Microsoft.Office.Interop.Word.Application)doc.Parent).Selection.Copy();//复制这个图片string fileName = "";if (Clipboard.ContainsImage()){Bitmap _bmp = new Bitmap(Clipboard.GetImage());fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".png";var name =Application.StartupPath + "//Imgtemp//"+ DateTime.Now.ToString("yyyyMMddHHmmss") + ".png";_bmp.Save(name, System.Drawing.Imaging.ImageFormat.Png);list.Add(name);                        _bmp.Dispose();}}}}}}}return list;}

  OK,代码提示就到这里,但是对于这个,我想真正看了的人都懂的,这个就是"Microsoft.Office.Interop.Word"这个对象调用,然后把dsoFramer的对象直接强转为word对象来操作的,貌似应该瞬间明白了不少吧。

    本人亲测:dsoFramer2.3以上支持office03-13(winfrom、cs方向),WPS完美兼容(winform、cs方向)

    对于用word对象替换文字的时候,要注意word对象的 app.Selection.Find.Replacement.Text的这个属性,超过256个字符长度就会报错,所以呢,需要对字符串处理一下,拆成已256为单位的字符串数据,然后处理。

    友情提示:

    word对象不了解的时候,用"宏",哪里有录制宏,和查看宏,你想要的操作。先录制一段宏出来,然后呢,看看就懂了,那个是VB的代码,但是对象都是一样的,所以我们看的不是代码有多少,而是看的每一步的操作用的那个对象。

    

    友情链接:

    1、DSO(dsoframer)的接口文档
    2、DSOframer 的简单介绍和资源整理(2015-09-02重新整理)

转载于:https://www.cnblogs.com/lhxsoft/p/9146677.html

ActiveX控件dsoFramer的使用(word、excel、PPT)相关推荐

  1. word 删除所有 ActiveX控件,重新启用word自动保存

    背景 最近在学习课程,会用到word记录一些错题,从网页复制到word里,发现会把在线考试的html网页的选择控件也给复制进来,纯文本粘贴又会缺少图片和格式等信息.重点是我在onedrive操作的,自 ...

  2. C# Word控件 dsoframer、office viewer、pageoffice、setparent

    Word Visual Basic for Applications (VBA) 参考 | Microsoft Docs [word界面交互] 1.dsoframer ActiveX控件dsoFram ...

  3. excel不能插入activex控件_办公小技巧:制作更炫酷的Excel下拉菜单

    在Excel中制作下拉菜单,大都是利用数据有效性,再有就是表单控件中的组合框.数据有效性或表单控件组合框制作下拉菜单,快捷.便利.实用.功能很全面,但也有力所不及的地方,比如设置下拉菜单的字体.颜色. ...

  4. activex控件有什么用_你知道怎样用Excel打印「条形码」吗?

    除了专业的条码打印机设备,可以打印条码.其实在Excel中也可以轻松打印各种条形码,而且设置非常简单,下面我们来看看如何用Excel来打印[条形码]? Step1:在Excel选项中将[开发工具]添加 ...

  5. word把对应图片变成嵌入的ActiveX控件。

    刚做一个小东东,做的过程还是走过些弯路,记录一下,客户提出word报表上的图太单调,提出把对应的报表上的图做成如程序里显示的Chart控件一样,能缩放,能做一些数据的转换运算然后显示.最开始我是准备用 ...

  6. 写了一段VBA代码后, Excel每次保存时都弹出警告:”此文档中包含宏、Activex控件、XML扩展包信息“(office 2007)

    前言:今天在写一段VBA代码之后,遇到一个问题, Excel每次保存时就报一个警告(使用的是office 2007): 此文档中包含宏.Activex控件.XML扩展包信息 用起来很不爽! ----- ...

  7. 【办公-Word-VB】Word中VB控制ActiveX控件转换人民币大写并填充-源码带完整注释

    2019.03.15更新:已经将个人做好的完整docm 代码附在文后,先上图. 记录几个开发过程中遇到的难点和注意点. Word中添加ActiveX控件,如输入框,需要放置在  文本框 中,或者放置在 ...

  8. Word ActiveX控件的测试

    Word ActiveX控件的测试 昨天写个了获取Word页面属性内容的控件(参看: ActiveX控件获取Word页面属性内容的实现) ,只是在VS自带的容器中做了个简单的测试.今天,我将把控件加载 ...

  9. EXCEL 表单控件与ACTIVEX控件的区别

    近期,有同事非要在EXCEL里实现复选框显示/隐藏特定数行的功能,在帮助其实现过程中发现,很有必要了解表单控件和ACTIVEX控件的区分. 首先,要记住一个网址:http://www.excelhom ...

  10. 13、ActiveX控件

    基本概念: 可以把ActiveX控件看做是一个极小的服务器应用程序,它不能独立运行,必须嵌入到容器程序中,与容器一起运行.容器应用程序是可以嵌入或链接对象的 应用程序:服务器应用程序是创建对象并且当对 ...

最新文章

  1. 东软java实训第一个项目人力资源管理
  2. 前台使用三元运算符判断显示
  3. POJ 1106 Transmitters(计算几何)
  4. mysql数据库元表_mysql中元数据库information_schema学习之TABLES表
  5. 【深度学习】用 YOLO v5+DeepSORT,打造实时多目标跟踪模型
  6. lavarel php区别,laravel中{{}}和{!! !!}的区别详解
  7. YUI Compressor
  8. 一些思维的碎片(二)
  9. 2013年成都现场赛赛后总结
  10. 计算机辅助三维设计大纲,《电脑辅助三维设计》课程教学大纲.doc
  11. MySQL 数据库备份(完全备份与恢复)
  12. 欧拉汽车,卖“萌”真能行?
  13. 基于easyui的 增 删 改 查
  14. 中介分析(四)- 因果中介分析
  15. 用JS生成声音,实现钢琴演奏
  16. 【深入kotlin】 - 匿名函数、闭包和接收者
  17. 北京大学可视化发展前沿研究生暑期学校Day3
  18. Redis基本概念知识
  19. tinyint(1)与tinyint(3),int(1)与int(3),tiny(1)与int(1)区别
  20. 控制BLDC资料汇总

热门文章

  1. 全网首发:warning: #warning “Using deprecated NumPy API, disable it by “ “#defining NPY_NO_DEPRECATED_API
  2. 同等条件下,杂交水稻是否增产?
  3. 安卓应用改了图标无效,是缓存的问题
  4. Anaconda的下载地址
  5. DeepStream不支持多 RTSP源(多个摄像头)
  6. 全网首发:OPPO推送:服务器端的参考代码,JAVA版
  7. 门描述符gate descriptors
  8. VS C++ 字符串分割 strtok
  9. linux 线程的基本知识
  10. Linux学习(一)——常用命令