PowerShell操作Excel、CSV详细介绍
Powershell针对Excel的⼀些简单操作
  稍微⾼级点的语⾔都会涉及到对COM对象的操作,作为微软⾃⼰进化的脚本语⾔,powershell有这个功能⼀点不稀奇,⾸先它使⽤ .NET Framework 提供的强⼤类库,很多特性和C#相似;其次,虽然作为脚本但它⾯向对象。使⽤powershell来管理WMI和COM更简单。
  ⽤微软官⽅的话概括powershell就是:
  Windows PowerShell™ 是⼀种基于任务的命令⾏ shell 和脚本语⾔,专门⽤于管理系统。 Windows PowerShell™ 构建于 .NET Framework 之上,能够帮助 IT 专业⼈员和⾼级⽤户控制和⾃动管理 Windows 操作系统以及在 Windows 上运⾏的应⽤程序。
  内置 Windows PowerShell 命令(称为 cmdlet)可⽤于通过命令⾏管理企业中的计算机。使⽤ Windows PowerShell™Provider,您可以像访问⽂件系统那样轻松地访问数据存储,如注册表和证书存储。此外,Windows PowerShell™ 还具有⼀个功能丰富的表达式分析程序和⼀种经过充分开发的脚本语⾔。
  下⾯介绍powershell对excel的简单操作。
  ⾸先,我执⾏⼀条命令来获取系统当前正在运⾏的所有进程:
Get-Process cmdlet显⽰当前本地进程运⾏状态,包括处于打开状态的句柄数量、各种内存占⽤视图以及 CPU 使⽤率的快照。powershell和Linux shell⼀个很⼤的不同点就是⼤⼩写不敏感,⽆论是系统函数还是命令。这点可以减少犯错的概率。
  您可能疑惑为什么讲这个?对于系统管理员来说,冗长的数据背后隐藏着⼤量细节,get-process是获取本地进程运⾏情况,当然加上-computername参数后可以访问远程计算机,但⽬前这个对于⽹络管理员来说犹如海市蜃楼,所以不得不使⽤windows WMI和 Win32_Process WMI 类来监视远程系统并以实⽤⽅式显⽰信息。如果认为 Get-Process 的输出内容⾮常丰富,请再仔细看看 Win32_Process 的输出:
 很明显,这个输出很详细,但是可读性不强,管理员需要的是易于阅读的内存占⽤量报告。可以转⽤Excel实现⾃动操作。
 ⾃动化 Excel 有多难?实际上⾮常简单,因为 Microsoft 已创建了专门⽤于处理 Excel 的⾃动化模型。程序 ID 是
Excel.Application,它是⼀个 COM 对象。创建 Excel.Application 对象的实例时,Excel 会默认启动并运⾏,只是您看不见它。但是,可使⽤ visible 属性让 Excel 显⽰出来。
以下代码显⽰了如何创建 Excel.Application 对象、查询 visible 属性的状态,然后将 visible 属性设为 true:
复制代码代码如下:
PS > $excel = New-Object -ComObject Excel.Application  ==>创建⼀个excel应⽤的COM对象
PS > $excel.Visible    ==>默认新建的excel视图不显⽰,即没有打开
False
PS > $excel.Visible = $true    ==>看到下⾯的界⾯
  然后,您会看到⼀个⾮常奇怪的 Excel 视图,它看起来就像 Excel 应⽤程序的⼀个外壳(如下图)。没有⼯作簿、没有电⼦表格,—个是光秃秃的 Excel。
