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