Haga que la columna o las celdas sean de solo lectura con EPPlus
¿Hay alguna forma de hacer que una columna o grupo de celdas se bloquee o se lea solo con EPPlus? He intentado el código de abajo, ambos por separado y juntos, pero ninguno parece tener el efecto deseado. O la hoja de trabajo entera está bloqueada (si incluyo elIsProtected
declaración) o nada en absoluto.
ws.Protection.IsProtected = true;
ws.Column(10).Style.Locked = true;
EDITAR
Aquí está todo el bloque de código de mi controlador
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());
}
}
Segunda Edición
Intenté proteger la hoja de trabajo configurandoIsProtected
valor paratrue
, luego establece elLocked
propiedad afalse
para cada columna excepto la última. No solo la hoja de cálculo no estaba en modo de solo lectura, sino que también podía editar los datos en cada columna.
Sin embargo, me di cuenta de que no puedo cambiar el tamaño de las columnas reales, así que tal vez sea esto lo que estoy haciendo. Sin embargo, me gustaría bloquear cada celda de la columna para que no se puedan ingresar nuevos datos.
for (int a = 1; a < 10; a++)
{
ws.Column(a).Style.Locked = false;
}
ws.Protection.IsProtected = true;