2013-12-23 1 views
14

Есть ли способ сделать столбец или группу ячеек заблокированными или прочитанными только с помощью 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; 

ответ

5

EPPlus может быть недобросовестным всех клетки быть заблокирована, в этом случае вам необходимо установить атрибут Locked в false для других столбцов, а затем установите IsProtected в true.

+0

Только что сделал попытку в соответствии с этим и добавил его на свой пост в разделе «Второе редактирование». Это в основном то, о чем вы говорили? Если да, то можете ли вы взглянуть и посмотреть, заметили ли вы что-то неуместное? – NealR

+0

В принципе, да. Хотя я думаю, вы можете сразу установить свойство Locked для всего листа, а затем переопределить один столбец. Другая вещь, которую вам нужно сделать, - установить другие атрибуты атрибута Protection, которые управляют тем, что пользователь может и не может сделать с заблокированными ячейками. – richardtallent

+0

Это отлично работает, спасибо – NealR

0
ws.Column(10).Style.Locked = true; 

должны это сделать. пожалуйста, проверьте остальную часть вашего кода на наличии ошибок :)

+0

Кажется, что все будет хорошо, насколько, как я знаю, как использовать плагин. Просто добавили весь блок кода в сообщение, fyi. – NealR

4

Просто подумал, что отправлю решение, если оно поможет кому-либо еще. Я должен был установить всю рабочую таблицу, чтобы защитить, но установить для атрибута Locked значение false для каждого поля не Id.

 //Content 
     int i = 2; 
     foreach (var zip in results) 
     { 
      //Set cell values 
      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["I" + i.ToString()].Value = zip.ErrorCodes; 
      ws.Cells["J" + i.ToString()].Value = zip.Status; 
      ws.Cells["K" + i.ToString()].Value = zip.Id; 

      //Unlock non-Id fields 
      ws.Cells["A" + i.ToString()].Style.Locked = false; 
      ws.Cells["B" + i.ToString()].Style.Locked = false; 
      ws.Cells["C" + i.ToString()].Style.Locked = false; 
      ws.Cells["D" + i.ToString()].Style.Locked = false; 
      ws.Cells["E" + i.ToString()].Style.Locked = false; 
      ws.Cells["F" + i.ToString()].Style.Locked = false; 
      ws.Cells["G" + i.ToString()].Style.Locked = false; 
      ws.Cells["H" + i.ToString()].Style.Locked = false; 
      ws.Cells["I" + i.ToString()].Style.Locked = false; 
      ws.Cells["J" + i.ToString()].Style.Locked = false; 

      i++; 
     } 

     //Since we have to make the whole sheet protected and unlock each cell 
     //to allow for editing this loop is necessary 
     for (int a = 65000 - i; i < 65000; i++) 
     { 
      //Unlock non-Id fields 
      ws.Cells["A" + i.ToString()].Style.Locked = false; 
      ws.Cells["B" + i.ToString()].Style.Locked = false; 
      ws.Cells["C" + i.ToString()].Style.Locked = false; 
      ws.Cells["D" + i.ToString()].Style.Locked = false; 
      ws.Cells["E" + i.ToString()].Style.Locked = false; 
      ws.Cells["F" + i.ToString()].Style.Locked = false; 
      ws.Cells["G" + i.ToString()].Style.Locked = false; 
      ws.Cells["H" + i.ToString()].Style.Locked = false; 
      ws.Cells["I" + i.ToString()].Style.Locked = false; 
      ws.Cells["J" + i.ToString()].Style.Locked = false;     
     } 

     //Set worksheet protection attributes 
     ws.Protection.AllowInsertRows = true; 
     ws.Protection.AllowSort = true; 
     ws.Protection.AllowSelectUnlockedCells = true; 
     ws.Protection.AllowAutoFilter = true; 
     ws.Protection.AllowInsertRows = true; 
     ws.Protection.IsProtected = true; 
+1

Вы должны быть в состоянии выполнить то же самое с этим: "ws.Cells.Style.Locked = false; ws.Cells [" K "] Style.Locked = истина;.". Это разблокирует все ячейки на листе, а затем блокирует только ячейки в столбце K. (код @ Softwarehuset делает то же самое, что и второй оператор здесь, и я действительно предпочитаю индексировать столбцы по номеру, как он, но я хотел показать, что вы можете ссылайтесь на них также на букву. В любом случае вы можете пропустить все вещи, зависящие от строк.) – richardtallent

+0

Должен ли я по-прежнему защищать весь рабочий лист? Одна из проблем, с которыми мы столкнулись, заключается в том, что, похоже, вы не можете вырезать/вставить любые строки в рабочий лист с защитой. – NealR

+0

@NealR Я хотел упомянуть, что вы определили дважды - ws.Protection.AllowInsertRows = true; Это необходимо? –

5

Я добавляю два рабочих листа и должен защищать все столбцы, кроме одного по третьему индексу.

Это работало для меня :)

worksheet2.Cells["A1"].LoadFromDataTable(dt_Data, true); //------load data from datatable 
worksheet2.Protection.IsProtected = true; //--------Protect whole sheet 
worksheet2.Column(3).Style.Locked = false; //-------Unlock 3rd column 
+1

Я добавляю пароль, чтобы убедиться, что никто не может изменить рабочий лист контента. Protect.SetPassword (Guid.NewGuid(). ToString()); – dpfauwadel

0

Так что я имел в виду этот вопрос, и это, как я делаю замок.

worksheet.Protection.IsProtected = true; 
//I'm creating a template for users to fill in data.These headers 
//will come from database tables later on. 
//So tableHeaders is an array of strings 
for (int i = 1; i <= tableHeaders.Length; i++) 
      { 
       worksheet.Column(i).Style.Locked = false; 
      } 
//And then lock the first row. 
worksheet.Row(1).Style.Locked = true; 
//Additionally don't allow user to change sheet names 
excelPackage.Workbook.Protection.LockStructure = true; 
0

сначала заблокируйте весь лист, а затем разблокируйте ячейки, которые хотите разблокировать.

workSheet.Protection.IsProtected = true; 

workSheet.Cells[2, 3, pocDeatils.CityMaster.Rows.Count + 1, 4].Style.Locked = false; 

подробнее см ниже ссылку: https://epplus.codeplex.com/SourceControl/latest#SampleApp/Sample6.cs

Смежные вопросы