zoukankan      html  css  js  c++  java
  • DSO Framer _ WinForm 使用

    根据自己对dsoframer控件的学习,想把dsoframer控件进行简单的包装为C#的usercontrol,大体需要作如下:(创建windows的usercontrol的步骤就不再说了。。。)
    我们暂时不对dso打开网络文件的功能和上传文件功能作过多研究,一来由于我自己不用它提供的这个功能,二来确实觉得它的这方面功能不是很强大而且使用起来比较
    麻烦,呵呵,请见谅!
    1.使用前注册该dsoframer控件,我把该dso控件当作嵌入资源,用学习笔记1中的方法注册即可
      /// <summary>
      /// usercontrol控件初始化
      /// </summary>
      /// <param name="_sFilePath">本地文件全路径</param>
      public void Init(string _sFilePath)
      {
         try
         {
             RegControl();//注册控件
              if(!CheckFile(_sFilePath))//判断是否为所支持的office文件
              {
                   throw new ApplicationException("文件不存在或未标识的文件格式!");
              }
              AddOfficeControl();
              //这里一定要先把dso控件加到界面上才能初始化dso控件,
              //这个dso控件在没有被show出来之前是不能进行初始化操作的,很奇怪为什么作者这样考虑.....
              InitOfficeControl(_sFilePath);
          }
          catch(Exception ex)
          {
             throw ex;
          }
       }

      public bool RegControl()
        {
          try
          {
            Assembly thisExe = Assembly.GetExecutingAssembly();
            System.IO.Stream myS = thisExe.GetManifestResourceStream("NameSpaceName.dsoframer.ocx");
       
            string sPath = “该ocx文件的实际路径”+ @"/dsoframer.ocx";
            ProcessStartInfo psi = new ProcessStartInfo("regsvr32","/s " +sPath);
            Process.Start(psi);
          }
          catch(Exception ex)
          {
            MessageBox.Show(ex.Message);
          }
         return true;
        }

    2.动态向usercontrol添加dsoframer实例
      private AxDSOFramer.AxFramerControl m_axFramerControl = new AxDSOFramer.AxFramerControl();
      /// <summary>
      /// 添加控件
      /// </summary>
      private void AddOfficeControl()
      {
       try
       {
        this.m_Panel_Control.Controls.Add(m_axFramerControl);
        m_axFramerControl.Dock = DockStyle.Fill;
       }
       catch(Exception ex)
       {
        throw ex;
       }
      }
    3.初始化dsoframer控件 ,我这里用已经有的文件进行dso初始化,
      /// <summary>
      /// 初始化office控件
      /// </summary>
      /// <param name="_sFilePath">本地文档路径</param>
      private void InitOfficeControl(string _sFilePath)
      {
       try
       {
        if(m_axFramerControl == null)
        {
         throw new ApplicationException("请先初始化office控件对象!");
        }
        


        //this.m_axFramerControl.SetMenuDisplay(48);
        //这个方法很特别,一个组合菜单控制方法,我还没有找到参数的规律,有兴趣的朋友可以研究一下
        string sExt = System.IO.Path.GetExtension(_sFilePath).Replace(".","");
        //this.m_axFramerControl.CreateNew(this.LoadOpenFileType(sExt));//创建新的文件
        this.m_axFramerControl.Open(_sFilePath,false,this.LoadOpenFileType(sExt),"","");//打开文件
        //隐藏标题
        this.m_axFramerControl.Titlebar = false;
       }
       catch(Exception ex)
       {
        throw ex;
       }
      }

         下面这个方法是dso打开文件时需要的一个参数,代表office文件类型
      /// <summary>
      /// 根据后缀名得到打开方式
      /// </summary>
      /// <param name="_sExten"></param>
      /// <returns></returns>
      private string LoadOpenFileType(string _sExten)
      {
       try
       {
        string sOpenType = "";
        switch (_sExten.ToLower())
        {
         case "xls":
          sOpenType = "Excel.Sheet";
          break;
         case "doc":
          sOpenType = "Word.Document";
          break;
         case "ppt":
          sOpenType = "PowerPoint.Show";
          break;
         case "vsd":
          sOpenType = "Visio.Drawing";
          break;
         default:
          sOpenType = "Word.Document";
          break;
        }
        return sOpenType;

       }
       catch (Exception ex)
       {
        throw ex;
       }
      }

    4.我觉的最重要的一步,就是公布dso当前的活动对象,因为自己做这个usercontrol功能不强,但是不能把人家dso功能给杀掉,给使用者留一个更大的空间。。。。
      /// <summary>
      /// 获取当前操作的文档
      /// </summary>
      public object ActiveDocument
      {
       get
       {
        return this.m_axFramerControl.ActiveDocument;
       }
      }

      /// <summary>
      /// 获取当前控件对象
      /// </summary>
      public AxDSOFramer.AxFramerControl OfficeObject
      {
       get
       {
        return this.m_axFramerControl;
       }
      }
    5.公布了一些简单的excel和word操作方法,
      #region public word method,这几个方法只对word文档有效

      /// <summary>
      /// 设置保留修改痕迹(可以通过word工具栏的审批修改,此方法仅仅是提供初始化)
      /// 这个方法挺好,可以模拟键盘按键,很巧啊.(以前很长时间都不知道可以这样...)
      /// </summary>
      /// <param name="_bIs"></param>
      public void WordSetSaveTrace()
      

      /// <summary>
      /// 替换标签下
      /// </summary>
      /// <param name="_sMark"></param>
      /// <param name="_sReplaceText"></param>
      /// <param name="_IsD">替换后是否突出显示</param>
      /// <returns></returns>
      public bool WordReplace(string _sMark,string _sReplaceText,bool _IsD)
      

      /// <summary>
      /// 文本替换
      /// </summary>
      /// <param name="_sOrialText"></param>
      /// <param name="_sReplaceText"></param>
      /// <returns></returns>
      public bool WordReplace(string _sOrialText,string _sReplaceText)
      

      #endregion

      #region public excel method

      /// <summary>
      /// 向固定位置填值
      /// </summary>
      /// <param name="_sValue">填写内容</param>
      /// <param name="_iBeginRow">开始行</param>
      /// <param name="_iBeginCol">开始列</param>
      public void ExcelFillValue(string _sValue,int _iBeginRow,int _iBeginCol)
      

      /// <summary>
      /// 向固定位置填值
      /// </summary>
      /// <param name="_sValue">填写对象</param>
      /// <param name="_iBeginRow">开始行</param>
      /// <param name="_iBeginCol">开始列</param>
      public void ExcelFillValue(Object _sValue,int _iBeginRow,int _iBeginCol)
      

      /// <summary>
      /// 向固定位置填值
      /// </summary>
      /// <param name="_ds">填写内容</param>
      /// <param name="_iBeginRow">开始行</param>
      /// <param name="_iBeginCol">开始列</param>
      public void ExcelFillValue(System.Data.DataSet _ds,int _iBeginRow,int _iBeginCol,bool _IsTitle)
      

      /// <summary>
      /// 清空excel文档
      /// </summary>
      public void ExcelClear()
      

      /// <summary>
      /// 清空固定位置的内容
      /// </summary>
      /// <param name="_iBeginRow">开始行</param>
      /// <param name="_iBeginCol">开始列</param>
      public void ExcelClear(int _iBeginRow,int _iBeginCol)
      

      /// <summary>
      /// 清空指定区域的内容
      /// </summary>
      /// <param name="_iBeginRow">开始行</param>
      /// <param name="_iBeginCol">开始列</param>
      /// <param name="_iEndRow">结束行</param>
      /// <param name="_iEndCol">结束列</param>
      public void ExcelClear(int _iBeginRow,int _iBeginCol,int _iEndRow,int _iEndCol)
      
      #endregion
        以上这些都是对excel和word文档操作的小儿科,害怕贴出来各位大虾见笑,不敢贴了.....

    6.公布一些简单的方法(保存和另存为方法是防止菜单和工具栏被隐藏的情况下不能保存),这类应该有很多方法,我目前只用了这些个所以....
      /// <summary>
      /// 保存
      /// </summary>
      public void Save()
      {
       try
       {
        //先保存
        this.m_axFramerControl.Save(true,true,"","");
       }
       catch(Exception ex)
       {
        throw ex;
       }
      }


      /// <summary>
      /// 另存为
      /// </summary>
      public void SaveAs()
      {
       try
       {
        //另存为
        SaveFileDialog sfd = new SaveFileDialog();
        string sExt = System.IO.Path.GetExtension(this.m_sFilePath).Replace(".","");
        sfd.Filter = sExt;
        if(sfd.ShowDialog() == DialogResult.OK)
        {
         string sSavePath = sfd.FileName;
         if(System.IO.File.Exists(sSavePath))
         {
          System.IO.File.Delete(sSavePath);
         }
         this.m_axFramerControl.SaveAs(sSavePath,this.LoadOpenFileType(sExt));
        }
       }
       catch(Exception ex)
       {
        throw ex;
       }
      }

      /// <summary>
      /// 关闭当前界面
      /// </summary>
      public void Close()
      {
       try
       {
        if(this.m_axFramerControl != null)
        {
         this.m_axFramerControl.Close();
        }
       }
       catch(Exception ex)
       {
        throw ex;
       }
      }

    最后如果想把该dso控件的注册去掉也可以,因为我没有办法得到该控件是否在机器上注册过,所以每次初始化都要注册,不知道园子里的各位朋友有没有办法检测,还请赐教?

    好了,一个简单的可以用于windows程序的office在线编辑控件完成了.

    文章转载于:
    作者: jisen
    http://www.cnblogs.com/jisen/archive/2007/07/12/815772.html

  • 相关阅读:
    高级(线性)素数筛
    Dijkstra(迪杰斯特拉)算法
    简单素数筛
    【解题报告】 POJ1958 奇怪的汉诺塔(Strange Tower of Hanoi)
    4 jQuery Chatting Plugins | jQuery UI Chatbox Plugin Examples Like Facebook, Gmail
    Web User Control Collection data is not storing
    How to turn on IE9 Compatibility View programmatically in Javascript
    从Javascrip 脚本中执行.exe 文件
    HtmlEditorExtender Ajax
    GRIDVIEW模板中查找控件的方式JAVASCRIPT
  • 原文地址:https://www.cnblogs.com/star8521/p/4749899.html
Copyright © 2011-2022 走看看