根據自己對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在線編輯控件完成了.
引用http://www.cnblogs.com/jisen/archive/2007/07/12/815772.html