近来由于工作需要,要求实现一个office文档在线编辑器,和有些office在线编辑控件不同,就是不提供本地文件的操作,而是对指定的远程office文件或远程数据库中的office文件进行操作,然后保存到数据库中。其实个人感觉远程文件的编辑与本地文件的编辑处理方式一样,先把远程office文件或保存到数据库中的office文件下载到本地临时文件夹内,然后进行修改,再上传到服务器这么一个大致过程。这里暂时不讨论有关上传和下载的问题,主要看office文件的在线编辑。
关于office的在线编辑又朋友提示我用FCKedit控件,可是我发现它仅仅是在线编辑普通文本,对visio和ppt文档一点措施都没有,从网上(http://www.dsoframer.com/)找到了一个ActiveX控件dsoframer,一个用C++实现的office控件,决的还不错。就是帮助文件很少,还有以前是免费的,还有源代码,现在好像作者开始收费了,这个具体细节不清楚。言归正传:
1.注册这个dsoframer.ocx控件,
public bool Init()
{
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.向winform中添加该控件
AxDSOFramer.AxFramerControl axFramerControl1 = new AxDSOFramer.AxFramerControl();
this.Controls.Add(axFramerControl1);
axFramerControl1.Dock = System.Windows.Forms.DockStyle.Fill;
至此,运行该程序就可以使用了。
经过初步使用和测试发现dsoframer.ocx的一些问题:
1. 不能加载mdb和pub文件
2. word操作中的打印预览关闭可能导致整个窗口关闭(有时)
3. 不能打开没有初始化过的vsd文件,但可以打开自己创建的vsd文件
4. 操作excel的时候delete键有时候会失灵
5. 只支持打开一个文件,对上一个文件采取关闭不提示保存
6. 控件初始化后的菜单是不能单个进行隐藏,只能统一隐藏菜单栏
但是它给我们返回了一个很重要的信息:它给我们返回了当前操作的文档对象,经过初步测试,可以强制转换为office文档对象
Object myObj = this.axFramerControl1.ActiveDocument;
if(myObj == null)
{
return;
}
//如果当前打开的是word
Word.Document wdoc = (Word.Document)myObj;
我觉得这就给我们留下了很大的空间,我们可以通过wdoc这个对象发布我们自己的事件,添加我们自己的菜单以及菜单事件处理程序,添加工具栏和工具栏事件处理程序。这就告诉我们可以使用VBA开发来操作文档了。
通过这些天使用我们可以得到当前操作的文档对象(我还以自己测试的word文档为例),但是要明确一点,添加菜单不仅仅是针对当前word文档,而是当前机器上的word程序,你可以通过当前文档添加,但添加之后就会一直保存,你随便打开一个本地word文档,菜单都会出现,因此我们在关闭应用程序的时候(或退出的时候)要delete。
//主菜单属于CommandBarPopup类型
//子菜单属于Microsoft.Office.Core.CommandBarButton
Microsoft.Office.Core.CommandBarPopup myMenu;
Object missing = System.Type.Missing;
Microsoft.Office.Core.CommandBarButton myChileMenu;
Word.ApplicationClass myWord = new Word.ApplicationClass();
Microsoft.Office.Core.CommandBar MainMenuBar = myWord.CommandBars.ActiveMenuBar;
Object temp = true;
//添加主菜单
myMenu= (Microsoft.Office.Core.CommandBarPopup)MainMenuBar.Controls.Add(
Microsoft.Office.Core.MsoControlType.msoControlPopup, missing, missing, missing, temp);
myMenu.Caption = "Test(&B)";
myMenu.Visible = true;
myMenu.Tag = Object;
//给主菜单添加子菜单
myChileMenu= (Microsoft.Office.Core.CommandBarButton) myMenu.Controls.Add (Microsoft.Office.Core.MsoControlType.msoControlButton, missing,missing, missing, true);
myChileMenu.Caption = "MessageBox";
myChileMenu.Visible = true;
myChileMenu.Tag = "Test";
//给子菜单添加事件
myChileMenu.Click +=new Microsoft.Office.Core._CommandBarButtonEvents_ClickEventHandler(myChileMenu_Click);
//子菜单的事件处理程序
private void myChileMenu_Click(Microsoft.Office.Core.CommandBarButton Ctrl, ref bool CancelDefault)
{
try
{
MessageBox.Show("菜单事件完成了!");
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在退出应用程序的时候,需要调用自定义菜单的delete(),一般先从子菜单删除,逐级到最高级主菜单,调用删除方法:myChileMenu.delete(true&false);myMenu.delete(false);