之前,我曾经写过一篇叫“在IE里打开,浏览PPT时出现下载框的简单方法”,不过经园子里sharper,JoeLee,Sapphire 等前辈大侠的提醒和批评才发现自己犯了一个低级错误,那个方法也只是实现在ie打开ppt文件,并将其最大化,使用浏览模式屏蔽出现的下载对话框而已,确实也没什么大作用,一旦客户端不装office powerpoint也就打不开了。


   于是我把那篇文章删掉了,自己在网上找相关的解决方法,还是没什么新的发现,也没发现可以使用的支持在ie浏览ppt的ActiveX插件,再说ie对Activex插件好像有安全级别限制,也不怎么合适。

  
   在网上也看到在ie打开浏览office文档的一个方法,摘录于此,文章地址是http://blog.joycode.com/kaneboy/archive/2004/11/03/37889.aspx

    有朋友询问如何在Web页面上做到像SharePoint中的效果一样,能直接激活客户端的Word来打开.doc文件,而不是类似直接点击.doc文档链接时Word在IE中被打开那样。想想这个问题应该很多人都会感兴趣,所以干脆写一篇blog来大致描述一下方法。

在安装Office2003以后,有一个ActiveX控件被安装到了系统中,这个控件位于“Program Files\Microsoft Office\OFFICE11\owssupp.dll”。通过这个控件,客户端页面上的JavaScript就可以激活本地的Office软件,来实现打开、编辑Office文档。(另,Office XP应该就已经包含这个ActiveX控件了。)

    首先,用Script创建一个本地的对象:

openDocObj = new ActiveXObject("SharePoint.OpenDocuments.2"); // 为了兼容Office XP,可以创建“SharePoint.OpenDocuments.1”

    然后,调用openDocObj的相应的方法。比如打开服务器上的一个Office文档:

openDocObj.ViewDocument("http://www.abc.com/documents/sample.doc");

openDocObj对象会根据参数中不同的Office文档类型(.doc、.xls、.ppt)来打开不同的程序(Word、Excel、PowerPoint)。ViewDocument()方法还有一个重载签名,可以让我们手工指定激活哪个程序来打开文档:

openDocObj.ViewDocument("http://www.abc.com/documents/sample.doc", 要激活的程序的ProgID);

    那么要打开Office程序在线编辑文件又如何?

openDocObj.EditDocument("http://www.abc.com/documents/sample.doc");

    就可以直接激活Word,在Word里面编辑文档,然后直接点击Word里面的保存功能,就可以将文件保存会服务器上了。注意:为了让Word能将编辑后的文档直接保存会服务器,访问Web站点的当前上下文的Windows Identity必须对服务器的相应目录(即“http://www.abc.com/documents”这个虚拟目录所对应的服务器上的物理路径)有相应的写权限,否则保存动作会失败。编辑完成后,EditDocument()会返回一个bool值,来反映编辑操作是否成功。

    我们还可以通过打开服务器上的一个文档模版,来创建一个新的文档:

openDocObj.CreateNewDocument("http://www.abc.com/documents/sampleTemplate.dot", "http://www.abc.com/documents/");

    就可以使用“http://www.abc.com/documents/sampleTemplate.dot”这个模版来创建一个新的文档,默认新文档的保存地点是“http://www.abc.com/documents/”。创建新文档时使用的程序取决于模版文件的类型(比如.dot模版会对应Word)。新文档的保存同样需要注意权限问题。CreateNewDocument()方法同样会返回一个bool值来反映操作是否成功。

    CreateNewDocument()方法的第一个参数,除了可以使用一个模版的地址外,还可以直接指定为希望用来创建新文档的客户端程序的ProgID。


   不过,也是需要客户端安装ms office.

   后来想到使用word时可以把doc另存为网页,我想ppt文档应该也支持这个功能,但是如果每次都手工转也太烦了,于是就通过写一个转换ppt为html的类来实现,在每次上传后或前用这个类实现将ppt转换为html文件。


   以下是具体的实现类:


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office;
using Microsoft.Office.Interop.PowerPoint;
namespace PPTtoHtml
{
    public class ConvertPowerPoint
    {
        private Microsoft.Office.Interop.PowerPoint.Application ppt;
        ///
        /// 指向具体的文件;
        ///
        private Microsoft.Office.Interop.PowerPoint.Presentation pptFile;
        private string _HtmlFileName;

        /// <summary>
        /// 另存为的HTML文件的文件路径
        /// </summary>
        public string HtmlFileName
        {
            set
            {
                _HtmlFileName = value;
            }
        }


        public ConvertPowerPoint()
        {
            ppt = new Application();
        }

  
        /// <summary>
        /// 转换过程
        /// </summary>
        /// <param name="pptFileName"> 欲转换的PowerPoint文件名称</param>
        public void Convert(string pptFileName)
        {

            pptFile = ppt.Presentations.Open(pptFileName, Microsoft.Office.Core.MsoTriState.msoTrue, Microsoft.Office.Core.MsoTriState.msoCTrue,
                Microsoft.Office.Core.MsoTriState.msoFalse);

            pptFile.SaveAs(_HtmlFileName, Microsoft.Office.Interop.PowerPoint.PpSaveAsFileType.ppSaveAsHTML, Microsoft.Office.Core.MsoTriState.msoCTrue);
            pptFile.Close();

        }
    }
}

   以下是转换后的html截图:

  
    经vs2005测试通过,当然这个方法只是个替代方案而已,在我没找到更好的方法之前,暂时先使用,方便那些没有装office powerpoint的用户直接在浏览器上浏览我们提供的ppt,同时也提供相应的ppt文件供有安装powerpoint的或有需要的用户自己下载使用。

    同时,如果您有更有效的,也欢迎您不吝赐教!


  

Posted on 2007-11-24 19:32 Enzo 阅读(2195) 评论(21)  编辑 收藏 所属分类: Dev Logs

Feedback

#1楼    回复  引用    

2007-11-24 19:52 by fx919 [未注册用户]
那你怎么实现上传到网站呢?
你这种方法只是另存为一个html文件再上传,岂不是客户端机器上还要多产生一个文件?请问,lz是采用怎样的方法解决这个问题的?谢谢

#2楼 [楼主]   回复  引用  查看    

2007-11-24 19:59 by Enzo      
@fx919
客户端浏览时肯定要访问这个网页,这和访问相同的html文件一样要下载,但总比让没装ms office powerpoint的用户安装好ppt,再来查看吧。

而至于你要选择在上传前转换后上传后转换,这取决于你的需要,不过我自己觉得是先转换再上传比较好!

#3楼    回复  引用  查看    

2007-11-24 20:22 by 自由、创新、研究、探索……      
可以有更好的方案,就是使用SharePoint所带的一个组件HTMLVIEW,这样客户端就不需要office也可以的。有空我整理了发上来

#4楼 [楼主]   回复  引用  查看    

2007-11-24 20:30 by Enzo      
@自由、创新、研究、探索……
恩 谢谢 期待.....
o(∩_∩)o...

#5楼    回复  引用    

2007-11-24 20:33 by Benjamin Li [未注册用户]
兄台,不妨试试http://doc.google.com,现在支持PPT了。
:)

