根據本身對dsoframer控件的學習,想把dsoframer控件進行簡單的包裝爲C#的usercontrol,大致須要做以下:(建立windows的usercontrol的步驟就再也不說了。。。)
咱們暫時不對dso打開網絡文件的功能和上傳文件功能做過多研究,一來因爲我本身不用它提供的這個功能,二來確實以爲它的這方面功能不是很強大並且使用起來比較
麻煩,呵呵,請見諒!
1.使用前註冊該dsoframer控件,我把該dso控件看成嵌入資源,用學習筆記1中的方法註冊便可html
/// <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實例windows
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.公佈一些簡單的方法(保存和另存爲方法是防止菜單和工具欄被隱藏的狀況下不能保存),這類應該有不少方法,我目前只用了這些個因此....this
/// <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控件的註冊去掉也能夠,由於我沒有辦法獲得該控件是否在機器上註冊過,因此每次初始化都要註冊,不知道園子裏的各位朋友有沒有辦法檢測,還請賜教?spa
好了,一個簡單的能夠用於windows程序的office在線編輯控件完成了.excel
引用http://www.cnblogs.com/jisen/archive/2007/07/12/815772.htmlcode