Сравните два файла EXCEL, чтобы удалить повторяющиеся данные с помощью Powershell - PullRequest
0 голосов
/ 10 июля 2020

У меня есть лист Excel с количеством столбцов и строк, мне нужно удалить все столбцы, кроме одного, и удалить все строки, кроме предопределенного (есть другой лист Excel с одним столбцом и данными (в строках), которые должны быть Я сделал первое, а именно удалил все столбцы, кроме, но я смог сделать это только с номером столбца, и я хочу сделать это с именем заголовка, то есть «Название продукта», поскольку номер столбца может измениться с другими листами. Также хочу сделать то же самое с строками, чтобы я мог сравнить данные строк из моего ссылочного файла 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 голосов
/ 11 июля 2020

Если все ваши столбцы имеют заголовки в первой строке, вы можете использовать это:

$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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...