有没有办法使用EPPlus锁定或读取一列或一组单元格?我已尝试将下面的代码分开并一起使用,但似乎都没有达到预期的效果 . 整个工作表是锁定的(如果我包含 IsProtected
语句)或根本没有 .
ws.Protection.IsProtected = true;
ws.Column(10).Style.Locked = true;
EDIT
这是我的控制器的整个代码块
FileInfo newFile = new FileInfo("C:\\Users\\" + User.Identity.Name + "\\Desktop" + @"\\ZipCodes.xlsx");
ExcelPackage pck = new ExcelPackage(newFile);
var ws = pck.Workbook.Worksheets.Add("Query_" + DateTime.Now.ToString());
//Headers
ws.Cells["A1"].Value = "ChannelCode";
ws.Cells["B1"].Value = "DrmTerrDesc";
ws.Cells["C1"].Value = "IndDistrnId";
ws.Cells["D1"].Value = "StateCode";
ws.Cells["E1"].Value = "ZipCode";
ws.Cells["F1"].Value = "EndDate";
ws.Cells["G1"].Value = "EffectiveDate";
ws.Cells["H1"].Value = "LastUpdateId";
ws.Cells["J1"].Value = "ErrorCodes";
ws.Cells["K1"].Value = "Status";
ws.Cells["I1"].Value = "Id";
//Content
int i = 2;
foreach (var zip in results)
{
ws.Cells["A" + i.ToString()].Value = zip.ChannelCode;
ws.Cells["B" + i.ToString()].Value = zip.DrmTerrDesc;
ws.Cells["C" + i.ToString()].Value = zip.IndDistrnId;
ws.Cells["D" + i.ToString()].Value = zip.StateCode;
ws.Cells["E" + i.ToString()].Value = zip.ZipCode;
ws.Cells["F" + i.ToString()].Value = zip.EndDate.ToShortDateString();
ws.Cells["G" + i.ToString()].Value = zip.EffectiveDate.ToShortDateString();
ws.Cells["H" + i.ToString()].Value = zip.LastUpdateId;
ws.Cells["J" + i.ToString()].Value = zip.ErrorCodes;
ws.Cells["K" + i.ToString()].Value = zip.Status;
ws.Cells["I" + i.ToString()].Value = zip.Id;
i++;
}
//ws.Protection.IsProtected = true;
ws.Column(10).Style.Locked = true;
return new ExcelResult
{
FileName = "ZipCodes.xlsx",
Package = pck
};
ExcelResult
public class ExcelResult : ActionResult
{
public string FileName { get; set; }
public ExcelPackage Package { get; set; }
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.Buffer = true;
context.HttpContext.Response.Clear();
context.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + FileName);
context.HttpContext.Response.ContentType = "application/vnd.ms-excel";
context.HttpContext.Response.BinaryWrite(Package.GetAsByteArray());
}
}
Second Edit
我试图通过将 IsProtected
值设置为 true
来保护工作表,然后将 Locked
属性设置为除最后一列之外的每一列的 false
. 电子表格不仅不是只读模式,而且我可以编辑每列中的数据 .
我注意到,但是我无法自己调整实际列的大小,所以也许这就是我正在做的事情 . 但是,我想锁定列中的每个单元格,因此无法输入新数据 .
for (int a = 1; a < 10; a++)
{
ws.Column(a).Style.Locked = false;
}
ws.Protection.IsProtected = true;
6 回答
我正在添加两个WorkSheets,需要保护除第三个索引之外的所有列 .
这对我有用:)
EPPlus可能默认为所有被锁定的单元格,在这种情况下,您需要为其他列设置
Locked
属性为false
,然后将IsProtected设置为true
.只是想我会发布解决方案,以防它帮助其他人 . 我必须将整个工作表设置为受保护,但为每个非
Id
字段将Locked
属性设置为false .所以我提到了这个问题,这就是我如何进行锁定 .
应该这样做 . 请检查代码的其余部分是否有错误:)
先锁定整张纸,然后解锁要解锁的单元格 .
更多细节请参考以下链接:https://epplus.codeplex.com/SourceControl/latest#SampleApp/Sample6.cs