[Office | Excel | IIS] 筆記備忘-佈署在IIS上的Excel自動化程式,再主機帳戶未登入桌面前無法使用之處理方法(PageSetup與印表機Printer問題)

這個問題處理了很久,前些日子撰寫的浮水印程式,在佈署至IIS上時,一切都工作正常,但是到了最後一步,在不使用帳號登入電腦時,浮水印程式,而且還是只有Excel會出錯。

錯誤卡在要把產生好的浮水印圖片,從頁首頁尾插入的區塊失敗了!

更妙的是,同樣是頁首頁尾的插入,但是Word卻順利的完成了工作?!

究竟是怎麼回事..


此篇文章便要解說出錯的原因,以及解決方法。

前言

 


 

(標題好難命名....)

這個問題處理了很久,前些日子撰寫的浮水印程式,在佈署至IIS上時,一切都工作正常,但是到了最後一步,在不使用帳號登入電腦時,浮水印程式,而且還是只有Excel會出錯。

錯誤卡在要把產生好的浮水印圖片,從頁首頁尾插入的區塊失敗了!

更妙的是,同樣是頁首頁尾的插入,但是Word卻順利的完成了工作?!

究竟是怎麼回事..

 

此篇文章便要解說出錯的原因,以及解決方法。

 

出錯的原因-Excel的版面配置(PageSetup)與印表機

 


 

如前言所說,一般來看,如果是佈署在IIS上的Web服務,照理來說,即便在未登入桌面,沒有選擇任一帳戶登入時也要可以正常運作,原因在於,我們使用的是IIS的執行帳戶,IIS帳戶不需要登入即可運作。

而Excel與Word可以有自動化處理的效果,但為何Excel在處理浮水印時卻失敗了,而Word卻正常呢?

當時出錯的訊息如下:

 


 

Put_Watermark_On_HeaderFooter_ErrorSystem.Runtime.InteropServices.COMException (0x800A03EC): 發生例外狀況於 HRESULT: 0x800A03EC

於 System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)

於 Microsoft.Office.Interop.Excel.PageSetup.set_ScaleWithDocHeaderFooter(Boolean value)

於 WatermarkExcelAddIn.ThisAddIn.InsertWatermarkForPrintToHeader(PageSetup currentSheetPageSetup, String excelTileTextPrintWatermarkFullFileName)

 


 

此錯誤區塊是在我打算設定版面配置中,頁首頁尾的縮放比例,是否會維持原插入的物件比例,還是隨著Excel的版面配置比例跟著調整。

因此,依照研判是出在Excel的版面配置功能,在程式中,便是PageSetup這個物件!

而經過後來的尋找與佐證,在官方的疑難排解文章中,找了了一些訊息:

 


 

標題寫著-如果已不安裝任何印表機,您無法在 Excel 中使用版面設定屬性

當您執行巨集,嘗試設定或取得在 Microsoft Excel 活頁簿中的任何工作表的頁面設定內容的 Microsoft Visual Basic for Applications 時,您可能會收到下列錯誤訊息之一:

執行階段錯誤 '1004': 無法設定 PageSetup 類別的 [ x ] 屬性

注意在這些訊息中, x是任何下列文字:

   BlackAndWhite        Order
   BottomMargin         Orientation
   CenterFooter         PaperSize
   CenterHeader         PrintArea
   CenterHorizontally   PrintComments
   CenterVertically     PrintGridlines
   ChartSize            PrintHeadings
   Draft                PrintNotes
   FirstPageNumber      PrintQuality
   FitToPagesTall       PrintTitleColumns
   FitToPagesWide       PrintTitleRows
   FooterMargin         RightFooter
   HeaderMargin         RightHeader
   LeftFooter           RightMargin
   LeftHeader           TopMargin
   LeftMargin           Zoom

 


 

 

從上述來看,雖然是VBA,但都是Office,雖然滿訝異的是,原來沒有安裝印表機,竟然會無法使用版面配置,但是我當下有安裝,怎麼會無法使用?

其實,在沒有登入帳戶至桌面的情況下,是抓不到預設印表機的,或許PageSetup的底層會使用到印表機的API`,所以才會出現這個錯誤,並且結果顯示,也正好錯在版面配置中,

 

那麼為何,Word卻沒有這個問題呢? 於是乎再次發現一些疑難排解的文章,雖然沒有直接提出原因,但是卻有擦到一些邊:

1. 列印 Word 文件時,會忽略印表機設定

2. WD97: 範本版面配置的變更在 Word 中開啟時

並且在第二篇內文中有提到:不像舊版本的 Microsoft Word,Word 97 不依賴印表機資訊 (矩陣方式) 來配置文件。Word 97 使用新的獨立於印表機的版面配置…

 

於是才會推測,Word的版面設定,與印表機是分離的,再次思考了一下,Maybe是如此的關係,所以在Word可以取得紙張大小的寬與高,而Excel卻無法?

因此Word不須擔心此問題,而Excel因為印表機在帳戶未登入桌面前,感測不到預設印表機,因此插入浮水印至頁首頁尾(版面設定物件的屬性功能)失敗。

 

解決方法

 


 

那麼我們該如何解決呢?這類型的設定,我們需要到Registry 註冊表中設定。

因此,於執行下 regedit 開啟。

尋找至


HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\Windows]

並手動設定預設印表機


"UserSelectedDefault"=dword:00000000

"Device"=" Microsoft XPS Document Writer,winspool,nul:"

 

上述的Device可以自行修改,這邊以XPS為例。

 

或是直接把下列的機碼製作成.reg檔案直接註冊亦可。


Windows Registry Editor Version 5.00

[HKEY_USERS\S-1-5-18\Software\Microsoft\Windows NT\CurrentVersion\Windows]

"UserSelectedDefault"=dword:00000000

"Device"=" Microsoft XPS Document Writer,winspool,nul:"

 

最後,重新開機即可!

 

參考資料

1. 列印 Word 文件時,會忽略印表機設定

2. WD97: 範本版面配置的變更在 Word 中開啟時

3.如果已不安裝任何印表機,您無法在 Excel 中使用版面設定屬性

4.ExportAsFixedFormat with Excel fails

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