首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Open XML对Excel文档进行密码保护

如何使用Open XML对Excel文档进行密码保护
EN

Stack Overflow用户
提问于 2016-09-12 19:50:00
回答 3查看 7.2K关注 0票数 6

现在,我正在通过传递一个MemoryStream参数,使用Open XML的SpreadsheetDocument类创建一个新的Excel文档。我现在需要在这个SpreadsheetDocument对象上设置一个密码,但是我所尝试的似乎不起作用。将打开Excel文档,而不要求输入密码。下面是我到目前为止已经尝试过的( MemoryStream参数是mem):

代码语言:javascript
运行
复制
using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(mem, true))
{
    foreach (var sheet in spreadsheet.WorkbookPart.WorksheetParts)
    {
        sheet.Worksheet.Append(new SheetProtection() { Password = "test" });
    }
}

我还尝试了以下几种方法,但都没有成功:

代码语言:javascript
运行
复制
using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(mem, true))
{
    spreadsheet.WorkbookPart.Workbook.WorkbookProtection = new WorkbookProtection
    {
        LockStructure = true,
        LockWindows = true,
        WorkbookPassword = "test"
    }
}

我错过了什么?

EN

回答 3

Stack Overflow用户

发布于 2017-04-06 18:00:04

Openxml工作表保护密码的输入数据类型为"HexBinaryValue“。所以输入的密码要从字符串转换成十六进制数。

代码语言:javascript
运行
复制
foreach (var worksheetPart in spreadsheet.WorkbookPart.WorksheetParts)
     {
         //Call the method to convert the Password string "MyPasswordfor sheet" to hexbinary type
         string hexConvertedPassword =  HexPasswordConversion("MyPasswordfor sheet");
//passing the Converted password to sheet protection
          SheetProtection sheetProt = new SheetProtection() { Sheet = true, Objects = true, Scenarios = true, Password = hexConvertedPassword };
          worksheetPart.Worksheet.InsertAfter(sheetProt,worksheetPart.Worksheet.Descendants<SheetData>().LastOrDefault());
worksheetPart.Worksheet.Save();
     }


/* This method will convert the string password to hexabinary value */
 protected string HexPasswordConversion(string password)
        {
            byte[] passwordCharacters = System.Text.Encoding.ASCII.GetBytes(password);
            int hash = 0;
            if (passwordCharacters.Length > 0)
            {
                int charIndex = passwordCharacters.Length;

                while (charIndex-- > 0)
                {
                    hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff);
                    hash ^= passwordCharacters[charIndex];
                }
                // Main difference from spec, also hash with charcount
                hash = ((hash >> 14) & 0x01) | ((hash << 1) & 0x7fff);
                hash ^= passwordCharacters.Length;
                hash ^= (0x8000 | ('N' << 8) | 'K');
            }

            return Convert.ToString(hash, 16).ToUpperInvariant();
        }
票数 7
EN

Stack Overflow用户

发布于 2016-09-13 14:20:58

好吧,虽然不完全是我想做的,但我最终放弃了Open XML SDK,而是使用Office.Interop程序集来保护文档。首先使用Open XML的原因是,似乎Interop工作簿不能用流打开,它需要一个实际的文件。

票数 0
EN

Stack Overflow用户

发布于 2017-03-17 19:29:44

您可以尝试这样做:

代码语言:javascript
运行
复制
using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Open(mem, true))
{
     foreach (var worksheetPart in spreadsheet.WorkbookPart.WorksheetParts)
     {
          SheetProtection sheetProt = new SheetProtection() { Sheet = true, Objects = true, Scenarios = true, Password = "test" };
          worksheetPart.Worksheet.InsertAfter(sheetProt, worksheetPart.Worksheet.Descendants<SheetData>().LastOrDefault());
     }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39449653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档