powershell操作excel


https://blog.csdn.net/u010288731/article/details/83120205

如何創建一個Excel 應用程序對象?

$xl = new-object -comobject excel.application
默認創建的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.xls")

#添加一個工作薄
$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]::ReleaseComObject($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.xls")

如何創建一個新的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]::ReleaseComObject([System.__ComOb­ject]
$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 on: 2007-01-06
# Author: Kent Finkle
# Purpose: How Can I Convert a Tilde-Delimited File to Microsoft Excel
Format?

$s = gc C:\Scripts\Test.txt
# 先把~替換成Tab制表符,然后使用Excel打開它,其實我覺得這里使
# 用import-csv 然后加上一個分隔符的參數然后導出CSV 再用excel打開也可以
$s = $s -replace("~","`t")
$s | sc C:\Scripts\Test.txt
$xl = new-object -comobject excel.application
$xl.Visible = $true
$wb = $xl.Workbooks.Open("C:\Scripts\Test.txt")

如何為Excel 工作薄設置數據有效性驗證

$comments = @’
Script name: Add-Validation.ps1
Created on: Wednesday, September 19, 2007
Author: Kent Finkle
Purpose: How can I use Windows Powershell to Add Validation to an
Excel Worksheet?
‘@

#—————————————————–
function Release-Ref ($ref) {
([System.Runtime.InteropServices.Marshal]::ReleaseComObject(
[System.__ComObject]$ref) -gt 0)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

}

#—————————————————–

$xlValidateWholeNumber = 1
$xlValidAlertStop = 1
$xlBetween = 1

$xl = new-object -comobject excel.application
$xl.Visible = $True

$wb = $xl.Workbooks.Add()
$ws = $wb.Worksheets.Item(1)
$r = $ws.Range("e5")
$r.Validation.Add($xlValidateWholeNumber, ` $xlValidAlertStop,
$xlBetween, "5", "10") $r.Validation.InputTitle = "Integers"
$r.Validation.ErrorTitle = "Integers"
$r.Validation.InputMessage = "Enter an integer from five to ten"
$r.Validation.ErrorMessage = "You must enter a number from five to
ten"

$a = Release-Ref $r
$a = Release-Ref $ws
$a = Release-Ref $wb
$a = Release-Ref $xl

添加圖表到 Excel 工作薄

$xrow = 1
$yrow = 8
$xl = New-Object -c excel.application
$xl.visible = $true
$wb = $xl.workbooks.add()
$sh = $wb.sheets.item(1)
1..8 | % { $sh.Cells.Item(1,$_) = $_ }
1..8 | % { $sh.Cells.Item(2,$_) = 9-$_ }
$range = $sh.range("a${xrow}:h$yrow")
$range.activate
# create and assign the chart to a variable
$ch = $xl.charts.add()
$ch.chartType = 58
$ch.setSourceData($range)
$ch.export("C:\test.jpg")
$xl.quit()

# excel has 48 chart styles, you can cycle through all
1..48 | % {$ch.chartStyle = $_; $xl.speech.speak("Style $_"); sleep 1}
$ch.chartStyle = 27                          # <– use the one you like

對Excel 工作薄的某一列進行排序

$xlSummaryAbove = 0
$xlSortValues = $xlPinYin = 1
$xlAscending = 1
$xlDescending = 2

# one-column sort –> works
[void]$range1.sort($range2, $xlAscending)
[void]$range1.sort($range3, $xlAscending)
# two-column sort –> doesn’t sort both columns
# the 4th arg [xlSortType] gives problems so pass $null or ”,
# it may be for PivotTables only
[void]$range1.sort($range2, $xlAscending, $range3, ”, $xlAscending)

對Excel的某一列進行匯總

	$xlSum = -4157
	
	$range = $xl.range("A1:D6")
	$range.Subtotal(1,-4157,(2,3,4),$true,$false,$true)
	#     Selection.Subtotal GroupBy:=1, Function:=xlSum, TotalList:=Array(4), _
	#     Replace:=True, PageBreaks:=False, SummaryBelowData:=True

怎樣使用 xlConstants

$xlAutomatic=-4105
$xlBottom = -4107
$xlCenter = -4108
$xlContext = -5002
$xlContinuous=1
$xlDiagonalDown=5
$xlDiagonalUp=6
$xlEdgeBottom=9
$xlEdgeLeft=7
$xlEdgeRight=10
$xlEdgeTop=8
$xlInsideHorizontal=12
$xlInsideVertical=11
$xlNone=-4142
$xlThin=2

$xl = new-object -com excel.application
$xl.visible=$true
$wb = $xl.workbooks.open("d:\book1.xls")
$ws = $wb.worksheets | where {$_.name -eq "sheet1"}
$selection = $ws.range("A1:D1")
$selection.select()

$selection.HorizontalAlignment = $xlCenter
$selection.VerticalAlignment = $xlBottom
$selection.WrapText = $false
$selection.Orientation = 0
$selection.AddIndent = $false
$selection.IndentLevel = 0
$selection.ShrinkToFit = $false
$selection.ReadingOrder = $xlContext
$selection.MergeCells = $false
$selection.Borders.Item($xlInsideHorizontal).Weight = $xlThin

excel 的自動填充功能在powershell中的使用

$xlFillWeekdays = 6

$xl = new-object -com excel.application
$xl.visible=$true
$wb = $xl.workbooks.add()
$ws = $wb.worksheets | where {$_.name -eq "sheet1"}
$range1= $ws.range("A1")
$range1.value() = (get-date).toString("d")
$range2 = $ws.range("A1:A25")
$range1.AutoFill($range2,$xlFillWeekdays)
$range1.entireColumn.Autofit()
# $wb.close()
# $xl.quit()

獲得Excel的某個選取范圍

# get-excelrange.ps1
# opens an existing workbook in Excel 2007, using PowerShell
# and turns a range bold # Thomas Lee – t…@psp.co.uk
# Create base object
$xl = new-object -comobject Excel.Application

# make Excel visible
$xl.visible = $true

# open a workbook
$wb = $xl.workbooks.open("C:\Scripts\test.xls")

# Get sheet1
$ws = $wb.worksheets | where {$_.name -eq "sheet1"}

# Make A1-B1 bold
$range = $ws.range("A1:B1")
$range.font.bold = "true"

# Make A2-B2 italic
$range2 = $ws.range("A2:B2")
$range2.font.italic = "true"

# Set range to a value
$range3=$ws.range("A2:B2")
$Range3.font.size=24

# now format an entire row
$range4=$ws.range("3:3")
$range4.cells="Row 3"
$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


如何進行選擇性復制和粘貼?

$xlPasteValues = -4163 
$xlCellTypeLastCell = 11 

$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中定義這些常量。
————————————————
版權聲明:本文為CSDN博主「老城百姓」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010288731/article/details/83120205


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM