如何检查Excel工作簿或工作表是否受密码保护?

sha*_*pan 2 .net c# security excel vsto

使用vsto,C#fx 3.5,如何检查Excel工作簿或工作表是否受密码保护?

Mik*_*lum 12

您可以通过Workbook.HasPassword属性检查工作簿是否受密码保护.您可以通过Workbook.SaveAs方法设置工作簿密码:

Excel.Workbook myWorkbook = ...;

if (!myWorkbook.HasPassword)
{
   excelWorkbook.Application.DisplayAlerts = false;

   excelWorkbook.SaveAs(
        excelWorkbook.Name,
        Type.Missing,
        "My Password",
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing,
        Type.Missing);
}
Run Code Online (Sandbox Code Playgroud)

工作表可以保护其单元格内容,保护图形对象和/或保护场景.这些可以分别通过Worksheet.ProtectContents,Worksheet.ProtectDrawingObjectsWorsksheet.ProtectScenarios属性进行检查.我不知道有没有测试工作表是否受密码保护的方法,除了尝试调用Worksheet.Unprotect,传入一个空字符串以获取密码,然后查看工作表是否成功不受保护:

bool wasPasswordProtected;

try
{
    myWorksheet.Unprotect(string.Empty);

    // Unprotect suceeded:
    wasPasswordProtected = false;  
}
catch
{
    // Unprotect failed:
    wasPasswordProtected = true;
}
Run Code Online (Sandbox Code Playgroud)

您可以通过Worksheet.Protect方法设置工作表的保护设置.如果未设置任何三个保护元素,以下示例将保护工作表.它还设置了一个密码并将'UserInterfaceOnly'参数传递为'true',这意味着只有用户被阻止编辑工作表,而VBA,VB.NET或C#等代码不会被阻止操作工作表.将"UserInterfaceOnly"设置为"false"将锁定所有更改,无论是由用户还是通过代码进行的.

if(!myWorksheet.ProtectContents ||
   !myWorksheet.ProtectDrawinngObjects ||
   !myWorsksheet.ProtectScenarios)
{
    string myPassword = "...";

    bool protectContents = true;
    bool protectDrawingObjects = true;
    bool protectScenarios = true;

    bool userInterfaceOnly = true;

    myWorksheet.Protect(
        myPassword,
        protectDrawingObjects,
        protectContents, 
        protectScenarios,
        userInterfaceOnly,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing,    
        Type.Missing);
Run Code Online (Sandbox Code Playgroud)

请注意,保存工作簿时"UserInterfaceOnly"不会保留,并在关闭工作簿时自动恢复为"false".如果您希望在将来的所有会话中都为"true",则每次打开工作簿时都必须通过调用"Worksheet.Protect"方法重新应用"UserInterfaceOnly"设置.这可以通过订阅Workbook.Open事件来完成.

您还可能希望阅读有关Worksheet.Protect 方法的帮助文件,以便了解可选参数,特别注意'UserInterfaceOnly'参数.