Excel文件密码保护分打开密码(Password)和修改密码(WritePassword);Interop需显式指定FileFormat并避免空字符串,EPPlus则需SaveAs前调Encrypt且仅支持文件级AES加密。

Excel 保存时加密码用 Workbook.SaveAs,但得配对 Password 和 WritePassword
Excel 文件的“密码保护”其实分两种:打开密码(Password)和修改密码(WritePassword)。C# 里用 Microsoft.Office.Interop.Excel 操作时,很多人只设一个,结果双击打不开或弹窗不提示输密码——本质是没搞清 Excel 自身的密码机制。
实操建议:
-
SaveAs必须显式传入FileFormat,比如XlFileFormat.xlOpenXMLWorkbook(.xlsx),否则密码可能被忽略 - 如果只要“打开即要密码”,只设
Password参数;如果允许只读打开、但编辑前要输密码,就只设WritePassword - 两个密码可以不同,但不能为空字符串(
"")——空值会被 Excel 当作无密码处理 - 注意:.xls 格式(旧版)不支持 AES 加密,安全性弱,且
SaveAs对它的密码支持不稳定,优先用 .xlsx
用 EPPlus 实现加密更可靠,但得调 Encrypt 而不是 Save
Interop 方式依赖本地 Office 安装,出错多、部署难、服务器上常崩。EPPlus(v5+)是纯 .NET 库,支持 AES-256 加密,且 API 明确。
常见错误现象:调了 package.SaveAs(path) 后文件能打开,但没密码提示——因为忘了在保存前调 Encrypt。
实操建议:
- 必须在
SaveAs前调用package.Encrypt("your-password"),顺序不能反 - EPPlus 不区分“打开密码”和“修改密码”,它只做文件级加密:输错密码直接打不开,没有只读绕过
- 加密后无法用 Excel 的“另存为”去掉密码(不像 Interop 生成的文件),这是好事,也是限制
- 注意 NuGet 包版本:
EPPlusv6+ 需要 license(免费版有水印),v5.8.7 是最后一个完全免费且稳定的带加密功能版本
密码设了却无效?检查 Protection 和 Encrypt 别混用
有人把工作表保护(Worksheet.Protect("pwd"))和文件加密当成一回事,结果导出的 Excel 双击就能开——那只是锁了单元格编辑,不是加密文件本身。
使用场景差异:
-
Worksheet.Protect:防误删/改数据,右键“撤销工作表保护”就能解除,不防打开 -
Workbook.Password/package.Encrypt:文件级加密,操作系统层拦截,没密码连 Excel 都加载不了内容 - 两者可共存,但目标完全不同;混淆会导致“以为加了密,其实谁都能打开”
Linux 服务器跑 C# 时,Interop 方式根本走不通
错误信息类似:System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed——这是 Office COM 组件在无桌面环境下的典型报错。
性能与兼容性影响:
- Interop 在 Windows Server 上需安装完整 Office + DCOM 配置,维护成本高,且并发稍高就卡死
- EPPlus 纯托管代码,跨平台(.NET 5+),Linux/macOS 都能跑,内存占用低,适合 Web API 场景
- 但 EPPlus 加密后的文件,某些老版本 Excel(如 2007)可能提示“文件损坏”,建议最低兼容 Excel 2010+
复杂点在于:加密不是开关按钮,它绑定在文件格式、库实现、运行环境三者之上。少一个条件满足,密码就形同虚设。尤其别在没验证的情况下假设“设了 Password 就安全了”。










