Office集成到网页

        前几天,帮朋友写一个程序,里面需要用到在网页上浏览office文档的功能。在网页上浏览Office是一个很鸡肋的东西,在我看来完全没必要,将office直接放文件夹下浏览也比在网页上显示来的舒服,或者使用类似Google Doc这种在线office。无奈。。。这就是他的需求。本来打算使用类似Google Doc这种在线Office的方式来实现,google了n久也没有好的解决方案或者现成的东西,看来此路不通。换种思路,使用ie里插件的形式游览,类似以前在线web编辑器,结果这也不是朋友需要的,因为他希望能够支持直接将office中的内容Copy到网页上,如果使用在线web编辑器,虽然可以将word里的内容在格式基本不改变的情况下copy到网页里,但如果word中有图片,这会很悲剧。。。copy过来显示在网页上的图片将保存是的本地路径,难道要写自动上传插件?显然难度非常大,时间不允许。好吧,只能找IE插件了,网上类似的插件很多,但功能各异,找到一个适合快速使用的,还真有点折腾,在试用了dsoframer, weboffice, ntkooffice之后,决定使用ntkoffice。dsoframer是微软提供的控件,免费开源,但在线保存支持不是很好。weboffice是国内一家公司的开发的插件,使用也很方便,但有一点,就是该插件永远显示页面最前面把其他html元素给遮挡,不管我用iframe还是改变该控件的大小为1,或者其他任何我能想的到的方法,我也无法处理好与层之前的关系,放弃之。只有最后一个ntkooffice控件了,这货也不是什么好东西,首先要钱,其次对office2007的支持比较差,如果保存成office2007格式(openxml),在该插件里打开、编辑都没问题,但如果直接用office打开文件就出错。官方给出的解决办法是使用office2003的文档,也就是说如果是新建一个空白文档,从服务器给他返回一个office2003的文档,这样在保存的时候就会用2003的格式。项目里面还需要对office进行操作,比如合并word,把word里面的内存抽出来生成excel表。如果保存为office2007,直接使用openxml的库就可以对文档进行操作,但现在为了兼容本地文档,使用了2003的格式,有什么办法去操作么?找了一些库,像catdoc,xls2csv之类的,编码问题没有解决,折腾了许久,在插件里找到一个保存直接保存成txt的接口,哎~~得来全部费工夫。。。。关于合并word文档,使用office的com接口进行操作,在python下实现非常简单,使用pywin32库,类似于下面几行代码就搞定:

word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = 0
output = word.Documents.Add()
# 如果office被其他进程打开,或者插件打开,这里返回null
output.Application.Selection.Range.InsertFile(abspath(path))
output.SaveAs(abspath(doc_path))
output.Close()
word.Quit()

示例搞定了,以为集成到项目里会很快解决问题,结果。。。发现如果在网页上用插件打开office或者已经有office文档被打开(进程winword.exe),上述代码就会出现问题,要么获取不到Document,要么就是等待。这个问题折腾了很长时间,实在没办法,就折中一下,如果有其他进程打开了office,如果有winword.exe这个进程,就提示用户先关闭,再使用。

好了,原来以为所有的技术问题都解决了吧,问题又来了。把代码打包成exe的时候,发现一个奇怪的问题。。。

为了让搜索引擎能搜到,给其他遇到相同问题同学提供一些信息,把错误信息copy出来

 Traceback (most recent call last):

  File "tornado\web.pyo", line 1346, in _when_complete

  File "tornado\web.pyo", line 1367, in _execute_method

  File "basehandler.pyo", line 49, in post

  File "basehandler.pyo", line 43, in _call

  File "handler.pyo", line 128, in export_word

  File "win32com\client\gencache.pyo", line 540, in EnsureDispatch

  File "win32com\client\CLSIDToClass.pyo", line 46, in GetClass

KeyError: '{00020970-0000-0000-C000-000000000046}'

直接用源码运行没有问题,打包成exe就出现这个问题,麻烦了。。。google了好几个小时,疯了的节奏,终端找到方法:

 py2exe打包的代码中,添加该选项:0,8,4意思就是说使用office2007。

 options = {"py2exe": {

        "typelibs": [('{00020905-0000-0000-C000-000000000046}', 0, 8, 4)],

}

实在是折腾。。。在ie中测试通过,但部署到目标机器上,又出问题,发现有些jquery插件,在ie下不同版本中,有几个版本不能工作,。。。。疯了。。。。你妹。。。最讨厌ie,但因为要显示office,只能使用ie,哎~~~


标签: none

    1. 这个如果用flash实现,兼容性就好很多,目前在线文档大多用flash实现,例如可以把word文档转pdf让as3直读


    Validate Code