Private/Workbook/Repair-TcWorkbookProperty.ps1
|
function Repair-TcWorkbookProperty { <# .SYNOPSIS Takes back out of a saved workbook what Excel writes about the person: name, company and folder. #> [CmdletBinding()] param( [Parameter(Mandatory)][string]$Path ) $rules = @{ 'docProps/core.xml' = { param([string]$Text) $Text -replace '<cp:lastModifiedBy>[^<]*</cp:lastModifiedBy>', '<cp:lastModifiedBy>TenantConverge</cp:lastModifiedBy>' -replace '<dc:creator>[^<]*</dc:creator>', '<dc:creator>TenantConverge</dc:creator>' } 'docProps/app.xml' = { param([string]$Text) $Text -replace '<Company>[^<]*</Company>', '<Company>TenantConverge</Company>' -replace '<Manager>[^<]*</Manager>', '' } 'xl/workbook.xml' = { param([string]$Text) $Text -replace '(?s)<mc:AlternateContent(?:(?!</mc:AlternateContent>).)*?x15ac:absPath(?:(?!</mc:AlternateContent>).)*?</mc:AlternateContent>', '' -replace '<x15ac:absPath[^>]*/>', '' } } Add-Type -AssemblyName System.IO.Compression.FileSystem $archive = [System.IO.Compression.ZipFile]::Open($Path, 'Update') try { foreach ($part in $rules.Keys) { $entry = $archive.GetEntry($part) if (-not $entry) { continue } $reader = [System.IO.StreamReader]::new($entry.Open(), [System.Text.Encoding]::UTF8) try { $text = $reader.ReadToEnd() } finally { $reader.Dispose() } $entry.Delete() $writer = [System.IO.StreamWriter]::new($archive.CreateEntry($part).Open(), [System.Text.UTF8Encoding]::new($false)) try { $writer.Write((& $rules[$part] $text)) } finally { $writer.Dispose() } } } finally { $archive.Dispose() } } |