如何以编程方式从excel工作簿中删除密码?

时间:2019-01-09 05:10:55

标签: excel powershell

几周前,我不得不从应用程序创建的excel文件中删除密码保护。我没有密码。可以使用Powershell使用xml转换完成此任务吗?

1 个答案:

答案 0 :(得分:-1)

这是我想与您分享的我的解决方案。 Powershell脚本使用Powershell从Excel文件中删除密码和工作表保护。无需Excel应用程序,也不需要密码。该脚本仅适用于.xlsx文件类型,不适用于.xls。如果您有改进的想法,请告诉我。谢谢。

    Add-Type -AssemblyName System.IO.Compression
    Add-Type -AssemblyName System.IO.Compression.FileSystem

    #-----------------------------------------------------------------------
    function Remove-Excel-WriteProtection {
    <#
    // Removes all password and write protection from existing excel file
    // (workbook and worksheets). 
    // No password needed.
    // 
    // Input:   Path to Excel file (must newer xlsx format)
    // Output:  true if successfull
    #>
    #-----------------------------------------------------------------------
        param(
            [Parameter(Mandatory=$true)]
            [string]$filePathExcel     
        )

        if( !(Test-Path -Path $filePathExcel) -or 
            !(Split-Path -Path $filePathExcel -Leaf).EndsWith('xlsx') ) {
            return $false
        }

        $fileItem      = Get-Item $filePathExcel
        $filePathZip   = $fileItem.DirectoryName + '\' + $fileItem.BaseName + '.zip'
        $filePathTemp  = $fileItem.DirectoryName + '\' + ([System.Guid]::NewGuid()).Guid 

        Rename-Item -Path $filePathExcel -NewName $filePathZip -Force
        Expand-Archive -Path $filePathZip -DestinationPath $filePathTemp -Force

        $xml = New-Object System.Xml.XmlDocument
        $xml.PreserveWhitespace = $true

        $workbookCollection = (Get-ChildItem -Path $filePathTemp -Filter 'workbook.xml' -Recurse -Force)

        foreach( $workbook in $workbookCollection ) {

            [void]$xml.RemoveAll()
            [void]$xml.Load($workbook.FullName)

            if( $xml.workbook.fileSharing.readOnlyRecommended -or $xml.workbook.fileSharing.reservationPassword ) {

                if( $xml.workbook.fileSharing.readOnlyRecommended ) {
                    $xml.workbook.fileSharing.readOnlyRecommended = '0'
                }
                if( $xml.workbook.fileSharing.reservationPassword ) {
                    $xml.workbook.fileSharing.reservationPassword = ''
                }

                [void]$xml.Save($workbook.FullName)
            }
        }

        $worksheetCollection = (Get-ChildItem -Path $filePathTemp -Filter 'sheet*.xml' -Recurse -Force)

        foreach( $worksheet in $worksheetCollection ) {

            [void]$xml.RemoveAll()
            [void]$xml.Load($worksheet.FullName)

            if( $xml.worksheet.sheetProtection ) {
                [void]$xml.worksheet.RemoveChild($xml.worksheet.sheetProtection)
                [void]$xml.Save($worksheet.FullName)
            }
        }

        Remove-Item -Path $filePathZip -Force
        Compress-Archive -Path ($filePathTemp + '\*') -DestinationPath $filePathZip -Force -CompressionLevel Optimal
        Remove-Item -Path $filePathTemp -Recurse -Force
        Rename-Item -Path $filePathZip -NewName $filePathExcel -Force

        return $true
    }

    # Remove all passwords for test.xlsx

    $result = Remove-Excel-WriteProtection -filePathExcel 'C:\Users\YourName\Desktop\test.xlsx'