1

我正在使用 Open XML SDK 创建 excel 文件。

我想用密码保护他们。

您是否知道使用 Open XML SDK 使用密码保护 excel 文件?

我知道保护它们的“com”对象方式,但是它不适合我的应用程序。我需要使用 Open XML SDK 或其他方式来保护文件。

4

1 回答 1

4

可以通过打开 xml 创建用于保护工作簿或工作表的 excel 密码。

以下代码示例是文森特的建议(http://spreadsheetlight.com/about/)(https://stackoverflow.com/users/12984/vincent-tan)(再次感谢他:)

        using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docname,true))
        {
            foreach (var worksheet in spreadSheet.WorkbookPart.WorksheetParts)
           {
                worksheet.Worksheet.Append(new SheetProtection(){ Password = “CC”});
               // add this in case it still doesn’t work. This makes sure the data is saved.
               //worksheet.Worksheet.Save();
           }
        }

如果你有图表或其他东西

以下代码示例是文森特的建议(http://spreadsheetlight.com/about/)(https://stackoverflow.com/users/12984/vincent-tan)(再次感谢他:)

bool bFound;
OpenXmlElement oxe;
SheetProtection prot;
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open("OtoPark.xlsx", true))
{
    foreach (var worksheet in spreadSheet.WorkbookPart.WorksheetParts)
    {
        prot = new SheetProtection();
        prot.Password = "CC";
        // these are the "default" Excel settings when you do a normal protect
        prot.Sheet = true;
        prot.Objects = true;
        prot.Scenarios = true;

        // Open up Excel and do a password protect yourself and use the
        // Productivity Tool to see the property values of the resulting Excel file.
        // Consider not using the Password property and use:
        //prot.AlgorithmName = "SHA-512";
        //prot.HashValue = "somehashvaluebythealgorithm";
        //prot.SaltValue = "somesalt";
        //prot.SpinCount = 100000;

        bFound = false;
        oxe = worksheet.Worksheet.FirstChild;
        foreach (var child in worksheet.Worksheet.ChildElements)
        {
            // start with SheetData because it's a required child element
            if (child is SheetData || child is SheetCalculationProperties)
            {
                oxe = child;
                bFound = true;
            }
        }

        if (bFound)
        {
            worksheet.Worksheet.InsertAfter(prot, oxe);
        }
        else
        {
            worksheet.Worksheet.PrependChild(prot);
        }

        worksheet.Worksheet.Save();
    }
}

这些方法可以保护任何用户无法意外更改数据。但是,如果您不希望任何不知道密码的用户查看数据,那么您可以使用以下库:

http://dotnetzip.codeplex.com/

您有一个受密码保护的压缩文件,其中包含使用 dotnetzip 库的 excel.xlsx 文件。

一个例子:

public void RNCreateZipFile(string ExcelDocName,string PassWord, string ZipDocName)
{
    // create a zip
    using (var zip = new ZipFile())
    {
        zip.Password = PassWord;
        zip.AddFile(ExcelDocName, "");
        zip.Save(ZipDocName);
    }
}
于 2013-03-07T20:33:24.813 回答