比较两个EXCEL文件以使用Powershell删除重复数据

时间:2020-07-10 13:42:22

标签: excel powershell

我有一个具有行数和列数的excel工作表,我需要删除除一列以外的所有列,并删除除预定义的行之外的所有行(还有另一个需要有一个列和数据(行中)的excel工作表已删除。 我已经完成删除所有列的第一个操作,但是我只能使用列号来执行此操作,而我想使用标头名称(即“产品名称”)来执行此操作,因为列号可能会随其他工作表而变化。 还希望对Rows执行相同的操作,以便我可以比较参考execl.xlsx文件中的行数据并删除相同的行数据。

$file = "C:\TE.xlsx" # here goes the path and name of the excel file.
$ColumnsToKeep = 4 # Specify the column numbers to delete.
$excel = New-Object -comobject Excel.Application # Creating object of excel in powershell.
$excel.DisplayAlerts = $False
$excel.visible = $False


$workbook = $excel.Workbooks.Open($file)
$sheet = $workbook.Sheets.Item(1) # Referring to first sheet.


$maxColumns = $sheet.UsedRange.Columns.Count

$ColumnsToRemove = Compare-Object $ColumnsToKeep (1..$maxColumns) | Where-Object{$_.SideIndicator -eq "=>"} | Select-Object -ExpandProperty InputObject
0..($ColumnsToRemove.Count - 1) | %{$ColumnsToRemove[$_] = $ColumnsToRemove[$_] - $_}
$ColumnsToRemove  | ForEach-Object{
[void]$sheet.Cells.Item(1,$_).EntireColumn.Delete()
}


$workbook.SaveAs("C:\data1.XLSX")


$workbook.Close($true)
$excel.Quit()
[void][System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
Remove-Variable excel 

1 个答案:

答案 0 :(得分:0)

提供的所有列的第一行都包含标题,您可以使用以下方法:

$file = "C:\TE.xlsx"
$columnToKeep = 'product'

$excel = New-Object -ComObject Excel.Application
$excel.DisplayAlerts = $false
$excel.Visible = $false

$workbook = $excel.Workbooks.Open($file)
$sheet    = $workbook.Worksheets.Item(1)

$maxColumns = $sheet.UsedRange.Columns.Count

# remove all columns except the one with header named $columnToKeep
for ($col = 1; $col -le $maxColumns; $col++) {
    if ($sheet.Cells.Item(1, $col).Value() -ne $columnToKeep) { 
        [void]$sheet.Columns($col).EntireColumn.Delete()
    }
}

$workbook.SaveAs("C:\data1.XLSX")
$workbook.Close($true)
$excel.Quit()

## clean-up used Com objects
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()