Você pode usar o PowerShell! Podemos adaptar um script que escrevi para apresentações do PowerPoint para trabalhar em documentos do Excel.
[CmdletBinding()]
Param(
[Parameter(Mandatory = $true)][string]$File,
[Parameter()][int]$Quality = 50
)
Add-Type -AssemblyName System.IO.Compression
Add-Type -AssemblyName System.Drawing
$fs = New-Object System.IO.FileStream (Resolve-Path $File), 'Open'
$zip = New-Object System.IO.Compression.ZipArchive $fs, 'Update'
$zip.Entries | ? {$_.FullName.StartsWith('xl/media/')} | % {
$s = $_.Open()
$img = [System.Drawing.Image]::FromStream($s)
$s.Position = 0
$codec = [System.Drawing.Imaging.ImageCodecInfo]::GetImageDecoders() | ? {$_.FormatId -eq [System.Drawing.Imaging.ImageFormat]::Jpeg.Guid}
$qualityprop = [System.Drawing.Imaging.Encoder]::Quality
$encodeparams = New-Object System.Drawing.Imaging.EncoderParameters 1
$encodeparams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter $qualityprop, $Quality
$img.Save($s, $codec, $encodeparams)
$s.SetLength($s.Position)
$s.Close()
}
$zip.Dispose()
Dado um arquivo XLSX, o script converterá todas as imagens incorporadas no formato JPEG com uma configuração de qualidade ajustável que será padronizada para 50. Para usá-lo, primeiro salve esse script como um arquivo PS1, por exemplo, %código%. Se ainda não o fez, siga as instruções na seção Habilitando Scripts do wiki de tags do PowerShell . Em seguida, abra um prompt do PowerShell na pasta em que você salvou o script e execute-o assim:
.\xlsximg.ps1 C:\path\to\workbook.xlsx
Quando testei isso, reduzi uma pasta de trabalho contendo uma captura de tela incorporada de 109 KB para 49 KB. Se você precisar compactá-lo ainda mais, poderá especificar manualmente uma configuração de qualidade mais baixa, como:
.\xlsximg.ps1 C:\path\to\workbook.xlsx -Quality 20
Observe que ele modifica o arquivo no local, portanto, talvez você queira fazer um backup primeiro.