function Import-OldXLS {
[CmdletBinding()] #bind the parameters of the function
param (
#define parameters as mandatory, specify a position
[Parameter(Mandatory=$true,Position=0)]
[System.String]
$FileName,
[Parameter(Mandatory=$false,Position=1)]
[ValidateNotNull()]
[Microsoft.Office.Interop.Excel.ApplicationClass]
$ExcelInstance = $null
)
begin {
$_closeExcel = $false
if ($ExcelInstance -eq $null) {
$_closeExcel = $true
try {
$ExcelInstance = New-Object -ComObject "Excel.Application"
} catch {
Write-Error -ErrorRecord $_
}
}
}
process {
$results = @{}
try {
$wb = $ExcelInstance.Workbooks.Open($FileName, 2, $true)
$sheet = $wb.ActiveSheet
} catch {
Write-Error -ErrorRecord $_
return
}
for ($i = 2; $i -le $sheet.Range("A2").CurrentRegion.Rows.Count; $i++) {
try {
$id = $sheet.Range("A$i").Value2
$info1 = $sheet.Range("E$i").Value2
$info2 = $sheet.Range("G$i").Value2
} catch {
Write-Error -ErrorRecord $_
return
}
$results[$id] = New-Object -TypeName System.Management.Automation.PSObject |
Add-Member -MemberType NoteProperty -Name "Info1" -Value $info1 -PassThru |
Add-Member -MemberType NoteProperty -Name "Info2" -Value $info2 -PassThru
}
$wb.Close()
$results
}
end {
if ($_closeExcel) {
$ExcelInstance.DisplayAlerts = $false
$ExcelInstance.Quit()
[System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($ExcelInstance) | Out-Null
[GC]::Collect()
}
}
}
function Update-NewXLS {
[CmdletBinding()]
param (
[Parameter(Mandatory=$true,Position=0)]
[System.String]
$FileName,
[Parameter(Mandatory=$true,Position=1,ValueFromPipeline=$true)]
[System.Collections.Hashtable]
$OldData,
[Parameter(Mandatory=$false,Position=2)]
[ValidateNotNull()]
[Microsoft.Office.Interop.Excel.ApplicationClass]
$ExcelInstance = $null,
[Switch]
$AutoSave
)
begin {
$_closeExcel = $false
if ($ExcelInstance -eq $null) {
$_closeExcel = $true
try {
$ExcelInstance = New-Object -ComObject "Excel.Application"
} catch {
throw
}
}
}
process {
try {
$wb = $ExcelInstance.Workbooks.Open($FileName, 2, $false)
$sheet = $wb.ActiveSheet
} catch {
Write-Error -ErrorRecord $_
return
}
for ($i = 2; $i -le $sheet.Range("A2").CurrentRegion.Rows.Count; $i++) {
try {
$id = $sheet.Range("A$i").Value2
} catch {
Write-Error -ErrorRecord $_
return
}
if ($OldData.Contains($id)) {
$sheet.Range("E$i").Value2 = $OldData[$id].Info1
$sheet.Range("G$i").Value2 = $OldData[$id].Info2
} else {
$sheet.Range("A$($i):G$i").Interior.Color = [System.Drawing.ColorTranslator]::ToOle([System.Drawing.Color]::Red)
}
}
$ExcelInstance.DisplayAlerts = $false
if ($AutoSave) {
try {
$wb.Save()
} catch {
$AutoSave = $false
Write-Error -ErrorRecord $_
}
}
$ExcelInstance.DisplayAlerts = $true
}
end {
if ($_closeExcel -and $AutoSave) {
$ExcelInstance.DisplayAlerts = $false
$ExcelInstance.Quit()
[System.Runtime.Interopservices.Marshal]::FinalReleaseComObject($ExcelInstance) | Out-Null
[GC]::Collect()
} else {
$ExcelInstance.Visible = $true
}
}
}
$source = "O:\PowerShell Practice\OLD.xls"
$destination = "O:\PowerShell Practice\NEW.xls"
$objXL = New-Object -ComObject "Excel.Application"
Import-OldXLS -FileName $source -ExcelInstance $objXL | Update-NewXLS -FileName $destination -ExcelInstance $objXL↧
PowerShell Exlaining this Script, for Understanding
↧