【问题标题】:Check Excel file format from PowerScript not relying on file extension从不依赖文件扩展名的 PowerScript 检查 Excel 文件格式
【发布时间】:2021-06-07 05:58:16
【问题描述】:

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

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

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

有什么想法吗?

【问题讨论】:

    标签: excel powershell file-format


    【解决方案1】:

    我快速检查了 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"/>

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

    【讨论】:

    • 谢谢,很有帮助!
    【解决方案2】:

    在检查[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'
    }
    

    【讨论】:

    • 谢谢丹尼尔!我可能会先尝试 Grzegorz 的解决方案,但我可以肯定会使用您的脚本 sn-p 作为基础。
    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 2020-06-07
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多