如何通过脚本自动化将带密码的Excel转换为无保护版本?
加密Excel转未加密版本的脚本化实现方案
以下是几种可行的脚本化方案,适用于已知密码的情况下将加密Excel转换为无保护版本,满足流程自动化需求:
方案1:Python + win32com(Windows环境,支持全Excel格式)
依赖本地安装的Excel COM对象,兼容性强,支持.xls和.xlsx格式,处理各种加密场景更稳定。
代码示例
import win32com.client as win32 import os def unlock_excel(input_path, output_path, password): excel = win32.Dispatch("Excel.Application") excel.Visible = False # 后台静默运行 try: # 打开加密文件 workbook = excel.Workbooks.Open(input_path, Password=password) # 若需解除工作表保护(如果存在),可添加以下代码 # for sheet in workbook.Sheets: # if sheet.ProtectContents: # sheet.Unprotect(password) # 工作表保护密码与文件密码一致时使用,否则替换为对应密码 # 保存为无密码版本,51对应.xlsx,56对应.xls workbook.SaveAs(output_path, Password="", FileFormat=51) print(f"未加密文件已生成:{output_path}") except Exception as e: print(f"处理失败:{str(e)}") finally: workbook.Close() excel.Quit() # 调用示例 input_file = "加密文件.xlsx" output_file = "未加密文件.xlsx" file_password = "your_password_here" unlock_excel(input_file, output_file, file_password)
前置准备
执行pip install pywin32安装依赖库,且本地需安装Microsoft Excel。
方案2:Python + openpyxl(跨平台,仅支持.xlsx)
无需安装Excel,仅支持.xlsx格式,适合轻量场景,对部分复杂加密方式可能不兼容。
代码示例
from openpyxl import load_workbook def unlock_xlsx(input_path, output_path, password): try: # 加载加密工作簿 wb = load_workbook(filename=input_path, read_only=False, password=password) # 解除工作表保护(若需要) # for sheet in wb.worksheets: # if sheet.protection.sheet: # sheet.protection.unprotect(password) # 保存无密码版本 wb.save(output_path) print(f"未加密文件已保存:{output_path}") except Exception as e: print(f"处理出错:{str(e)}") # 调用示例 unlock_xlsx("加密文件.xlsx", "未加密文件.xlsx", "your_password")
前置准备
执行pip install openpyxl安装依赖库。
方案3:PowerShell(Windows原生,无需额外安装语言环境)
利用Windows原生PowerShell调用Excel COM对象,适合无Python环境的Windows自动化场景。
代码示例
$inputPath = "加密文件.xlsx" $outputPath = "未加密文件.xlsx" $password = "your_password_here" $excel = New-Object -ComObject Excel.Application $excel.Visible = $false try { $workbook = $excel.Workbooks.Open($inputPath, $null, $null, $null, $password) # 解除工作表保护(若需要) # foreach ($sheet in $workbook.Sheets) { # if ($sheet.ProtectContents) { # $sheet.Unprotect($password) # } # } # 保存无密码版本,51对应.xlsx,56对应.xls $workbook.SaveAs($outputPath, 51, "") Write-Host "未加密文件生成成功:$outputPath" } catch { Write-Host "处理失败:$($_.Exception.Message)" } finally { $workbook.Close() $excel.Quit() # 清理COM对象,避免残留进程 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers() }
使用方式
将代码保存为.ps1文件,在PowerShell中执行即可。
内容的提问来源于stack exchange,提问作者Steve Hibbert
相关产品推荐
相关产品推荐

