压缩 Excel 工作簿中的所有图像

压缩 Excel 工作簿中的所有图像

我有一本包含 150 多个工作表的工作簿。每张工作表都包含一张图片,该图片是从另一本包含 150 张工作表的工作簿复制到每张工作表的。这个过程是通过手动将图片 1 从工作簿 A 复制到工作簿 B、将图片 2 从工作簿 A 复制到工作簿 B 等等来完成的。

问题在于,由于图像被粘贴为“图片”而不是“保留源格式”,因此复制图片的工作簿变得非常大。

如何压缩大型工作簿中的所有图像?我已经应用了 Excel 的默认“压缩图片”(电子邮件 (96 ppi))分辨率。这有助于减小文档的大小,但与复制图像的文档相比,它仍然很大。

答案1

您可以使用 PowerShell!我们可以适应我为 PowerPoint 演示文稿编写的脚本适用于 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()

给定一个 XLSX 文件,该脚本会将所有嵌入的图像转换为 JPEG 格式,并可调整质量设置,默认为 50。要使用它,首先将该脚本保存为 PS1 文件,例如xlsximg.ps1。如果您还没有这样做,请按照启用脚本部分中的说明进行操作PowerShell 标签 wiki。然后打开 PowerShell 提示符到保存脚本的文件夹并像这样运行它:

.\xlsximg.ps1 C:\path\to\workbook.xlsx

当我测试时,它将包含嵌入屏幕截图的工作簿从 109 KB 缩小到 49 KB。如果需要进一步压缩,可以手动指定较低的质量设置,如下所示:

.\xlsximg.ps1 C:\path\to\workbook.xlsx -Quality 20

请注意,它会就地修改文件,因此您可能需要先进行备份。

答案2

Excel 不是用来存储图像的。您可以尝试从外部链接嵌入图像,因此工作表将不包含图像本身,而是从其他来源获取图像

相关内容