【问题标题】:Compare two EXCEL files to delete duplicate data using Powershell使用 Powershell 比较两个 EXCEL 文件以删除重复数据
【发布时间】:2020-07-10 13:42:22
【问题描述】:

我有一个具有列数和行数的 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 

【问题讨论】:

  • 我是否理解正确,您要删除除一之外的所有列和除一之外的所有行?这意味着只剩下一个单元格。
  • 不,我希望删除所有列,除了一个正确的列,上面的代码这样做,但它使用列号(我使用 4 并将第 4 列保存在新文件中),但我想做同样的事情使用列标题。上面的代码是新文件,只有一列我想以列标题(“产品”)开头,我想使用“产品”而不是列号(4)。可能在其他表格列号更改中我有 1000 多张表格。
  • 另一件事是行。所以每列可能有 40 到 300 行,其中 30+ 在所有工作表中都是相同的,我想删除那些常见的行并保持唯一
  • @SyedAsadHaider - 这是必须使用 excel 完成的事情 - 使用特定于 excel 的文件类型?如果没有,那么导出到 CSV 并使用内置的 CSV cmdlet 似乎要容易得多。
  • 是的,我也可以下载 CSV 格式的文件,但我是 powershell 新手,对 CSV cmdlet 没有任何经验

标签: excel powershell


【解决方案1】:

如果你所有的列在第一行都有标题,你可以使用这个:

$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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2013-02-02
    相关资源
    最近更新 更多