在创建 excel 工作表时,有些数据或公式可能不希望被其他用户修改。锁定相应的单元格可以帮助保护数据和公式,避免内容被意外更改。本文将介绍如何使用 c# 和 vb.net 锁定 excel 中的特定单元格。
安装相关库
首先,需要在 .net 项目中添加用于处理 excel 文件的相关 dll 文件。你可以根据项目需求下载对应的程序包,或通过 nuget 安装相关库。
安装完成后,即可在项目中引用该库,并使用其提供的 api 对 excel 工作表中的单元格进行保护和编辑。
pm> install-package spire.xls
使用 c# 和 vb.net 锁定 excel 中的特定单元格
通常情况下,工作表中的所有单元格默认都处于锁定状态。因此,在锁定特定单元格或单元格区域之前,需要先将所有单元格解锁。需要注意的是,只有在保护工作表后,单元格锁定设置才会生效。
锁定 excel 中特定单元格的主要步骤如下:
- 创建一个 workbook 对象。
- 使用 workbook.loadfromfile() 方法加载 excel 文件。
- 通过 workbook.worksheet[sheetindex] 属性获取目标工作表。
- 获取工作表中的已用区域,并将该区域中的所有单元格解锁,将 cellrange.style.locked 属性设置为
false。 - 获取需要锁定的特定单元格,然后将 cellrange.style.locked 属性设置为
true。 - 使用 xlsworksheetbase.protect() 方法保护工作表。
- 使用 workbook.savetofile() 方法保存生成的文件。
这样即可只允许用户编辑指定区域,同时保护需要保留的数据或公式不被修改。
完整示例代码如下:
using spire.xls;
namespace lockcells
{
class program
{
static void main(string[] args)
{
//create a workbook instance
workbook workbook = new workbook();
//load an excel file
workbook.loadfromfile("input.xlsx");
//get the first worksheet
worksheet sheet = workbook.worksheets[0];
//unlock all cells in the used range of the worksheet
cellrange usedrange = sheet.range;
usedrange.style.locked = false;
//lock specific cells
cellrange cells = sheet.range["a1:c3"];
cells.style.locked = true;
//protect the worksheet with password
sheet.protect("123456", sheetprotectiontype.all);
//save the result file
workbook.savetofile("lockcells.xlsx", excelversion.version2016);
}
}
}知识扩展
在 c# 中锁定 excel 特定单元格,核心原理是:excel 默认所有单元格都处于“锁定”状态,但这种锁定只有在工作表被保护后才会生效。因此,标准做法是先将所有单元格设为“未锁定”(可编辑),再单独锁定需要保护的单元格,最后启用工作表保护并设置密码。
使用 spire.xls(免费、api 直观)
spire.xls 的 api 简洁明了,适合快速实现锁定功能。免费版有页数限制,可申请临时许可证去除水印。
安装:install-package spire.xls
using spire.xls;
namespace lockcells
{
class program
{
static void main(string[] args)
{
// 1. 创建工作簿并加载文件
workbook workbook = new workbook();
workbook.loadfromfile("input.xlsx");
// 2. 获取第一个工作表
worksheet sheet = workbook.worksheets[0];
// 3. 解锁已使用区域中的所有单元格(先让所有单元格可编辑)
cellrange usedrange = sheet.range;
usedrange.style.locked = false;
// 4. 锁定指定单元格区域(例如 a1:c3)
cellrange cellstolock = sheet.range["a1:c3"];
cellstolock.style.locked = true;
// 5. 使用密码保护工作表,使锁定生效
sheet.protect("123456", sheetprotectiontype.all);
// 6. 保存结果
workbook.savetofile("lockcells.xlsx", excelversion.version2016);
}
}
}关键说明:
usedrange.style.locked = false将整个已使用区域解锁。sheet.range["a1:c3"].style.locked = true锁定目标区域。sheet.protect("密码", sheetprotectiontype.all)启用保护,锁定才真正生效。
使用 aspose.cells(商业库,功能全面)
aspose.cells 通过 style.islocked 属性控制单元格锁定状态。
安装:install-package aspose.cells
using aspose.cells;
public static void lockspecificcells(string inputpath, string outputpath)
{
// 1. 加载工作簿
workbook workbook = new workbook(inputpath);
worksheet worksheet = workbook.worksheets[0];
// 2. 创建样式:先解锁所有单元格
style unlockstyle = workbook.createstyle();
unlockstyle.islocked = false;
worksheet.cells.applystyle(unlockstyle, new styleflag { locked = true });
// 3. 锁定指定单元格
style lockstyle = workbook.createstyle();
lockstyle.islocked = true;
worksheet.cells["a1"].setstyle(lockstyle);
worksheet.cells["b2"].setstyle(lockstyle);
worksheet.cells["c3"].setstyle(lockstyle);
// 4. 保护工作表(密码可选)
worksheet.protect(protectiontype.all, "123456");
// 5. 保存
workbook.save(outputpath);
}关键说明:
- 使用
styleflag { locked = true }确保样式中的islocked属性被应用。 worksheet.protect(protectiontype.all, "密码")同时设置保护类型和密码。
使用 epplus(免费开源,非商业免费)
epplus 通过 style.locked 属性控制锁定,需在设置样式后调用 protection 启用保护。
安装:install-package epplus
using officeopenxml;
public static void lockcellswithepplus(string inputpath, string outputpath)
{
excelpackage.licensecontext = licensecontext.noncommercial;
using (var package = new excelpackage(new fileinfo(inputpath)))
{
var ws = package.workbook.worksheets[0];
// 1. 先解锁所有单元格
ws.cells.style.locked = false;
// 2. 锁定指定单元格
ws.cells["a1:c3"].style.locked = true;
// 3. 启用工作表保护(可设置密码)
ws.protection.setpassword("123456");
ws.protection.isprotected = true;
// 可选:控制用户能否选择锁定的单元格
ws.protection.allowselectlockedcells = false;
package.saveas(new fileinfo(outputpath));
}
}关键说明:
- epplus 中所有单元格默认是锁定的,因此必须先
ws.cells.style.locked = false解锁全部,再锁定目标。 ws.protection.isprotected = true是使锁定生效的关键。
使用 closedxml(开源免费)
closedxml 通过 style.protection.setlocked() 方法控制单元格锁定。
安装:install-package closedxml
using closedxml.excel;
public static void lockcellswithclosedxml(string inputpath, string outputpath)
{
using (var workbook = new xlworkbook(inputpath))
{
var ws = workbook.worksheet(1);
// 1. 先解锁所有单元格
ws.cells().style.protection.setlocked(false);
// 2. 锁定指定单元格
ws.cell("a1").style.protection.setlocked(true);
ws.range("b2:c3").style.protection.setlocked(true);
// 3. 保护工作表(带密码)
ws.protect("123456");
workbook.saveas(outputpath);
}
}使用 open xml sdk(免费,底层操作)
open xml sdk 是微软官方库,直接操作 excel 的 xml 结构,适合需要精细控制的场景。
安装:install-package documentformat.openxml
using documentformat.openxml;
using documentformat.openxml.packaging;
using documentformat.openxml.spreadsheet;
public static void lockcellswithopenxml(string inputpath, string outputpath)
{
using (spreadsheetdocument doc = spreadsheetdocument.open(inputpath, true))
{
var workbookpart = doc.workbookpart;
var worksheetpart = workbookpart.worksheetparts.first();
var sheetdata = worksheetpart.worksheet.getfirstchild<sheetdata>();
// 1. 设置目标单元格的样式索引(需要先创建锁定样式)
// 简化示例:假设样式索引 0 为解锁,1 为锁定
setcelllocked(worksheetpart, "a1", true);
setcelllocked(worksheetpart, "b2", true);
// 2. 添加工作表保护
var sheetprotection = new sheetprotection
{
sheet = true,
password = "123456" // 注意:实际需要哈希处理
};
worksheetpart.worksheet.insertafter(sheetprotection, sheetdata);
worksheetpart.worksheet.save();
}
}注意:open xml sdk 的密码需要按 excel 规范进行哈希处理,实现较复杂。对于大多数场景,推荐使用上述高级库。
总结
通过以上代码,可以在 c# 中实现对 excel 特定单元格的锁定保护。首先加载 excel 文件并获取目标工作表,然后解锁工作表中的所有单元格,再将指定的 a1:c3 区域重新设置为锁定状态。最后通过密码保护工作表,使锁定设置正式生效,并将处理后的文件保存为新的 excel 文件。
这种方式适合需要保护公式、关键数据,同时允许用户编辑其他区域的 excel 场景。
到此这篇关于c#代码轻松实现锁定excel中的特定单元格的文章就介绍到这了,更多相关c#锁定excel特定单元格内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论