在团队协作与数据流转日益频繁的今天,保护 Excel 文档中的关键数据(如公式、表头、基础参数)免受意外修改或未经授权的编辑,已成为保障数据完整性的基础要求。
本文将系统介绍如何使用 Free Spire.XLS for .NET 库,在 C# 中精准锁定 Excel 工作表的特定单元格、行或列,并提供关于工作表保护与权限设置的详细讲解。
1. 库的选择与安装
1.1 安装免费库
Free Spire.XLS for .NET 是一个完全免费的 Excel 操作组件,无需安装 Microsoft Office 即可创建、读取、修改及保护 Excel 文档。推荐通过 NuGet 包管理器安装:
在 Visual Studio 中打开"程序包管理器控制台",执行:
powershell
Install-Package FreeSpire.XLS
或使用 .NET CLI:
dotnetcli
dotnet add package FreeSpire.XLS
1.2 与其他 .NET Excel 库的对比
| 库 | 授权 | 需安装 Excel | 单元格格式/样式 | 工作表保护 & 密码 | 锁定特定单元格 |
|---|---|---|---|---|---|
| Free Spire.XLS for .NET | 完全免费 (查看限制) | ❌ 无需 | ✅ 全面支持 | ✅ 完整支持 | ✅ 精准锁定 |
| EPPlus (社区版) | 免费 (非商业),商业需授权 | ❌ 无需 | ✅ 丰富 | ✅ 支持 | ✅ 支持 |
| NPOI | Apache 2.0 免费 | ❌ 无需 | ✅ 基本支持 | ⚠️ 部分支持 | ⚠️ 复杂 |
| Microsoft.Office.Interop.Excel | 需 Office 授权 | ✅ 必须 | ✅ 完整 | ✅ 支持 | ✅ 支持 |
各库各有千秋。若追求 精准锁定单元格与完善的保护能力,Free Spire.XLS 提供了直观的 API 且无需安装 Excel。
3. 锁定单元格核心原理
Excel 单元格锁定机制的工作流程可概括为:
- 1️⃣ 默认状态:所有单元格
Style.Locked = true(但保护未激活时无效) - 2️⃣ 解除全表锁定:
sheet.Range.Style.Locked = false - 3️⃣ 锁定特定区域:
sheet.Range["A1:C5"].Style.Locked = true - 4️⃣ 激活保护:
sheet.Protect(password, SheetProtectionType.All)
关键认知:
- Excel 工作表中所有单元格默认
Locked = true,但此属性仅在工作表保护生效后才实际限制编辑。 - 因此,正确的锁定流程是:全表解锁 → 局部锁定 → 启用保护。
下图直观展示了这一逻辑:
是
否
开始
全局解锁所有单元格
局部锁定目标区域
是否开启工作表保护?
✅ 锁定生效
结束
❌ 锁定无效
4. 基础示例:锁定特定单元格
以下代码演示如何锁定单个单元格和一个区域,并设置密码保护:
csharp
using Spire.Xls;
class Program
{
static void Main(string[] args)
{
// 1. 加载工作簿
Workbook workbook = new Workbook();
workbook.LoadFromFile("示例.xlsx");
// 2. 获取第一个工作表
Worksheet sheet = workbook.Worksheets[0];
// 3. 解除工作表中所有单元格的锁定
sheet.Range.Style.Locked = false;
// 4. 锁定单元格 A2
sheet.Range["A2"].Style.Locked = true;
// 锁定区域 C3:E9
sheet.Range["C3:E9"].Style.Locked = true;
// 5. 启用工作表保护,设置密码 "123456"
sheet.Protect("123456", SheetProtectionType.All);
// 6. 保存文件
workbook.SaveToFile("锁定单元格.xlsx", ExcelVersion.Version2016);
workbook.Dispose();
}
}
执行后,A2 单元格及 C3:E9 范围内的内容将无法编辑,直至解除保护或输入密码。

5. 进阶:锁定整行或整列
业务场景中常需锁定标题行(如第1行)或公式列(如第C列):
csharp
using Spire.Xls;
Workbook workbook = new Workbook();
workbook.LoadFromFile("示例.xlsx");
Worksheet sheet = workbook.Worksheets[0];
// 解锁所有单元格
sheet.Range.Style.Locked = false;
// 锁定第 1 行 (行索引从 1 开始)
sheet.Rows[0].Style.Locked = true;
// 锁定第 3 列 (列索引从 0 开始,C 列为第 2 列)
sheet.Columns[2].Style.Locked = true;
sheet.Protect("password", SheetProtectionType.All);
workbook.SaveToFile("锁定行列.xlsx", ExcelVersion.Version2013);
workbook.Dispose();
注意:
Rows和Columns集合的索引均为 从 0 开始 。因此Rows[0]对应 Excel 第 1 行,Columns[2]对应第 C 列。
6. 高级保护选项
6.1 使用 SheetProtectionType 精细控制权限
SheetProtectionType 枚举决定了用户在受保护工作表中允许执行的操作。可通过按位组合实现灵活授权:
csharp
// 允许排序和筛选,但禁止修改内容与结构
sheet.Protect("password",
SheetProtectionType.Sorting | SheetProtectionType.Filtering);
常用枚举值含义:
| 枚举值 | 描述 |
|---|---|
SheetProtectionType.Content |
仅保护单元格内容 |
SheetProtectionType.FormattingCells |
允许设置单元格格式 |
SheetProtectionType.FormattingColumns |
允许设置列格式 |
SheetProtectionType.FormattingRows |
允许设置行格式 |
SheetProtectionType.InsertingRows |
允许插入行 |
SheetProtectionType.DeletingRows |
允许删除行 |
SheetProtectionType.Sorting |
允许排序 |
SheetProtectionType.Filtering |
允许筛选 |
SheetProtectionType.UsingPivotTables |
允许使用数据透视表 |
SheetProtectionType.All |
启用所有保护选项(默认) |
SheetProtectionType.None |
禁止任何操作 |
6.2 创建允许编辑的区域(AllowEditRange)
即使启用了工作表保护,也可为特定用户预留可编辑区域:
csharp
// 添加名为 "InputRange" 的可编辑区域,对应单元格 B1
sheet.AddAllowEditRange("InputRange", sheet.Range["B1"]);
// 之后正常保护工作表
sheet.Protect("password", SheetProtectionType.All);
如此,用户在受保护工作表中仍可编辑 B1 单元格,无需输入密码。
📚 7. 扩展:文件级加密与修改权限
除了工作表保护,Free Spire.XLS for .NET 还支持更高层次的文档安全:
7.1 设置文档打开密码
csharp
workbook.Protect("openPassword");
7.2 设置修改权限密码
csharp
workbook.SetWriteProtectionPassword("modifyPassword");
7.2 标记为最终版本
通过自定义属性添加标记,提醒用户此文档为最终版:
csharp
workbook.CustomDocumentProperties.Add("_MarkAsFinal", true);
通过本文的详细介绍与代码示例,开发者应当能够在 C# 项目中熟练运用 Free Spire.XLS for .NET 实现精细化的 Excel 单元格保护。该库在免费的前提下提供了足够的日常办公自动化能力,是处理 Excel 安全需求的一个可靠选择。如需解锁文档或者体验更多其他丰富的 Excel 操作功能,可查看完整示例教程。