#6楼    回复  引用    

2007-11-24 20:48 by g不错 [未注册用户]
google 真牛!

#7楼    回复  引用    

2007-11-25 00:11 by Sapphire [未注册用户]
呵呵。。。虽然客户会有这样的需求,不过我个人非常讨厌这样的需求,感觉他们多一乱,所以这种问题就没有深究过。。都是公司里别的同事费脑子去了。。。
等啥时候有个更成熟稳定灵活性强的解决方案了。。记得再放首页上,我就直接站巨人的磕膝盖上拉~

#8楼    回复  引用    

2007-11-25 00:19 by 无名1 [未注册用户]
大侠,转走了哈

#9楼    回复  引用    

2007-11-25 09:24 by ikiki [未注册用户]
代替方法 只是暂时使用而已吧!

#10楼 [楼主]   回复  引用  查看    

2007-11-25 09:37 by Enzo      
@ikiki
恩 暂时代替而已,毕竟和直接在ie浏览ppt不一样。

#11楼 [楼主]   回复  引用  查看    

2007-11-25 12:59 by Enzo      
@Benjamin Li
谢谢 你提供的这个信息

我刚测试过,测试客户端不装ppt也可以,效果还不赖;
不过好像要像gmail那样邀请才能共享给其他人,还可以设置他人的对这个文件的操作权限,是只浏览还是还有编辑权限。确实不错!

看来也是个解决方案。

o(∩_∩)o...

不知道以后的趋势是ms收购google,还是google收购ms
;当然纯属猜测或许不会发生也不一定。

o(∩_∩)o...

#12楼    回复  引用    

2007-11-25 13:49 by who konws? [未注册用户]
God Knows!
hehe!

#13楼    回复  引用  查看    

2007-11-25 14:08 by 布尔      
目前看来还是搞个插件比较合适

#14楼    回复  引用    

2007-11-25 18:23 by Hand [未注册用户]
楼主,我刚才试了一下你所说的openDocObj.EditDocument("http://www.abc.com/documents/sample.doc");函数,当我修改好按保存后,文件并不能保存在服务器中,只能保存在客户端中,点解呢??

#15楼    回复  引用    

2007-11-25 18:44 by iDo [未注册用户]
@Hand
你没看认真哦。
首先那个不是lz写的,他在网上找到的方法,并用了那个做了测试,没达到他想要的结果。
其二,你是否有看到诊断文字:

就可以直接激活Word,在Word里面编辑文档,然后直接点击Word里面的保存功能,就可以将文件保存会服务器上了。注意:为了让Word能将编辑后的文档直接保存会服务器,访问Web站点的当前上下文的Windows Identity必须对服务器的相应目录(即“http://www.abc.com/documents”这个虚拟目录所对应的服务器上的物理路径)有相应的写权限,否则保存动作会失败。编辑完成后,EditDocument()会返回一个bool值,来反映编辑操作是否成功。

#16楼 [楼主]   回复  引用  查看    

2007-11-25 19:27 by Enzo      
@iDo
谢谢你的回答 o(∩_∩)o...

#17楼    回复  引用    

2007-11-26 09:14 by 恋 [未注册用户]
不错
不错
继续努力
嘿嘿`

#18楼    回复  引用    

2007-11-26 17:00 by bbtj [未注册用户]
请问, SaveAs方法可以直接将文档另存到网络路径吗?

#19楼    回复  引用    

2007-11-26 18:32 by isolo [未注册用户]
应该可以!

#20楼    回复  引用    

2007-11-26 18:50 by kinger [未注册用户]
只要你有写的权限

#21楼 [楼主]   回复  引用  查看    

2007-11-26 19:04 by Enzo      

@bbtj
En 可以的。
只要你的登陆帐号有权限

不过你可以你转换再上传。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-25 19:51 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: