使用WPS,把Excel转Pdf所碰到的坑
1. 安装WPS2012 个人版,在项目里引用Com组件Kingsoft.ET2.0 Library,结果提示 出现了无法嵌入互操作类型“……”,请改用适用的接口的错误提示。
解决办法就是:选中项目中引入的dll,鼠标右键,选择属性,把“嵌入互操作类型”设置为False。
然后噼里啪啦直接在aspx.cs页面写了一段代码:
try { object type = System.Reflection.Missing.Value; ET.ApplicationClass application = null; ET.workbook book = null; try { application = new ET.ApplicationClass(); book = (ET.workbook)application.Workbooks.Open(xlspath, type, type, type, type, type, type, type, type, type, type, type, type); book.ExportPdf(pdfpath, "", ""); //this.GetFilePath(path)是获取文件路径+文件名(不含后缀) } catch (Exception ex) { } finally { if (book != null) { book.Close(true, type, type); book = null; } if (application != null) { application.Quit(); application = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); } } catch (Exception ex) { } }
测试了一下,可以生成pdf,这么小case,半个小时就搞定了。。。大功告成,然后上传到服务器,运行时却提示
Retrieving the COM class factory for component with CLSID {45540001-5750-5300-4B49-4E47534F4654} failed due to the following error: 80040154 没有注册类别
但是我在服务器已经安装了WPS2012了,怎么会没有找到com组件呢?
是不是没有权限呢,打开管理工具的组件服务,找到KingSoft SpreadSheet 组件,把启动激活访问权限都加上了。还是不行!
(Kingsoft Spreadsheets Application Class--------应用ID{45540001-5750-5300-4B49-4E47534F4654}
把启动激活访问权限Everyone都加上了,运行此应用程序的账号为启动用户)
是不是IIS的进程池账号权限不够呢? 把进程池账号改成LocalSystem。结果还是不行!
是不是网页调WPS有什么限制呢? 那我写一个WinForm程序(Excel2Pdf.exe)去调WPS,然后用网页Call这个WinForm程序(Excel2Pdf.exe)。三板斧使完,还是不行!
怎么办呢?还是洗洗睡了,明天再说了。。。
第二天,在本地电脑用另一个账号登陆测试,结果发现原来网页在本地能成功转成PDF的,现在换了个账号却不行了。难道是WPS的使用权限是跟账号的?
运行WPS2012的安装程序,它默认的安装路径是C:\User\Administrator\... 我猜想它只是安装在某个账号下,而不是Everyone,在网页上的访问账号和管理员账号是不同的,所以就不能调用了。
卸载掉WPS2012,重新下载一个WPS2010的安装程序,它默认的安装路径是C:\Program Files\KingSoft ..., 这个是安装for Everyone的。用这个安装后,在本地和服务器上都可以成功转PDF
这个坑花了2天时间,只怪WPS2012没有提供一个选项Install for Everyone or Just for me.
------------------------
后记, wps的自动升级功能很坑爹,wps2010会自动升级到最新版本,而最新的wps2013是安装到每个用户目录的.
所以要手动把C:\Program Files\KingSoft\wps\office6\ 下面的有关自动升级的exe文件移到其他地方或者改名.