You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:47:16