web-dev-qa-db-ja.com

EPPlusで列またはセルを読み取り専用にする

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;
18
NealR

EPPlusはデフォルトでallセル​​がロックされている可能性があります。この場合、_other列のLocked属性をfalseに設定する必要があります、次にIsProtectedをtrueに設定します。

7
richardtallent

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
10

それが他の誰かを助ける場合に備えて、私が解決策を投稿すると思いました。ワークシート全体を保護に設定する必要がありましたが、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;
4
NealR

だから私はこの質問を参照していました、そしてこれが私がロックを行う方法です。

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;
2
A4Abhiraj

最初にシート全体をロックしてから、ロックを解除するセルをロック解除します。

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

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

それを行う必要があります。エラーがないかコードの残りの部分を確認してください:)

0
Softwarehuset