Scripting Guy 為您解答問題

Hey, Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guy 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

資源

如何將 Excel 圖表儲存成圖片?

Hey, Scripting Guy! Question

嗨,Scripting Guy!如何將 Excel 圖表儲存成圖片?

        -- JB

Hey, Scripting Guy! Answer

JB,您好。昨天對於撰寫本專欄的 Scripting Guy 而言其實是個大好日子。通常,如果打來 Scripting House 的電話是找撰寫本專欄的 Scripting Guy (但並不是真的要找撰寫本專欄的 Scripting Guy),目的要不是想要賣東西給他,再不然就是想問他是否能夠贊助年度募款活動 (這樣做其實不太聰明,因為撰寫本專欄的 Scripting Guy 一直認為年度是指「一年只有一次」)。對於郵件的情況也一樣:如果有郵件是寄給撰寫本專欄的 Scripting Guy (而不是房屋佔有者或目前居住人),那大概就是帳單。

如果不是這些情況,那就是發給某個 Scripting Guy 的禁制令。

但是,昨天的情況完全不同:撰寫本專欄的 Scripting Guy 昨天真的收到一封寫明了收件者是他的信。結果是鎮上有一間歐式 Spa 館新開幕,而且他們提供撰寫本專欄的 Scripting Guy 一個享受全身美容的機會,價格只要定價的五折。(編輯小記:很明顯,他們要不是從沒看過撰寫本專欄的 Scripting Guy,就是從沒提供過全身美容的折扣。 否則,他們肯定會額外收費 )。

不可否認,撰寫本專欄的 Scripting Guy 覺得這些人有點天真:畢竟,如果他們真的認為能夠在一天內讓他進行全身美容,那我也無話可說...還有就是,他對這項優惠感到十分好奇。我們即將說明的內容可能會讓本專欄的固定讀者群感到震驚,並且合理地將撰寫本專欄的 Scripting Guy 想像成非常文雅且有教養的人。但事實是:撰寫本專欄的 Scripting Guy 從未去過歐式 Spa 館。真的從來沒有。因此,他認為「這可能是試試看的好機會」。

下定決心之後,他仔細研究不同的優惠方案,並立即發現這超出他的理解範圍。例如,他不太確定「全身巧克力覆盆子按摩」是什麼東西,而且這項按摩服務保證會讓他擁有「讓您意想不到的滑嫩膚質」。通常,只要是包含巧克力覆盆子一詞的東西,撰寫本專欄的 Scripting Guy 就至少會嘗試一次。但是這回有點不同。再加上保證會讓他擁有意想不到的滑嫩膚質這種話。這什麼跟什麼啊?畢竟,撰寫本專欄的 Scripting Guy 的皮膚並不像蜥蜴或翼手龍的皮膚一樣粗。

這倒不是說把皮膚換成類似蜥蜴或翼手龍的膚質的話,不會比他目前的皮膚狀況還好。

「瑞士熱巧克力奶昔足浴和飲料」讓他更感困惑。撰寫本專欄的 Scripting Guy 實在無法冷靜地想像如何把奶昔加熱,他又怎麼能把熱奶昔喝下肚裡。更重要的是,他不確定這項優惠包含的項目是一項還是兩項。這項優惠是指除了足浴以外還有飲料可以喝嗎?還是說足浴和飲料根本就是同一個東西?老實說,撰寫本專欄的 Scripting Guy 也不太想知道。

既然結果如此,讓我們來假設一下:即使打了 5 折,在歐式 Spa 館待一天仍然要花上 $299 美元。$299 美元大約可以讓撰寫本專欄的 Scripting Guy 去 Dairy Queen 吃 100 次冰淇淋,而且還可以加熱自己的奶昔。

此外,他沒有時間在歐式 Spa 館打混,因為他有工作要做:


Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True

Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(1,1) = "Operating System"
objWorksheet.Cells(2,1) = "Windows Server 2003"
objWorksheet.Cells(3,1) = "Windows XP"
objWorksheet.Cells(4,1) = "Windows 2000"
objWorksheet.Cells(5,1) = "Windows NT 4.0"
objWorksheet.Cells(6,1) = "Other"

