programing

EPPlus를 사용하여 열 또는 셀을 읽기 전용으로 만듭니다.

testmans 2023. 4. 15. 08:29
반응형

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
            };

Excel 결과

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());
    }
}

두 번째 편집

다음 설정을 통해 워크시트를 보호하려고 시도했습니다.IsProtected에 가치를 두다.true를 설정합니다.Locked의 재산.false마지막 열을 제외한 모든 열에 대해.스프레드시트가 읽기 전용 모드가 아니었을 뿐만 아니라 모든 열의 데이터를 편집할 수 있었습니다.

하지만 실제 열 자체의 크기를 조정할 수 없다는 것을 깨달았습니다. 그래서 아마 이렇게 하고 있을 것입니다.그러나 열에 있는 각 셀을 잠그고 새 데이터를 입력할 수 없도록 합니다.

        for (int a = 1; a < 10; a++)
        {
            ws.Column(a).Style.Locked = false;
        }
        ws.Protection.IsProtected = true;

WorkSheet 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

EPPlus는 잠겨 있는 모든 셀에 디폴트로 설정되어 있을 수 있습니다.이 경우,Locked의 탓으로 돌리다false다른 열의 경우 IsProtected를 로 설정합니다.true.

혹시 다른 사람에게 도움이 될까봐 해답을 올려야겠다고 생각했어요.전체 워크시트를 protected로 설정해야 했지만Lockedfalse로 간주합니다.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;

그래서 저는 이 질문을 언급하고 있었고, 이렇게 자물쇠를 잠그는 방법을 알고 있습니다.

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;

에러가 없는지, 코드의 나머지를 확인해 주세요. : )

  1. 특정 열 또는 셀 그룹을 잠그려면 먼저 편집해야 하는 열을 알아야 합니다.두 번째 파라미터인 'new ExcelAddress'로 구분된 쉼표를 추가합니다(편집 가능한 열이 같은 순서가 아닐 때 쉼표로 구분하는 것이 좋습니다).

예: MWS 열만 잠급니다.Protected Ranges.추가("편집 가능", 새 Excel 주소("A3:A25, L3:L25, N3:N25"));

  1. 그런 다음 두 번째 부분은 전체 워크시트 ws를 보호하는 것입니다.보호.IsProtected = true;

언급URL : https://stackoverflow.com/questions/20751808/make-column-or-cells-readonly-with-epplus

반응형