从 PowerScript 检查 Excel 文件格式,不依赖于文件扩展名

问题描述

我们有许多以 .xlsx 或 .xlsm 格式存储的 Excel 文件。不幸的是,文件扩展名的最后一个字母被丢弃在另一个 IT 系统中,因此它们的文件扩展名都为 .xls。但我们也有以 .xls 格式存储的 Excel 文件

我需要编写一个 PowerShell 脚本来检测实际的 Excel 文件格式,然后重命名文件,使其文件扩展名适合内容。我们有数千个这样的文件,因此无法手动选择。

我找到了有关如何区分 .xls 和较新的 XML 格式(如 .xlsx 和 .xlsm)的信息(通过检查文件中的第一个字符)。 但我还没有找到任何关于如何确定它是 .xlsx 还是 .xlsm 的信息。

有什么想法吗?

解决方法

我快速检查了 xlsxxlsm 文件的内容类型。 仅供参考,excel文件是包含各种信息和内容的档案。

您可以做的是解压缩两个文件并检查文件 [Content_Types].xml

XLSX 具有:

<Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml"/>

而 XLSM 有:

<Override PartName="/xl/workbook.xml" ContentType="application/vnd.ms-excel.sheet.macroEnabled.main+xml"/>

从这里你可以继续前进:)

,

我在检查 [Content_Types].xml 文件时发现了与 Grzegorz 类似的东西。当文件中有 vba 项目时,将存在以下条目

<Default
    Extension="bin"
    ContentType="application/vnd.ms-office.vbaProject"

这是我写的一些简单的代码来检查这个条目是否存在

$excelFile = 'C:\temp\macro_workbook.xlsm'
$archive = Expand-Archive $excelFile -DestinationPath "c:\temp\$(Split-Path $excelFile -LeafBase)" -PassThru -Force

$contentTypesFile = $archive | Where-Object name -EQ '[Content_Types].xml'
$xml = [xml](Get-Content -LiteralPath $contentTypesFile)

if ($xml.types.default.extension -contains 'bin') {
    Write-Host 'VBA project found - xlsm file'
}
else {
    Write-Host 'Not a VBA project'
}