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

问题描述 投票:2回答:3

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

c# .net security excel vsto
3个回答
3
投票

检查HasPassword属性。


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);
}

工作表可以对其单元格内容进行保护,对图形对象进行保护,和/或对方案进行保护。可以分别通过Worksheet.ProtectContentsWorksheet.ProtectDrawingObjectsWorsksheet.ProtectScenarios属性进行检查。我不知道有什么方法可以测试工作表是否受密码保护,除了尝试调用Worksheet.Unprotect,传递空字符串作为密码,然后查看工作表是否成功不受保护外,其他方法都无法测试:

bool wasPasswordProtected;

try
{
    myWorksheet.Unprotect(string.Empty);

    // Unprotect suceeded:
    wasPasswordProtected = false;  
}
catch
{
    // Unprotect failed:
    wasPasswordProtected = true;
}

您可以通过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);

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

您还可能需要阅读有关Worksheet.Protect方法的帮助文件,以便您可以理解可选参数,尤其要注意'UserInterfaceOnly'参数。


0
投票

[如果要检查excel工作簿是否受密码保护,则检查工作簿对象上的HasPassword属性将不起作用,因为必须先打开工作簿才能检查属性,并且不能打开使用密码的工作簿如果没有密码,则受保护。看到问题了吗?

这是我发现知道该工作簿是否具有密码的解决方案:

using Excel = Microsoft.Office.Interop.Excel;

Excel.Application xlsApp = new Excel.Application();
xlsApp.DisplayAlerts = false;

Excel.Workbooks wkbs = xlsApp.Workbooks;
Excel.Workbook wkb;


try
{
    wkb = wkbs.Open(path, ReadOnly: true, Password: "");
    //If you don't send a string for the password, it will popup a window
    //asking for the password and halt your program. If the workbook has no
    //password, it will open just fine.

}
catch (Exception ex)
{
    //If the file is password protected or otherwise unreadable, it will throw an exception.
}


wkb.Close(false);
xlsApp.Quit();
© www.soinside.com 2019 - 2024. All rights reserved.