基于服务器名匹配两个Excel并补充指定列的PowerShell实现求助
解决方案
步骤说明
- 先读取File_1的完整数据,用Server列作为键,把需要的
System、Sub-System V2.0、DRP三个字段存入哈希表,后续匹配时可快速查找对应数据。 - 打开File_2,添加对应三个列的表头,再逐行匹配VM名称,填充对应的数据。
- 最后保存修改并清理Excel COM对象,避免进程残留。
完整代码
# ---------------------- 读取File_1并构建哈希表 ---------------------- $file1Path = "C:\March 2023 V1-2.xlsx" $xl = New-Object -ComObject Excel.Application $xl.Visible = $false # 后台运行,不弹出Excel窗口 $wb1 = $xl.Workbooks.Open($file1Path) $ws1 = $wb1.Worksheets['Servers'] $usedRange1 = $ws1.UsedRange $rowCount1 = $usedRange1.Rows.Count # 构建哈希表:键=Server名称,值=包含目标字段的对象 $serverData = @{} for ($i=2; $i -le $rowCount1; $i++) { # 从第2行开始,跳过表头 $serverName = $ws1.Cells.Item($i, 1).Value2 # 第1列是Server if (-not [string]::IsNullOrEmpty($serverName)) { $serverData[$serverName] = [PSCustomObject]@{ System = $ws1.Cells.Item($i, 2).Value2 # 第2列是System SubSystem = $ws1.Cells.Item($i, 3).Value2 # 第3列是Sub-System V2.0 DRP = $ws1.Cells.Item($i, 8).Value2 # 第8列是DRP(按File_1实际列顺序调整) } } } $wb1.Close() $xl.Quit() # 清理COM对象,避免内存泄漏 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws1) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb1) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) | Out-Null Remove-Variable xl, wb1, ws1 # ---------------------- 处理File_2,填充匹配数据 ---------------------- $file2Path = "C:\Raw.xlsx" $xl2 = New-Object -ComObject Excel.Application $xl2.Visible = $false $wb2 = $xl2.Workbooks.Open($file2Path) $ws2 = $wb2.Worksheets['Sheet1'] $usedRange2 = $ws2.UsedRange $rowCount2 = $usedRange2.Rows.Count $currentColCount = $usedRange2.Columns.Count # 添加新列的表头(接在原有列之后) $ws2.Cells.Item(1, $currentColCount + 1).Value2 = "System" $ws2.Cells.Item(1, $currentColCount + 2).Value2 = "Sub-System V2.0" $ws2.Cells.Item(1, $currentColCount + 3).Value2 = "DRP" # 遍历File_2的每一行(从第2行开始) for ($i=2; $i -le $rowCount2; $i++) { $vmName = $ws2.Cells.Item($i, 1).Value2 # 第1列是VM if ($serverData.ContainsKey($vmName)) { # 填充对应列的数据 $ws2.Cells.Item($i, $currentColCount + 1).Value2 = $serverData[$vmName].System $ws2.Cells.Item($i, $currentColCount + 2).Value2 = $serverData[$vmName].SubSystem $ws2.Cells.Item($i, $currentColCount + 3).Value2 = $serverData[$vmName].DRP } } # 保存修改并关闭 $wb2.Save() $wb2.Close() $xl2.Quit() # 清理COM对象 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws2) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb2) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl2) | Out-Null Remove-Variable xl2, wb2, ws2 Write-Host "处理完成,结果已保存到 $file2Path"
关键注意点
- 列索引需对应:要根据实际Excel的列顺序调整代码中的列号(比如示例中
DRP是第8列,需和你的File_1列位置一致)。 - 哈希表优势:相比嵌套循环,哈希表的查找效率更高,数据量大时更明显。
- COM对象清理:必须手动释放Excel相关的COM对象,否则会有Excel进程残留占用系统资源。
内容的提问来源于stack exchange,提问作者snehasish nandy
相关产品推荐
相关产品推荐

