随笔 - 290  文章 - 10  评论 - 83  2

使用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文件移到其他地方或者改名.

 

posted on 2013-04-12 16:25  Gu  阅读(...)  评论(... 编辑 收藏