Есть ли программный способ для Excels "Protect Workbook"? - PullRequest
0 голосов
/ 11 октября 2019

Я перевожу какой-то унаследованный код с использованием библиотек Office Interop в epplus. Одна вещь, которую я не могу понять, - это как настроить рабочую книгу, чтобы попросить пользователя открыть файл, чтобы открыть его только для чтения. Например, если пользователь нажимает Файл -> Информация -> Защитить книгу -> Всегда открывать только для чтения

Я попытался установить указанное здесь свойство DocSecurity (https://sno.phy.queensu.ca/~phil/exiftool/TagNames/OOXML.html),, но безуспешно. excelWorkBook.Properties.SetExtendedPropertyValue("DocSecurity", "2");

Я также пытался добавить следующий узел в рабочую книгуxml <fileSharing readOnlyRecommended="1"/>

Я даже пытался сравнить разархивированные файлы Excel, защищенные, незащищенные, но изменений было слишком много.

1 Ответ

0 голосов
/ 16 октября 2019

Это может быть сделано, но это не совсем просто. Установка DocSecurity может быть выполнена путем генерации объекта Workbook.Properties. Но это только половина. Вам также необходимо установить флаг внутри самого Workbook, что можно сделать только с помощью XML-манипуляции.

[TestMethod]
public void DocSecurity_Test()
{
    ///12983750/est-li-programmnyi-sposob-dlya-excels-protect-workbook
    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();
    }
}

Что будет выглядеть так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...