在C#开发中,给Excel文件设置密码保护是常见的安全需求,既可以设置打开文件时的验证密码,也可以设置工作表编辑的保护密码,防止文件内容被随意篡改。下面分别介绍两种主流的实现方案。

方案一:使用NPOI库实现Excel加密
NPOI是免费开源的.NET Excel操作库,支持xls和xlsx格式的文件处理,无需安装Office环境即可使用。首先需要通过NuGet安装NPOI相关包,安装命令如下:
Install-Package NPOI Install-Package NPOI.OOXML
1. 设置Excel打开密码
xlsx格式的文件设置打开密码的示例代码如下:
using NPOI.OpenXml4Net.OPC;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
namespace ExcelEncryptDemo
{
class NpoiEncrypt
{
public static void SetOpenPassword(string filePath, string password)
{
// 创建xlsx工作簿
IWorkbook workbook = new XSSFWorkbook();
// 创建一个工作表
ISheet sheet = workbook.CreateSheet("数据页");
// 添加示例数据
IRow row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue("测试数据1");
row.CreateCell(1).SetCellValue("测试数据2");
// 设置打开密码
if (workbook is XSSFWorkbook xssfWorkbook)
{
// 获取OPC包
OPCPackage opcPackage = xssfWorkbook.GetPackage();
// 设置加密属性,指定打开密码
opcPackage.EncryptionOption = EncryptionOption.AES_256;
opcPackage.Password = password;
}
// 保存文件
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(fs);
}
}
}
}
2. 设置工作表保护密码
如果需要限制用户编辑工作表内容,可以设置工作表保护密码,示例代码如下:
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
namespace ExcelEncryptDemo
{
class NpoiProtect
{
public static void SetSheetProtectPassword(string filePath, string password)
{
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("保护页");
// 添加示例数据
IRow row = sheet.CreateRow(0);
row.CreateCell(0).SetCellValue("受保护的内容");
// 设置工作表保护密码,指定允许的操作
sheet.ProtectSheet(password);
// 可以单独设置允许的操作,比如允许选择单元格
// sheet.ProtectSheet(password, true, true, true);
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(fs);
}
}
}
}
方案二:使用Spire.XLS库实现Excel加密
Spire.XLS是功能更全面的Excel操作库,支持更多高级功能,不过商业使用需要购买授权。首先通过NuGet安装Spire.XLS包:
Install-Package Spire.XLS
1. 设置Excel打开密码
Spire.XLS设置打开密码的代码更简洁,示例如下:
using Spire.Xls;
using System;
namespace ExcelEncryptDemo
{
class SpireEncrypt
{
public static void SetOpenPassword(string filePath, string password)
{
// 创建工作簿实例
Workbook workbook = new Workbook();
// 添加一个工作表
Worksheet sheet = workbook.Worksheets[0];
sheet.Name = "数据页";
// 添加示例数据
sheet.Range["A1"].Text = "测试数据1";
sheet.Range["B1"].Text = "测试数据2";
// 设置打开密码
workbook.Protect(password);
// 保存文件
workbook.SaveToFile(filePath);
}
}
}
2. 设置工作表保护密码
设置工作表保护密码的示例代码如下:
using Spire.Xls;
using System;
namespace ExcelEncryptDemo
{
class SpireProtect
{
public static void SetSheetProtectPassword(string filePath, string password)
{
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];
sheet.Name = "保护页";
sheet.Range["A1"].Text = "受保护的内容";
// 设置工作表保护密码,可指定保护选项
sheet.Protect(password, SheetProtectionType.All);
// 保存文件
workbook.SaveToFile(filePath);
}
}
}
两种方案对比
两种方案的特点对比如下:
| 对比项 | NPOI | Spire.XLS |
|---|---|---|
| 授权费用 | 免费开源 | 商业使用需付费 |
| 功能丰富度 | 基础功能完善 | 支持更多高级功能 |
| 代码复杂度 | 稍复杂,需处理更多底层细节 | 简洁,封装度高 |
| 适用场景 | 预算有限、基础Excel操作需求 | 复杂Excel处理需求、商业项目 |
注意事项
- 设置打开密码后,用户打开文件时需要输入正确密码才能查看内容,密码丢失无法找回,需妥善保管。
- 工作表保护密码仅限制编辑操作,不会阻止用户打开文件,可根据需求选择两种密码的组合使用。
- NPOI设置xls格式文件的打开密码逻辑与xlsx不同,若需要处理旧格式文件,需参考对应版本的官方文档。