当然,这个肯定是⽆法使⽤的,但是它是建⽴⼯作簿的前提,它是存放⼯作簿的容器。现在我们需要将⼀个⼯作簿添加到应⽤程序中。为此,需要借助⼯作簿对象的 add ⽅法。⼯作簿对象是从主 Excel.Application 对象进⾏访问的,正如您看到的,我们将⼯作簿对象存储在⼀个名为 $workbook 的变量中:
复制代码代码如下:
$workbook = $excel.Workbooks.add()  ==>现在添加了⼀个空的⼯作簿
现在,需连接特定的电⼦表格。默认情况下,⼯作簿添加到 Excel 时,会向其中添加三个电⼦表格
(sheet1,sheet2,sheeet3)。这些电⼦表格可通过数字进⾏标识。在以下代码⾏中,连接第⼀个电⼦表格并将返回的电⼦表格对象存储在名为 $sheet 的变量中:
复制代码代码如下:
$sheet = $workbook.worksheets.Item(1)  ==>表⽰我使⽤的是第⼀个sheet
现在我再运⾏⼀次$excel.Visible = $true来查看excel变成什么样了(建好了⼯作簿并且选择了sheet1):
现在,可将数据写⼊该电⼦表格。Excel 电⼦表格中的信息存储在单元格中。由于单元格位于电⼦表格之中,所以可使⽤$sheet 变量中存储的电⼦表格对象访问特定的单元格。具体⽅法是使⽤指代电⼦表格中⾏和列的数字。在 Excel 电⼦表格中,⾏是数字⽽列是字母,这⼀点有些让⼈迷惑。但使⽤⾃动化模型时,⾏和列均为数字。第⼀个数字是⾏,第⼆个数字是列。只需对特定单元格进⾏赋值即可写⼊单元格:
复制代码代码如下:
$lls.item(1,1) = "Test"  ==>我在第⼀个单元格填⼊“Test”
这时,您再运⾏$excel.Visible = $true,查看excel变成啥样了:
嗯,意料之中,Excel 的⼀个不⾜是⼯作簿始终会创建三个电⼦表格,这有点浪费,因为我现在这个测试只需要第⼀个sheet。幸运的是,可利⽤⾃动化删除多余的电⼦表格:使⽤⼯作表集合连接第三个电⼦表格并调⽤ delete ⽅法。执⾏相同的操作删除第⼆个电⼦表格: 
复制代码代码如下:
$workbook.workSheets.item(3).delete()
$workbook.WorkSheets.item(2).delete()
  这样只剩下sheet1了,接下来,重命名剩余的电⼦表格。这⼀点⾮常重要,因为如果决定使⽤ ActiveX 数据对象 (ADO)来查询 Excel 电⼦表格,将在连接字符串中使⽤此电⼦表格名称。因此,要使代码易读且直观,电⼦表格应具有逻辑名称。要重命名电⼦表格,只需向特定电⼦表格的 name 属性赋⼀个值即可。以下代码将第⼀个电⼦表格重命名为 "Processes": 
复制代码代码如下:
$workbook.WorkSheets.item(1).Name = "Processes"
  现在,需连接重命名后的电⼦表格。使⽤⼯作表对象的 Item ⽅法并将电⼦表格的名称指定给它: 
复制代码代码如下:
$sheet = $workbook.WorkSheets.Item("Processes")
 这时我们再查看excel的样⼦:
以上测试过程的代码如下:
复制代码代码如下:
$excel = New-Object -ComObject Excel.Application
#$excel.Visible = $true
$workbook = $excel.Workbooks.add()
$sheet = $workbook.worksheets.Item(1)
$lls.item(1,1) = "Test"
$workbook.workSheets.item(3).delete()
$workbook.WorkSheets.item(2).delete()
$workbook.WorkSheets.item(1).Name = "Processes"
$excel.Visible = $true
下⾯我们开始将process中的内容移植到excel中。
  电⼦表格的第⼀⾏将包含标头信息。将绘制边框并使属性名称显⽰为粗体。由于数据将从第⼆⾏开始,因此将值 2 赋给计数器变量 $x:
复制代码代码如下:
$x=2
   接下来的四⾏代码创建四个枚举类型。枚举类型⽤于告诉 Excel 允许将哪些值填⼊特定的选项类型。例如,xlLineStyle 枚举⽤于确定所绘制线条的类型:双线条、虚线等。MSDN 上详细介绍了这些枚举值。
为使代码更易于阅读,针对将使⽤的每个枚举类型创建⼀个快捷别名。实际上,我们将把代表枚举名称的字符串转换成[type]。 
复制代码代码如下:
$lineStyle = "microsoft.l.xlLineStyle" -as [type]
$colorIndex = "microsoft.l.xlColorIndex" -as [type]
$borderWeight = "microsoft.l.xlBorderWeight" -as [type]
$chartType = "microsoft.l.xlChartType" -as [type]
  现在需格式化第⼀⾏。使字体为粗体,将线条定义为 xlDashDot,允许⾃动指定颜⾊,并将边框宽度设为中等粗细:
