I found a workaround for the Excel 2016 issue where old .xls files freeze or crash after installing KB5002903.
The following method:
Checks exactly which Office 2016 components have KB5002903 installed.
Removes KB5002903 only from the affected Office components.
Hides KB5002903 from Microsoft Update to prevent the same update from being automatically installed again.
Please run PowerShell as Administrator.
Step 1 — Check where KB5002903 is installed
This step only reads information. It does not uninstall or modify anything.
$root = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products'
Get-ChildItem $root -ErrorAction SilentlyContinue | ForEach-Object {
$product = $_
$patches = Join-Path $product.PSPath 'Patches'
if (Test-Path $patches) {
Get-ChildItem $patches -ErrorAction SilentlyContinue | ForEach-Object {
$patch = Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue
if ($patch.DisplayName -match '5002903') {
$globalPatch = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Patches\$($_.PSChildName)"
$global = Get-ItemProperty $globalPatch -ErrorAction SilentlyContinue
$installProps = Get-ItemProperty (Join-Path $product.PSPath 'InstallProperties') -ErrorAction SilentlyContinue
[PSCustomObject]@{
DisplayName = $patch.DisplayName
PatchKey = $_.PSChildName
Uninstallable = $patch.Uninstallable
State = $patch.State
LocalPackage = $global.LocalPackage
ProductName = $installProps.DisplayName
UninstallString = $installProps.UninstallString
}
}
}
}
} | Format-List
If KB5002903 is installed, you should see entries similar to:
DisplayName : Security Update for Microsoft Excel 2016 (KB5002903) 64-Bit Edition
Uninstallable : 1
LocalPackage : C:\WINDOWS\Installer\xxxxx.msp
ProductName : Microsoft Office Professional Plus 2016
UninstallString : MsiExec.exe /X{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
Uninstallable : 1 means that the patch can be removed.
There may be several results because the same Office patch can be applied to multiple Office 2016 components.
Step 2 — Remove KB5002903 from all matching Office components
Close Excel, Word, PowerPoint, Outlook, and other Office applications first.
Then run the following in PowerShell as Administrator:
$root = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products'
$targets = Get-ChildItem $root -ErrorAction SilentlyContinue | ForEach-Object {
$product = $_
$patches = Join-Path $product.PSPath 'Patches'
if (Test-Path $patches) {
Get-ChildItem $patches -ErrorAction SilentlyContinue | ForEach-Object {
$patch = Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue
if ($patch.DisplayName -match '5002903') {
$globalPatch = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Patches\$($_.PSChildName)"
$global = Get-ItemProperty $globalPatch -ErrorAction SilentlyContinue
$installProps = Get-ItemProperty (Join-Path $product.PSPath 'InstallProperties') -ErrorAction SilentlyContinue
$productCode = $null
if ($installProps.UninstallString -match '\{[0-9A-Fa-f-]+\}') {
$productCode = $matches[0]
}
if ($patch.Uninstallable -eq 1 -and $productCode -and $global.LocalPackage) {
[PSCustomObject]@{
ProductName = $installProps.DisplayName
ProductCode = $productCode
LocalPackage = $global.LocalPackage
}
}
}
}
}
}
if (-not $targets) {
Write-Host "KB5002903 was not found, or no uninstallable installation was found."
}
else {
foreach ($target in $targets) {
Write-Host ""
Write-Host "Removing KB5002903 from:"
Write-Host $target.ProductName
if (-not (Test-Path $target.LocalPackage)) {
Write-Host "MSP file not found:" $target.LocalPackage
Write-Host "Skipping this component."
continue
}
$arguments = "/package $($target.ProductCode) /uninstall `"$($target.LocalPackage)`" /passive /norestart"
$process = Start-Process msiexec.exe `
-ArgumentList $arguments `
-Wait `
-PassThru
Write-Host "ExitCode =" $process.ExitCode
}
}
If you see:
ExitCode = 0
the patch was successfully removed from that Office component.
If KB5002903 was applied to several Office components, you should see one result for each component.
After all entries finish, restart Windows and try opening the affected .xls file again.
On my system, removing KB5002903 and restarting Windows restored the ability to open the affected Excel 97–2003 .xls files.
Step 3 — Hide KB5002903 so it is not automatically installed again
After confirming that uninstalling KB5002903 solves the problem, run the following in PowerShell as Administrator.
This searches Microsoft Update for KB5002903 and marks the currently offered update as hidden.
$session = New-Object -ComObject Microsoft.Update.Session
$searcher = $session.CreateUpdateSearcher()
$searcher.ServerSelection = 3
$searcher.ServiceID = '7971f918-a847-4430-9279-4a52d1efe18d'
Write-Host "Searching Microsoft Update. Please wait..."
$result = $searcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")
$found = $false
foreach ($update in $result.Updates) {
$kb = @($update.KBArticleIDs)
if ($update.Title -match 'KB5002903' -or $kb -contains '5002903') {
Write-Host "Found:" $update.Title
$update.IsHidden = $true
Write-Host "KB5002903 has been hidden."
$found = $true
}
}
if (-not $found) {
Write-Host "KB5002903 is not currently being offered by Microsoft Update."
}
If successful, you should see something similar to:
Found: Security Update for Microsoft Excel 2016 (KB5002903) 64-Bit Edition
KB5002903 has been hidden.
This allows other Windows and Microsoft updates to continue normally while preventing the currently offered KB5002903 update from being automatically installed again.
Important: Hiding the update is not necessarily a permanent block against every future revision. If Microsoft republishes KB5002903, replaces it with another KB, or releases a corrected version, Windows Update may offer a new update again.
Also remember that KB5002903 is a security update. Removing and hiding it should therefore be considered a temporary workaround while waiting for Microsoft to provide a corrected update.
Do not copy another user's Office Product GUID or .msp filename. The scripts above automatically detect the appropriate values from the local PC.
Disclosure: This troubleshooting guide and the PowerShell scripts above were generated with the help of ChatGPT, based on my troubleshooting request and the results observed on my own PC.