Zrób kolumnę lub komórki tylko do odczytu za pomocą EPPlus
Czy istnieje sposób na zablokowanie lub odczyt tylko kolumny lub grupy komórek za pomocą EPPlus? Próbowałem kodu poniżej zarówno osobno, jak i razem, jednak żaden z nich nie wydaje się mieć pożądanego efektu. Albo cały arkusz jest zablokowany (jeśli dołączęIsProtected
oświadczenie) lub w ogóle nic.
ws.Protection.IsProtected = true;
ws.Column(10).Style.Locked = true;
EDYTOWAĆ
Oto cały blok kodu z mojego kontrolera
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());
}
}
Druga edycja
Próbowałem zabezpieczyć arkusz, ustawiającIsProtected
wartość dotrue
, a następnie ustawLocked
własność dofalse
dla każdej kolumny z wyjątkiem ostatniej. Arkusz kalkulacyjny nie tylko nie był w trybie tylko do odczytu, ale mogłem edytować dane w każdej kolumnie.
Zauważyłem jednak, że nie mogę zmienić rozmiaru samych kolumn, więc może to właśnie robię. Chciałbym jednak zablokować każdą komórkę w kolumnie, więc nie można wprowadzać nowych danych.
for (int a = 1; a < 10; a++)
{
ws.Column(a).Style.Locked = false;
}
ws.Protection.IsProtected = true;