复制代码代码如下:
for($b = 1 ; $b -le 2 ; $b++)
{
$lls.item(1,$b).font.bold = $true
$lls.item(1,$b).borders.LineStyle = $lineStyle::xlDashDot
$lls.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
$lls.item(1,$b).borders.weight = $borderWeight::xlMedium
}
完成后,通过使⽤ item ⽅法选择单元格并指定⾏和列的坐标,向第⼀⾏赋值。接下来,使⽤直接赋值写⼊列标题:
复制代码代码如下:
$lls.item(1,1) = "Name of Process"
$lls.item(1,2) = "Working Set Size"
  现在,需将 WMI 查询产⽣的 $processes 变量中存储的进程信息放⼊适当的单元格中。使⽤ foreach 语句遍历进程信息集合。将变量 $process 定义为集合枚举器(占位符),并选择将名称和 workingSetSize 属性分别写⼊第⼀列和第⼆列。$x 变量将在此发挥作⽤。从第⼆⾏开始,在遍历进程集合的同时,递增 $x 变量的值以便它始终指向集合中的当前⾏。通过以下代码,即可对 $processes 进程信息集合中存储的所有数据进⾏整理分类: 
复制代码代码如下:
foreach($process in $processes)
{
$lls.item($x, 1) = $process.name
$lls.item($x,2) = $process.workingSetSize
$x++
}
  填写完 Excel 电⼦表格后,可以调整列的⼤⼩以使单元格与其中所存储数据的尺⼨相同。为此,可通过指定要使⽤的列坐标来创建⼀个范围;但是,也可以只使⽤电⼦表格的 usedRange 属性。创建完范围对象后,选择 EntireColumn 属性并使⽤AutoFit ⽅法调整列的⼤⼩。由于该⽅法始终会返回数据,我将结果传送给 Out-Null cmdlet。从⽽避免控制台上布满了杂乱⽆⽤的信息。下⾯是所⽤的代码:
复制代码代码如下:
$range = $sheet.usedRange
$range.EntireColumn.AutoFit() | out-null
  ⾄此,已完成所有任务此时的电⼦表格具有所有进程的名称和内存⼯作集,相当不错。来看看完成后的成果:
以上结果是我电脑⾥正在运⾏的进程。我只选择了两个字段显⽰。
关于整个脚本的代码,如下:
复制代码代码如下:
$processes=Get-Process
$excel = New-Object -ComObject Excel.Application
#$excel.Visible = $true
$workbook = $excel.Workbooks.add()
$sheet = $workbook.worksheets.Item(1)
$workbook.Worksheets.item(3).delete()
$workbook.Worksheets.item(2).delete()
$workbook.Worksheets.item(1).name="Processes"
$sheet = $workbook.WorkSheets.Item("Processes")
$x = 2
$lineStyle = "microsoft.l.xlLineStyle" -as [type]
$colorIndex = "microsoft.l.xlColorIndex" -as [type]
$borderWeight = "microsoft.l.xlBorderWeight" -as [type]
$chartType = "microsoft.l.xlChartType" -as [type]
for($b = 1 ; $b -le 2 ; $b++)
{
$lls.item(1,$b).font.bold = $true
$lls.item(1,$b).borders.LineStyle = $lineStyle::xlDashDot
$lls.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
$lls.item(1,$b).borders.weight = $borderWeight::xlMedium
}
$lls.item(1,1) = "Name of Process"
$lls.item(1,2) = "Working Set Size"
foreach($process in $processes)
{
$lls.item($x, 1) = $process.name
$lls.item($x,2) = $process.workingSet
$x++
} #end foreach
$range = $sheet.usedRange
$range.EntireColumn.AutoFit() | out-null
execl函数 linux关于powershell写⼊excel的简单知识先介绍到这,其实,在运⾏的过程的中您会发现,进程中的每个字段填⼊excel的过程是⾮常缓慢的,因为它是⼀个cell⼀个cell填⼊的,⽽不是⼀下⼦拷贝到excel中的,这些将在之后的随笔中介绍。
  备注:这篇随笔是参考微软官⽅的⼀⽚博客并加⼊⾃⼰的理解写的,后续还将会简单介绍powershell
操作excel&CSV的其它应⽤。
  如有错误,欢迎指正,谢谢!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。