EPPlusを使用して、列またはセルのグループをロックまたは読み取り専用にする方法はありますか?私は以下のコードを別々におよび一緒に試しましたが、どちらも望ましい効果を持っているようには見えません。ワークシート全体がロックされている(IsProtected
ステートメントが含まれている場合)か、まったくロックされています。
ws.Protection.IsProtected = true;
ws.Column(10).Style.Locked = true;
[〜#〜]編集[〜#〜]
これが私のコントローラからのコードの全ブロックです
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());
}
}
2番目の編集
IsProtected
値をtrue
に設定してワークシートを保護し、最後の列を除くすべての列のLocked
プロパティをfalse
に設定しようとしました。スプレッドシートが読み取り専用モードになっていないだけでなく、すべての列のデータを編集できました。
しかし、実際の列自体のサイズを変更できないことに気づきました。おそらくこれが私がやっていることです。列の各セルをロックしたいので、新しいデータを入力できません。
for (int a = 1; a < 10; a++)
{
ws.Column(a).Style.Locked = false;
}
ws.Protection.IsProtected = true;
EPPlusはデフォルトでallセルがロックされている可能性があります。この場合、_other列のLocked
属性をfalse
に設定する必要があります、次にIsProtectedをtrue
に設定します。
2つのワークシートを追加し、3番目のインデックスにあるものを除くすべての列を保護する必要があります。
これは私のために働いた:)
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
それが他の誰かを助ける場合に備えて、私が解決策を投稿すると思いました。ワークシート全体を保護に設定する必要がありましたが、Locked
以外の各フィールドのId
属性をfalseに設定しました。
//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;
だから私はこの質問を参照していました、そしてこれが私がロックを行う方法です。
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;
最初にシート全体をロックしてから、ロックを解除するセルをロック解除します。
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
ws.Column(10).Style.Locked = true;
それを行う必要があります。エラーがないかコードの残りの部分を確認してください:)