使用EPPlus设置Excel工作表保护

我试图设置使用EPPlus的XLSM文件的工作表权限,但似乎我只能设置默认的保护级别,个人保护没有被设置。 为了logging,我试图在本文中以编程方式完成方法1。 以下是我正在使用的代码:

using (var p = new ExcelPackage("output.xlsm")) { var ws = p.Workbook.Worksheets["MySheet"]; // Set some cell values here // Filtering, sorting, protection ws.Cells[7, 1, 10, 5].AutoFilter = true; ws.View.FreezePanes(7, 1); ws.ProtectedRanges.Add("FilteredCells", new ExcelAddress(7, 1, 10, 5)); // Worksheet protection ws.Protection.AllowAutoFilter = true; ws.Protection.AllowDeleteColumns = false; ws.Protection.AllowDeleteRows = false; ws.Protection.AllowEditObject = false; ws.Protection.AllowEditScenarios = false; ws.Protection.AllowFormatCells = false; ws.Protection.AllowFormatColumns = false; ws.Protection.AllowFormatRows = false; ws.Protection.AllowInsertColumns = false; ws.Protection.AllowInsertHyperlinks = false; ws.Protection.AllowInsertRows = false; ws.Protection.AllowPivotTables = false; ws.Protection.AllowSelectLockedCells = false; ws.Protection.AllowSelectUnlockedCells = true; ws.Protection.AllowSort = true; ws.Protection.IsProtected = true; ws.Protection.SetPassword("hunter2"); p.SaveAs(new FileInfo("output.xlsm")); } 

这运行没有错误,但是当我在Excel中打开文件,或将其加载回EPPlus时,我发现应用了不同的保护选项:

 AllowAutoFilter = false AllowDeleteColumns = false AllowDeleteRows = false AllowEditObject = true AllowEditScenarios = true AllowFormatCells = false AllowFormatColumns = false AllowFormatRows = false AllowInsertColumns = false AllowInsertHyperlinks = false AllowInsertRows = false AllowPivotTables = false AllowSelectLockedCells = true AllowSelectUnlockedCells = true AllowSort = false IsProtected = true 

这些显然不是我之前设置的权限,所以我怎样才能确保它们设置正确? 其他一切都被正确保存。

这里是来源:

https://github.com/pruiz/EPPlus/blob/master/EPPlus/ExcelSheetProtection.cs

设置IsProtected属性将覆盖您的select:

  public bool IsProtected { get { return GetXmlNodeBool(_isProtectedPath, false); } set { SetXmlNodeBool(_isProtectedPath, value, false); if (value) { AllowEditObject = true; AllowEditScenarios = true; } else { DeleteAllNode(_isProtectedPath); //delete the whole sheetprotection node } } } 

将您的IsProtected = true调用移动到代码或句柄的起始位置,但是您意外地覆盖了以前的select。 我会查看该链接的属性,看看哪些将覆盖您现有的select。