您的位置:首页 > 运维架构 > Shell

Office Powershell Cookbook (Office powershell 常见操作)

2011-06-27 14:48 441 查看
http://sds07s7.blogbus.com/logs/62536662.html

  最近涉及的东西很多关联到office的应用,而自从vbs转移到powershell作为主要的脚本之后,使用Powershell操作office对自己来说已经有很大的需求。

  下面把自己收集到的一些资源总结一下 (个人记性不好,只能作记录) Excel 部分

  翻译的OldDog的Excel Powershell Cookbook

  如何创建一个Excel 应用程序对象?

  $xl = new-object -comobject excel.application

  脚本小子Scripting Guys 有一个栏目专门介绍office powershell的

  __________________________________________________ ______________________

  默认创建的Excel 应用程序对象是在后台的,它默认不显示程序的主窗口出来,如何让它显示出来?

  $xl.Visible = $true

  __________________________________________________ ______________________

  创建一个Excel 文件,也就是我们的Excel 文档(题外话:Excel 应用程序可以打开多个workbook,workbook 包含多个sheet,sheel包含多个cell

  $wb = $xl.Workbooks.Add()

  __________________________________________________ ______________________

  添加一个工作薄worksheet?

  $xl = new-object -comobject excel.application

  $xl.Visible = $true

  #打开ado_object_models.xls Excel 文档

  $wb = $xl.Workbooks.Open("C:/Scripts/ado_object_model.xl s")

  #添加一个工作薄

  $ws = $xl.Sheets.Add()

  __________________________________________________ ______________________

  如何激活一个工作薄? 也就是如何选中某个工作簿让其处于我们可以操作的状态。

  # 创建Excel 应用程序对象

  $xl = new-object -comobject Excel.Application

  # 显示Excel 软件的主界面窗口

  $xl.visible = $true

  # 打开一个Excel文档

  $wb = $xl.workbooks.open("C:/Scripts/PowerShell/test.xls ")

  # 获取Excel 文档的工作薄

  $ws1 = $wb.worksheets | where {$_.name -eq "sheet1"} #<------- Selects sheet 1

  $ws2 = $wb.worksheets | where {$_.name -eq "sheet2"} #<------- Selects sheet 2

  $ws3 = $wb.worksheets | where {$_.name -eq "sheet3"} #<------- Selects sheet 3

  # 激活sheet1

  $ws1.activate()

  Start-Sleep 1

  # 激活 sheet 2

  $ws2.activate()

  Start-Sleep 1

  # 激活 sheet 3

  $ws3.activate()

  __________________________________________________ _______________

  如何更改活动单元格的值?(活动单元格,也就是当前处于选中状态,我们可以对其进行操作的单元格)

  $xl.ActiveCell.Value2 = "x"

  __________________________________________________ ______________________

  如何更改某个具体单元格的值?

  $xl.activesheet.cells.item(2,1).value2=”y”

  $xl.cells.item(2,1).value2=”y”

  $xl.ActiveSheet.Range("B1").Value2 = "y"

  __________________________________________________ ______________________

  如何获得excel文档的名称?

  $wb.Name

  $xl.activeWorkBook.name

  __________________________________________________ ______________________

  如何通过行号,列号来枚举相应的所有单元格的值?

  $xl = new-object -comobject excel.application

  $xl.Visible = $true

  $wb = $xl.Workbooks.Add()

  $ws = $wb.Worksheets.Item(1)

  #设置前11行,每行第一个单元格的值为1--〉11

  for ($row = 1; $row -lt 11; $row++)

  {

  $ws.Cells.Item($row,1) = $row

  }

  __________________________________________________ ______________________

  如何列举某个文件夹下的所有文件,然后把列表导入Excel?

  $xl = new-object -comobject excel.application

  $xl.Visible = $true

  $wb = $xl.Workbooks.Add()

  $ws = $wb.Worksheets.Item(1)

  $row = 1

  #获取当前文件夹下的所有文件以及文件夹对象

  $s = dir

  $s | foreach -process `

  { `

  #输出每个文件或者文件夹的名称到Excel

  $ws.Cells.Item($row,1) = $_; `

  $row++ `

  }

  __________________________________________________ ______________________

  获取当前的系统进程列表然后输出到Excel?

  #下面函数用来释放Excel的应用程序的对象,否则你使用Excel对象的quit()方法之后,虽然关闭了Excel的界面窗口,但是相应的Excel进程还在进程列表里面,而且没有释放其占有的内存和资源,使用下面函数将释放Com对象,并且调用.net的垃圾收集器进行资源回收。以后的office Powershell中会经常使用该函数用来释放office的application 对象。

  function Release-Ref ($ref) {

  [System.Runtime.InteropServices.Marshal]::ReleaseC omObject($ref)

  [System.GC]::Collect()

  [System.GC]::WaitForPendingFinalizers()

  }

  # -------------------------------------------------- ---

  $xl = New-Object -comobject Excel.Application

  $xl.Visible = $True

  $wb = $xl.Workbooks.Add()

  $ws = $wb.Worksheets.Item(1)

  $range = $ws.Cells.Item(1,1)

  $row = 1

  #获取进程列表,并且获取进程名称

  $s = Get-Process | Select-Object name

  $s | foreach -process {

  $range = $ws.Cells.Item($row,1);

  $range.value2 = $_.Name;

  $row++ }

  #下面这句用来关闭office中的一些提示确认框,否则会弹出一些对话框让你确认

  $xl.DisplayAlerts = $False

  #使用excel应用程序的Saveas来保存更改后的文档

  $wb.SaveAs("C:/Scripts/Get_Process.xls")

  #注销释放$range对象

  Release-Ref $range

  #powershell的官方blog上多加了一步操作,也就是remove-variable $range,以前以为没有什么作用,后面发现如果不执行该项操作,该变量名称会停留在variable:/下面,如果执行dir variable:/ 会报错误

  remove-variable $range

  Release-Ref $ws

  remove-variable $ws

  Release-Ref $wb

  remove-variable $wb

  $xl.Quit()

  Release-Ref $xl

  remove-variable $xl

  ***如果是针对远程计算机操作,尝试下面的,当然首先你需要配置Wsman

  $strComputer = (remote machine name)

  $P = gwmi win32_process -comp $strComputer

  __________________________________________________ ____________

  如何打开一个Excel 文件? #an existing Workbook

  $xl.Workbooks.Open("C:/Scripts/ado_object_model.xl s") __________________________________________________ ______________________ 如何创建一个新的Excel文件 workbook?

  $xl = new-object -comobject excel.application

  $xl.Visible = $true

  $wb = $xl.Workbooks.Add()

  $xl.ActiveCell.Value2 = "x"

  $xl.ActiveSheet.Range("B1").Value2 = "y"

  __________________________________________________ ______________________

  如何到处Powershell的命令输入历史到 Excel?

  function Release-Ref ($ref) {

  ([System.Runtime.InteropServices.Marshal]::Release ComObject([System.__ComObject]

  $ref) -gt 0)

  [System.GC]::Collect()

  [System.GC]::WaitForPendingFinalizers()

  }

  # -------------------------------------------------- ---

  $xl = New-Object -comobject Excel.Application

  $xl.Visible = $True

  $wb = $excel.Workbooks.Add()

  $ws = $workbook.Worksheets.Item(1)

  $range = $worksheet.Cells.Item(1,1)

  $row = 1

  $s = Get-History | foreach -process { `

  $range = $worksheet.Cells.Item($row,1); `

  #下面的Value2可以输入字符串,否则你用value属性会报错。

  $range.value2 = $_.CommandLine; `

  $row++ }

  $xl.DisplayAlerts = $False

  $wb.SaveAs("C:/Scripts/Get_CommandLine.xls")

  Release-Ref $range

  Release-Ref $ws

  Release-Ref $wb

  $xl.Quit()

  Release-Ref $xl

  __________________________________________________ ______________________

  如何转换"~" 分隔的文本文件到Microsoft Excel?

  # Script name: ConvertTilde.ps1

  # Created width=504 height=346 TYPE="audio/mpeg">

  $comments = @'

  Script name: Add-Validation.ps1

  Created

  $range4.font.italic="$true"

  $range4.font.bold=$True

  $range4.font.size=10

  $range4.font.name="comic Sans MS" # now format a Range of cells $ws.Range("D1:F5").NumberFormat = "#,##0.00" __________________________________________________ ____________________ 向Excel 单元格添加注释(Comment)

  $xll = New-Object -com Excel.Application

  $xl.visible = $True

  $wb = $xl.Workbooks.Add()

  $ws = $wb.Worksheets.Item(1)

  $ws.Cells.Item(1,1) = “A value in cell A1.”

  [void]$ws.Range("A1").AddComment()

  [void]$ws.Range("A1").comment.Visible = $False

  [void]$ws.Range("A1").Comment.text("OldDog: `r this is a comment")

  [void]$ws.Range("A2").Select

  #The 'r adds a line feed after the comment's author. This is required!

  __________________________________________________ ______________________

  如何进行选择性复制和粘贴?

  


  $xlPasteValues = -4163 # Values only, not formulas

  $xlCellTypeLastCell = 11 # to find last used cell

  $used = $ws.usedRange

  $lastCell = $used.SpecialCells($xlCellTypeLastCell)

  $row = $lastCell.row

  $range = $ws.UsedRange

  [void]$ws.Range("A8:F$row").Copy()

  [void]$ws.Range("A8").PasteSpecial(-4163)

  关于Excel powershell的 其他的一些 经验和总结,其实看powershell office的代码和普通的Vba代码没有太大的区别,偶尔可能因为语法的不同有所出入,但是函数和属性都是相同的,因此在我们不知道powershell如何写的时候,可以使用word ,Excel中的录制宏功能,录制下vba代码看看,还有如果想了解office对象可用的属性和方法,那么office本身带的对象浏览器(在VBa编辑器的环境中按F2即可调出)也非常有用,你可以查看一些常量的值,然后你在powershell中定义这些常量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: