必须用epplus或openxml sdk才能设置excel打开密码,因interop库仅支持已弃用的修改密码且无法触发加密;epplus需在excelpackage创建时设encryption.password并调用save(),且仅对新建文件有效。

Excel 保存时加密码,Microsoft.Office.Interop.Excel 不行
Interop 库根本没法给 Excel 文件设打开密码——它连“另存为加密格式”这个动作都触发不了。SaveAs 方法的 Password 参数只是设置“修改权限密码”,不是打开密码,而且从 Excel 2007 起这个参数已被弃用,设了也无效。真要加打开密码,得换底层协议。
必须用 EPPlus 或 OpenXML SDK 才能设打开密码
Office 2007+ 的 .xlsx 是 ZIP + XML 结构,打开密码是通过加密整个 ZIP 容器实现的(AES-128),不是在 Excel XML 里写个字段就能生效。所以只能靠支持 OPC 加密的库:
-
EPPlus(v5.8+)支持Package.Encryption.Password = "xxx",但注意:它只对新建文件有效,不能给已有文件加密码 -
DocumentFormat.OpenXml本身不提供加密 API,得配合System.IO.Packaging手动封装,代码量大、易出错 - 如果必须处理已有文件,推荐用
EPPlus读取再另存,或调用Microsoft.Office.Interop.Excel启动 Excel 进程执行 VBA(不推荐:依赖桌面环境、不稳定、无法部署到服务器)
EPPlus 加密码的典型写法和坑点
别直接 new Workbook 再设密码——得在创建 ExcelPackage 时传入 ExcelPackage.LicenseContext 并启用加密:
var fi = new FileInfo("out.xlsx");
using (var p = new ExcelPackage(fi))
{
p.Encryption.Password = "123456";
var ws = p.Workbook.Worksheets.Add("Sheet1");
ws.Cells["A1"].Value = "protected";
p.Save(); // 必须 Save(),SaveAs() 不触发加密
}
常见翻车点:
- 没引用
EPPlus.Core或用错版本(v6+ 移除了加密支持,必须用 v5.8.7) - 忘记调用
p.Save(),改用p.SaveAs(...)——后者会跳过加密流程 - 密码含 Unicode 字符(如中文):部分 Excel 版本打不开,建议只用 ASCII 字符
- 用
File.WriteAllBytes直接写流?不行——加密必须由ExcelPackage在关闭包时完成,中途写死字节会破坏 ZIP 结构
服务器环境别碰 Interop,也别信“用 PowerShell 调 Excel”的方案
Windows Server 默认禁用桌面交互组件,Interop 启动 Excel 进程大概率卡死或报错 0x800A03EC;PowerShell 脚本同理,且无法并发、无超时控制。真正生产可用的路径只有两条:
- 纯托管方案:
EPPlus(仅限新建或重写文件) - 走 COM 自动化(仅限有桌面环境的 Windows 客户端):必须预装对应版本 Excel,并用
Application.DisplayAlerts = false关闭弹窗,否则进程挂起
加密逻辑藏在 ZIP 容器层,不是 Excel 功能开关,这点很多人一开始根本没想到。











