Powershell針對(duì)Excel的一些簡(jiǎn)單操作
稍微高級(jí)點(diǎn)的語(yǔ)言都會(huì)涉及到對(duì)COM對(duì)象的操作,作為微軟自己進(jìn)化的腳本語(yǔ)言,powershell有這個(gè)功能一點(diǎn)不稀奇,首先它使用 .NET Framework 提供的強(qiáng)大類(lèi)庫(kù),很多特性和C#相似;其次,雖然作為腳本但它面向?qū)ο蟆J褂胮owershell來(lái)管理WMI和COM更簡(jiǎn)單。
用微軟官方的話(huà)概括powershell就是:
Windows PowerShell™ 是一種基于任務(wù)的命令行 shell 和腳本語(yǔ)言,專(zhuān)門(mén)用于管理系統(tǒng)。 Windows PowerShell™ 構(gòu)建于 .NET Framework 之上,能夠幫助 IT 專(zhuān)業(yè)人員和高級(jí)用戶(hù)控制和自動(dòng)管理 Windows 操作系統(tǒng)以及在 Windows 上運(yùn)行的應(yīng)用程序。
內(nèi)置 Windows PowerShell 命令(稱(chēng)為 cmdlet)可用于通過(guò)命令行管理企業(yè)中的計(jì)算機(jī)。使用 Windows PowerShell™ Provider,您可以像訪(fǎng)問(wèn)文件系統(tǒng)那樣輕松地訪(fǎng)問(wèn)數(shù)據(jù)存儲(chǔ),如注冊(cè)表和證書(shū)存儲(chǔ)。 此外,Windows PowerShell™ 還具有一個(gè)功能豐富的表達(dá)式分析程序和一種經(jīng)過(guò)充分開(kāi)發(fā)的腳本語(yǔ)言。
下面介紹powershell對(duì)excel的簡(jiǎn)單操作。
首先,我執(zhí)行一條命令來(lái)獲取系統(tǒng)當(dāng)前正在運(yùn)行的所有進(jìn)程:
Get-Process cmdlet顯示當(dāng)前本地進(jìn)程運(yùn)行狀態(tài),包括處于打開(kāi)狀態(tài)的句柄數(shù)量、各種內(nèi)存占用視圖以及 CPU 使用率的快照。powershell和Linux shell一個(gè)很大的不同點(diǎn)就是大小寫(xiě)不敏感,無(wú)論是系統(tǒng)函數(shù)還是命令。這點(diǎn)可以減少犯錯(cuò)的概率。
您可能疑惑為什么講這個(gè)?對(duì)于系統(tǒng)管理員來(lái)說(shuō),冗長(zhǎng)的數(shù)據(jù)背后隱藏著大量細(xì)節(jié),get-process是獲取本地進(jìn)程運(yùn)行情況,當(dāng)然加上-computername參數(shù)后可以訪(fǎng)問(wèn)遠(yuǎn)程計(jì)算機(jī),但目前這個(gè)對(duì)于網(wǎng)絡(luò)管理員來(lái)說(shuō)猶如海市蜃樓,所以不得不使用windows WMI和 Win32_Process WMI 類(lèi)來(lái)監(jiān)視遠(yuǎn)程系統(tǒng)并以實(shí)用方式顯示信息。如果認(rèn)為 Get-Process 的輸出內(nèi)容非常豐富,請(qǐng)?jiān)僮屑?xì)看看 Win32_Process 的輸出:
很明顯,這個(gè)輸出很詳細(xì),但是可讀性不強(qiáng),管理員需要的是易于閱讀的內(nèi)存占用量報(bào)告。可以轉(zhuǎn)用Excel實(shí)現(xiàn)自動(dòng)操作。
自動(dòng)化 Excel 有多難?實(shí)際上非常簡(jiǎn)單,因?yàn)?Microsoft 已創(chuàng)建了專(zhuān)門(mén)用于處理 Excel 的自動(dòng)化模型。程序 ID 是 Excel.Application,它是一個(gè) COM 對(duì)象。創(chuàng)建 Excel.Application 對(duì)象的實(shí)例時(shí),Excel 會(huì)默認(rèn)啟動(dòng)并運(yùn)行,只是您看不見(jiàn)它。但是,可使用 visible 屬性讓 Excel 顯示出來(lái)。
以下代碼顯示了如何創(chuàng)建 Excel.Application 對(duì)象、查詢(xún) visible 屬性的狀態(tài),然后將 visible 屬性設(shè)為 true:
然后,您會(huì)看到一個(gè)非常奇怪的 Excel 視圖,它看起來(lái)就像 Excel 應(yīng)用程序的一個(gè)外殼(如下圖)。沒(méi)有工作簿、沒(méi)有電子表格,―個(gè)是光禿禿的 Excel。
當(dāng)然,這個(gè)肯定是無(wú)法使用的,但是它是建立工作簿的前提,它是存放工作簿的容器。現(xiàn)在我們需要將一個(gè)工作簿添加到應(yīng)用程序中。為此,需要借助工作簿對(duì)象的 add 方法。工作簿對(duì)象是從主 Excel.Application 對(duì)象進(jìn)行訪(fǎng)問(wèn)的,正如您看到的,我們將工作簿對(duì)象存儲(chǔ)在一個(gè)名為 $workbook 的變量中:
現(xiàn)在,需連接特定的電子表格。默認(rèn)情況下,工作簿添加到 Excel 時(shí),會(huì)向其中添加三個(gè)電子表格(sheet1,sheet2,sheeet3)。這些電子表格可通過(guò)數(shù)字進(jìn)行標(biāo)識(shí)。在以下代碼行中,連接第一個(gè)電子表格并將返回的電子表格對(duì)象存儲(chǔ)在名為 $sheet 的變量中:
現(xiàn)在我再運(yùn)行一次$excel.Visible = $true來(lái)查看excel變成什么樣了(建好了工作簿并且選擇了sheet1):
現(xiàn)在,可將數(shù)據(jù)寫(xiě)入該電子表格。Excel 電子表格中的信息存儲(chǔ)在單元格中。由于單元格位于電子表格之中,所以可使用 $sheet 變量中存儲(chǔ)的電子表格對(duì)象訪(fǎng)問(wèn)特定的單元格。具體方法是使用指代電子表格中行和列的數(shù)字。在 Excel 電子表格中,行是數(shù)字而列是字母,這一點(diǎn)有些讓人迷惑。但使用自動(dòng)化模型時(shí),行和列均為數(shù)字。第一個(gè)數(shù)字是行,第二個(gè)數(shù)字是列。只需對(duì)特定單元格進(jìn)行賦值即可寫(xiě)入單元格:
這時(shí),您再運(yùn)行$excel.Visible = $true,查看excel變成啥樣了:
嗯,意料之中,Excel 的一個(gè)不足是工作簿始終會(huì)創(chuàng)建三個(gè)電子表格,這有點(diǎn)浪費(fèi),因?yàn)槲椰F(xiàn)在這個(gè)測(cè)試只需要第一個(gè)sheet。幸運(yùn)的是,可利用自動(dòng)化刪除多余的電子表格:使用工作表集合連接第三個(gè)電子表格并調(diào)用 delete 方法。執(zhí)行相同的操作刪除第二個(gè)電子表格:
以上測(cè)試過(guò)程的代碼如下:
下面我們開(kāi)始將process中的內(nèi)容移植到excel中。
電子表格的第一行將包含標(biāo)頭信息。將繪制邊框并使屬性名稱(chēng)顯示為粗體。由于數(shù)據(jù)將從第二行開(kāi)始,因此將值 2 賦給計(jì)數(shù)器變量 $x:
完成后,通過(guò)使用 item 方法選擇單元格并指定行和列的坐標(biāo),向第一行賦值。接下來(lái),使用直接賦值寫(xiě)入列標(biāo)題:
以上結(jié)果是我電腦里正在運(yùn)行的進(jìn)程。我只選擇了兩個(gè)字段顯示。
關(guān)于整個(gè)腳本的代碼,如下:
$workbook.Worksheets.item(1).name="Processes"
$sheet = $workbook.WorkSheets.Item("Processes")
$x = 2
$lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type]
$colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type]
$borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type]
$chartType = "microsoft.office.interop.excel.xlChartType" -as [type]
for($b = 1 ; $b -le 2 ; $b++)
{
$sheet.cells.item(1,$b).font.bold = $true
$sheet.cells.item(1,$b).borders.LineStyle = $lineStyle::xlDashDot
$sheet.cells.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
$sheet.cells.item(1,$b).borders.weight = $borderWeight::xlMedium
}
$sheet.cells.item(1,1) = "Name of Process"
$sheet.cells.item(1,2) = "Working Set Size"
foreach($process in $processes)
{
$sheet.cells.item($x, 1) = $process.name
$sheet.cells.item($x,2) = $process.workingSet
$x++
} #end foreach
$range = $sheet.usedRange
$range.EntireColumn.AutoFit() | out-null
關(guān)于powershell寫(xiě)入excel的簡(jiǎn)單知識(shí)先介紹到這,其實(shí),在運(yùn)行的過(guò)程的中您會(huì)發(fā)現(xiàn),進(jìn)程中的每個(gè)字段填入excel的過(guò)程是非常緩慢的,因?yàn)樗且粋€(gè)cell一個(gè)cell填入的,而不是一下子拷貝到excel中的,這些將在之后的隨筆中介紹。
備注:這篇隨筆是參考微軟官方的一片博客并加入自己的理解寫(xiě)的,后續(xù)還將會(huì)簡(jiǎn)單介紹powershell操作excel&CSV的其它應(yīng)用。
如有錯(cuò)誤,歡迎指正,謝謝!
新聞熱點(diǎn)
疑難解答
圖片精選