[Office | Excel | C#] Excel浮水印系列(4)-如何使頁首頁尾的圖片浮水印不會受到縮放比例(Pagesetup Zoom Scale Ratio)影響

  • 2886
  • 0
  • C#
  • 2015-02-18

在Excel中的版面設定可以對紙張大小的比例縮放,做進一步的設定,有時為了使列印出來或是轉為PDF時,一頁可以塞下足夠多的表格或,甚至是所有的表格,會修改比例縮放,甚至是改為符合「N頁寬M頁高」
但是這樣的情況會使插入的圖片也跟著調整比例,而無法維持原先期望的版面大小
因此會期望可以使圖片的大小不受到「縮放比例」與[N頁寬M頁高」的影響,但是要從哪裡下手呢?

本篇也是很簡單的告訴你使用哪種API功能解決。

前言

 


 

在Excel中的版面設定可以對紙張大小的比例縮放,做進一步的設定,有時為了使列印出來或是轉為PDF時,一頁可以塞下足夠多的表格或,甚至是所有的表格,會修改比例縮放,甚至是改為符合「N頁寬M頁高」,如下圖:

但是這樣的情況會使插入的圖片也跟著調整比例,而無法維持原先期望的版面大小,如下:

浮水印error

 

因此會期望可以使圖片的大小不受到「縮放比例」與[N頁寬M頁高」的影響,但是要從哪裡下手呢?

本篇也是很簡單的告訴你使用哪種API功能解決。

 

解決方法

 


 

當我們對Excel的版面配置設定為不使用縮放比例,而是,就程式中來說其實是(這邊以1頁寬1頁高為例):


currentSheetPageSetup.Zoom = false;
currentSheetPageSetup.FitToPagesWide = 1;
currentSheetPageSetup.FitToPagesTall = 1;

 

 
然後此時很神奇的,原先預設為縮放比例100%的數值會自動修改成符合1頁寬1頁高的縮放比例,如下圖調為34%:(依據表格與紙張類型,會改變,所以不一定是34%)
 
但是透過程式是取得不到縮放後的比例(但如果使如一般操作Excel,在版面配置如上看的到)...
因此後來我打算對Zoom屬性作指定,但是發現Zoom屬性是dynamic型態...就算可以先透過檢查型態來知道為N頁寬M頁高,但仍然不知切換後,被調整的縮放比例是多少。
 
而在MSDN中提到,如果要調整回縮放比例,要直接給予數值(10 - 400 ),否則就是給予false表示切換為N頁寬M頁高,之所以做一般的Excel操作可以看的到,代表他是另外計算的,API不包含在裡面不然就是不開放,因此在這邊鬼打牆很久...

最後才發現原來對Pagesetup的ScaleWithDocHeaderFooter設為false,就可以解決上述所有問題了!@@

如下:


currentSheetPageSetup.ScaleWithDocHeaderFooter = false;
//第一頁頁首
 if (currentSheetPageSetup.DifferentFirstPageHeaderFooter)
{
                   currentSheetPageSetup.FirstPage.LeftHeader.Picture.Filename = excelTileTextPrintWatermarkFullFileName;
                   currentSheetPageSetup.FirstPage.LeftHeader.Picture.LockAspectRatio = Office.MsoTriState.msoTrue;
                   currentSheetPageSetup.FirstPage.LeftHeader.Text = "&G";
}
//奇偶頁首
if (currentSheetPageSetup.OddAndEvenPagesHeaderFooter)
 {
                   currentSheetPageSetup.EvenPage.LeftHeader.Picture.Filename = excelTileTextPrintWatermarkFullFileName;
                   currentSheetPageSetup.EvenPage.LeftHeader.Picture.LockAspectRatio = Office.MsoTriState.msoTrue;
                   currentSheetPageSetup.EvenPage.LeftHeader.Text = "&G";
}
//一般頁首
currentSheetPageSetup.LeftHeaderPicture.Filename = excelTileTextPrintWatermarkFullFileName;
currentSheetPageSetup.LeftHeaderPicture.LockAspectRatio = Office.MsoTriState.msoTrue;
currentSheetPageSetup.LeftHeader = "&G";

 

結果呈現:

Excel浮水印

 

注意事項

 


 

1. 雖然此方法可以產生滿版的浮水印或是圖片,但是前提是電腦的控制台->字型->字型大小是預設大小(一般為小),如果有更動過,則在插入圖片或浮水印時,仍然會因為系統的環境變化,使圖片做整體縮放(如下圖),此問題在Word也會出現。

 

2. 新版的Word Excel檔案格式 docx與xlsx會保留產生圖片或浮水印時的縮放比例,因此今天檔案若是到了有調整過電腦字型大小的不同台主機上,會維持原先比例;但很妙的是舊格式xls則又會依據此主機的字型大小,會再次做調整,但如果是doc則跟docx一樣不會。

 

這邊就來舉例一下Excel的情境,如下:

(1.) 產生浮水印或圖片之電腦的字型為小的環境下,產生xlsx檔案,此時浮水印的圖片會滿版(假設800 * 1200) ,跑到字型為大的電腦,仍可以維持原大小

 

(2.) 產生浮水印或圖片之電腦的字型為小的環境下,產生xls檔案,此時浮水印的圖片也會滿版,因為產生浮水印的電腦環境依樣(假設800 * 1200) ,跑到字型為大的電腦便會跑掉

 

(3.) 產生浮水印或圖片之電腦的字型為中的環境下,產生xlsx檔案,此時浮水印的圖片因為跟電腦預設的環境字型大小不同,變會跑版(會變小假設為640 * 480), 如果處理好的檔案,來到字型為小或是大的電腦,還是樣大小,因為是xlsx字型

 

(4.) 產生浮水印或圖片之電腦的為中的環境下,產生xls檔案,此時浮水印的圖片因為跟電腦預設的環境字型大小不同,變會跑版(會變小假設為640 * 480), 如果處理好的檔案,來到字型為小或是大的電腦, 還是會跑版(字型小的環境圖片會放大,字型大的環境會縮小),因為是xls,但是如果剛好來的是字型為中的環境,就維持640 * 480

 


 

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

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