objWorksheet.Cells(1,2) = "Number of Computers"
objWorksheet.Cells(2,2) = 145
objWorksheet.Cells(3,2) = 987
objWorksheet.Cells(4,2) = 611
objWorksheet.Cells(5,2) = 41
objWorksheet.Cells(6,2) = 56

Set objRange = objWorksheet.UsedRange
objRange.Select

Set colCharts = objExcel.Charts
colCharts.Add()

Set objChart = colCharts(1)
objChart.Activate

objChart.Export "C:\Scripts\Test.jpg", "JPG"


好吧;其實工作也沒有這麼多。我們將不會在此說明在 Microsoft Excel 中建立圖表的細節,因為我們已經提供了該主題所專屬的完整系列文章。我們只是想簡短的說明,我們的指令碼一開始是從建立 Excel.Application 物件的執行個體起步,然後將 Visible 屬性設為 True,以便在畫面上看見執行中的 Excel 執行個體。接著,我們要使用 Add 方法,將新的空白活頁簿加入至執行中的 Excel 執行個體,然後使用下列這行程式碼來繫結至活頁簿中的第一個工作表:


Set objWorksheet = objWorkbook.Worksheets(1)


很簡單吧。接下來有一些針對將資料加入至工作表所設計的程式碼行。完成上述作業之後,我們要選取所有資料 (使用 UsedRange 屬性和 Select 方法),然後使用下列兩行程式碼來建立圖表:


Set colCharts = objExcel.Charts
colCharts.Add()


產生的圖表看起來類似這樣:

Microsoft Excel


不好意思,這只是空白的舊圖表而已。我們目前還不知道要如何結合圖表與足浴,不過我們打算要繼續研究。

既然我們已經有圖表,就可以將該圖表匯出成圖片。若要這樣做,我們必須建立圖表本身的物件參照。我們可以繫結至圖表 (當然,這是 Charts 集合中的第一張和唯一一張圖表),然後使用 Activate 方法,讓這張圖表成為作用中圖表:


Set objChart = colCharts(1)
objChart.Activate


此時,將圖表儲存成圖片就如同呼叫 Export 方法一樣簡單:


objChart.Export "C:\Scripts\Test.jpg", "JPG"


如您所見,在此處我們要呼叫 Export 方法,並傳遞兩個參數給該方法:產生圖片檔的完整路徑,以及我們要建立之圖片檔的類型。在此範例中,我們要建立名為 C:\Scripts\Test.jpg 的檔案,而且希望產生的圖片是 .JPG 檔,因此使用 “JPG” 參數。那麼是否可以使用其他圖形類型?當然可以。例如,我們確定圖表可以儲存成 .GIF 檔或 .PNG 檔。那麼圖表是否能儲存成其他格式?也許吧,但是我們沒有嘗試過任何其他格式。我們把這個部分先省下來,以便在做「巧克力覆盆子按摩」時用來打發時間。

當然,每個人心裡現在一定都在想:Scripting Guy 是否會將贈送「瑞士熱巧克力奶昔足浴和飲料」當做「2007 冬季指令碼比賽 (英文)」的一部分獎勵?等一下,讓我們查查看...

很抱歉,這不屬於比賽獎品的一部分。不過,我們贈送 250 個 Dr. Scripto 搖頭玩偶 (英文)。此外,Manning Publications (英文) 的人員會贈送 20 本 Bruce Payette 的新書 Windows PowerShell in Action (英文)。在 Windows PowerShell 相關書籍中,還有哪一本書比它更好、更具權威性呢?告訴你吧,就算有,我們也沒看過。這是值得你努力求勝的獎品。

那麼,要怎麼贏得這些大獎呢?基本上,條件相當嚴格:您必須至少參加「指令碼比賽」的其中一個項目。就是這樣。只要參加比賽項目 (您甚至不需要順利完成該項目!),您就會自動被加入這些大獎的隨機抽籤名單中。很抱歉,我們無法提供「瑞士熱巧克力奶昔足浴和飲料」。但是,我們認為搖頭玩偶和 Windows PowerShell 書籍已經是相當好的安慰獎了。

顯示: