C#项目中能否用OpenXML SDK创建带打开密码的加密Excel文件?
哥们儿,我得直接给你说清楚:OpenXML SDK本身没办法实现设置Excel的打开密码。你之前写的代码其实是对的,但它做的不是你想要的事——我们来拆解下:
你用的WorkbookProtection类,是用来保护工作簿的结构和修订权限的,比如禁止别人删除工作表、修改修订记录这些,它的WorkbookPassword属性是用来解锁这些保护的密码,而不是打开文件的密码。这俩完全是两回事,Office把文件加密(打开需要密码)和内容保护(编辑需要密码)分成了两个独立的功能。
那如果不想用Devexpress、Spire.Xls这些付费库,有啥免费方案呢?给你几个可行的思路:
使用Microsoft.Office.Interop.Excel:这个是微软官方的COM互操作库,需要目标机器安装Office,适合桌面应用场景。示例代码大概是这样:
using Microsoft.Office.Interop.Excel; var excelApp = new Application(); var workbook = excelApp.Workbooks.Add(); // 做你的Excel内容编辑 workbook.Password = "Azerty123"; // 设置打开密码 workbook.SaveAs(@"C:\your-file.xlsx"); workbook.Close(); excelApp.Quit();使用开源库NPOI:这是一个免费的.NET库,支持读写Office文件,也能设置打开密码,而且不需要依赖Office安装。示例代码参考:
using NPOI.XSSF.UserModel; using System.IO; var workbook = new XSSFWorkbook(); var sheet = workbook.CreateSheet("Sheet1"); // 编辑内容 using (var fs = new FileStream(@"C:\your-file.xlsx", FileMode.Create)) { // 设置打开密码 ((XSSFWorkbook)workbook).SetPassword("Azerty123"); workbook.Write(fs); }进阶方案:手动处理OLE包加密:Office文件本质是ZIP格式的OLE包,加密是在包层面实现的。你可以用
System.IO.Packaging结合加密算法来手动处理,但这个过程非常繁琐,需要熟悉Office的加密规范,一般不推荐普通开发者这么做,除非你有特殊需求。
总结一下:如果要免费实现设置Excel打开密码,优先选NPOI(跨平台、无依赖)或者Interop(适合桌面环境),OpenXML SDK本身确实搞不定这个需求。
内容的提问来源于stack exchange,提问作者Jérémie Ruiz

