锁定单元格 :C# 控制 Excel 单元格编辑权限

在团队协作与数据流转日益频繁的今天,保护 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();

注意:RowsColumns 集合的索引均为 从 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 禁止任何操作

完整 API 参考

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 操作功能,可查看完整示例教程

相关推荐
老迟到的茉莉17 分钟前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
学逆向的21 分钟前
汇编——内存
开发语言·汇编·算法·网络安全
lbb 小魔仙1 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_1 小时前
Java 线程池
java·开发语言
丁小未2 小时前
基于MVVM框架的XUUI HelloWorld 新手教程
unity·性能优化·c#·游戏引擎
AI刀刀2 小时前
豆包智能体对话导出后,如何构建长期归档与高效检索体系?
android·人工智能·word·excel·ai导出鸭
杜子不疼.2 小时前
【Qt初识】信号槽(二):自定义信号函数与槽函数
开发语言·qt
ctrl_v助手2 小时前
C#日志工具类log4net的使用
开发语言·c#
Jazz_z2 小时前
通过 Java 实现 Word 转 TXT
java·c#·word
秋田君2 小时前
Qt_QVariant
开发语言·qt