Excel "Protect Workbook" 是否有编程方式?

Is there a programmatically way for Excels "Protect Workbook"?

我正在将一些使用 Office Interop 库的遗留代码移动到 epplus,我不知道的一件事是如何设置工作簿以要求用户打开文件以只读方式打开它。就像用户单击文件 -> 信息 -> 保护工作簿 -> 始终以只读方式打开

我尝试设置此处所述的 DocSecurity 属性 (https://sno.phy.queensu.ca/~phil/exiftool/TagNames/OOXML.html),但没有成功。 excelWorkBook.Properties.SetExtendedPropertyValue("DocSecurity", "2");

我还尝试将以下节点添加到工作簿 xml <fileSharing readOnlyRecommended="1"/>

我什至尝试比较解压缩的 excel 受保护、不受保护的文件,但变化太多了。

可以做到,但不是很简单。设置 DocSecurity 可以通过生成 Workbook.Properties 对象来完成。但这只是其中的一半。您还需要在 Workbook 本身内设置标志,这只能通过 XML 操作来完成。

[TestMethod]
public void DocSecurity_Test()
{
    //
    var fi = new FileInfo(@"c:\temp\DocSecurity_Test.xlsx");
    if (fi.Exists)
        fi.Delete();

    using (var package = new ExcelPackage(fi))
    {
        //Create a simple workbook
        var workbook = package.Workbook;
        var worksheet = workbook.Worksheets.Add("Sheet1");
        worksheet.Cells["A1"].Value = "Test";

        //Extended properties is a singleton so reference it to generate the app.xml file
        //needed and add the security setting
        var extProps = workbook.Properties;
        extProps.SetExtendedPropertyValue("DocSecurity", "2");

        //Also need to tell the workbook itself but can only do it via XML
        var xml  = workbook.WorkbookXml;
        var att = xml.CreateAttribute("readOnlyRecommended");
        att.Value = "1";

        const string mainNs = @"http://schemas.openxmlformats.org/spreadsheetml/2006/main";
        var fileSharing = xml.CreateElement("fileSharing", mainNs);
        fileSharing.Attributes.Append(att);

        //Element must be at the beginning of the tree
        xml.DocumentElement.PrependChild(fileSharing);
        package.Save();
    }
}

看起来像这样: