PowerShell Excel文件对比脚本修改:展示双向差异并保留表头
修改后的PowerShell脚本:双向对比Excel/CSV报表并保留表头
关键改进说明
- 自动识别文件的实际数据范围,无需手动指定单元格区域
- 完整保留原始表头并复制到结果文件
- 双向展示差异:值不同时同时显示原始和修改后内容;行/列仅存在于单个文件时标注"N/A"
- 可选高亮差异单元格(黄色背景),便于快速定位
- 优化Excel进程清理,避免后台残留
# 加载Excel COM对象 $excel = New-Object -ComObject Excel.Application # 禁用提示和屏幕更新以提升性能 $excel.DisplayAlerts = $false $excel.ScreenUpdating = $false # 打开需要对比的两个文件 $originalPath = "C:\Users\Conversion\Response_V2.csv" $modifiedPath = "C:\Users\Conversion\Response_V22.csv" $originalWorkbook = $excel.Workbooks.Open($originalPath) $modifiedWorkbook = $excel.Workbooks.Open($modifiedPath) # 获取第一个工作表 $originalWorksheet = $originalWorkbook.Worksheets.Item(1) $modifiedWorksheet = $modifiedWorkbook.Worksheets.Item(1) # 获取文件的实际使用范围(自动适配数据大小) $originalUsedRange = $originalWorksheet.UsedRange $modifiedUsedRange = $modifiedWorksheet.UsedRange # 计算最大行数和列数,确保覆盖两个文件的所有数据 $maxRows = [Math]::Max($originalUsedRange.Rows.Count, $modifiedUsedRange.Rows.Count) $maxCols = [Math]::Max($originalUsedRange.Columns.Count, $modifiedUsedRange.Columns.Count) # 创建结果工作簿 $resultsWorkbook = $excel.Workbooks.Add() $resultsWorksheet = $resultsWorkbook.Worksheets.Item(1) $resultsWorksheet.Name = "差异对比结果" # 复制表头到结果工作表 $resultsWorksheet.Range("A1").Resize(1, $maxCols).Value2 = $originalUsedRange.Rows(1).Value2 # 遍历所有行和列进行对比 for ($row = 2; $row -le $maxRows; $row++) { for ($col = 1; $col -le $maxCols; $col++) { # 获取原始文件的单元格值(如果行/列超出范围则为N/A) $originalValue = if ($row -le $originalUsedRange.Rows.Count -and $col -le $originalUsedRange.Columns.Count) { $originalUsedRange.Item($row, $col).Value2 } else { "N/A" } # 获取修改后文件的单元格值(如果行/列超出范围则为N/A) $modifiedValue = if ($row -le $modifiedUsedRange.Rows.Count -and $col -le $modifiedUsedRange.Columns.Count) { $modifiedUsedRange.Item($row, $col).Value2 } else { "N/A" } # 对比值并写入结果 if ($originalValue -ne $modifiedValue) { # 值不同时,显示双向内容 $resultsWorksheet.Cells.Item($row, $col).Value2 = "原始值: $originalValue | 修改后: $modifiedValue" # 可选:设置单元格背景色高亮差异(注释此行可取消高亮) $resultsWorksheet.Cells.Item($row, $col).Interior.ColorIndex = 6 # 黄色 } else { # 值相同时,直接复制内容 $resultsWorksheet.Cells.Item($row, $col).Value2 = $originalValue } } } # 自动调整列宽以适应内容 $resultsWorksheet.UsedRange.EntireColumn.AutoFit() # 保存结果文件 $resultsPath = "C:\Users\Conversion\Response_V99.xlsx" $resultsWorkbook.SaveAs($resultsPath) # 关闭所有工作簿并退出Excel $originalWorkbook.Close($false) $modifiedWorkbook.Close($false) $resultsWorkbook.Close($true) $excel.Quit() # 清理COM对象,避免Excel进程残留 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($originalWorksheet) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($modifiedWorksheet) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($resultsWorksheet) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($originalWorkbook) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($modifiedWorkbook) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($resultsWorkbook) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
内容的提问来源于stack exchange,提问作者Rakesh Vemulapalli
相关产品推荐
相关产品推荐

