Есть ли способ сделать столбец или группу ячеек заблокированными или прочитанными только с помощью EPPlus? Я пробовал код ниже как отдельно, так и вместе, но, похоже, не имеет желаемого эффекта. Либо весь лист заблокирован (если я включаю в себя заявление IsProtected
) или вообще ничего.Сделать столбец или ячейки только с помощью EPPlus
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());
}
}
Второй Edit
Я попытался сделать таблицу защищенной, установив значение IsProtected
в true
, затем установите Locked
свойство false
для каждого столбца, за исключением последнего. Не только электронная таблица не была доступна только для чтения, но я мог редактировать данные в каждом столбце.
Я заметил, что я не могу изменять размеры самих столбцов, поэтому, возможно, это то, что я делаю. Однако я хотел бы заблокировать каждую ячейку в столбце, поэтому новые данные не могут быть введены.
for (int a = 1; a < 10; a++)
{
ws.Column(a).Style.Locked = false;
}
ws.Protection.IsProtected = true;
Только что сделал попытку в соответствии с этим и добавил его на свой пост в разделе «Второе редактирование». Это в основном то, о чем вы говорили? Если да, то можете ли вы взглянуть и посмотреть, заметили ли вы что-то неуместное? – NealR
В принципе, да. Хотя я думаю, вы можете сразу установить свойство Locked для всего листа, а затем переопределить один столбец. Другая вещь, которую вам нужно сделать, - установить другие атрибуты атрибута Protection, которые управляют тем, что пользователь может и не может сделать с заблокированными ячейками. – richardtallent
Это отлично работает, спасибо – NealR