Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用c更改excel密码?_C#_Excel_C# 4.0_Interop_Password Protection - Fatal编程技术网

C# 使用c更改excel密码?

C# 使用c更改excel密码?,c#,excel,c#-4.0,interop,password-protection,C#,Excel,C# 4.0,Interop,Password Protection,我正在做这个项目,它使用Excel.interop创建工作表,目前它们有密码保护。使用c修改密码的最佳方法是什么?我不熟悉互操作,因此不熟悉所有可用的功能 目前,我使用sheet.unprotectoldpassword使用旧密码解锁工作表,然后调用sheet.protectnewpassword使用新密码将其锁定。但随后出现此问题。它第一次工作正常,但之后当它尝试使用oldpw取消保护时,我得到了异常。所以旧的pw是一次性使用的,我如何在c中实现这个逻辑?另外,我有15个工作表都有密码保护,所

我正在做这个项目,它使用Excel.interop创建工作表,目前它们有密码保护。使用c修改密码的最佳方法是什么?我不熟悉互操作,因此不熟悉所有可用的功能

目前,我使用sheet.unprotectoldpassword使用旧密码解锁工作表,然后调用sheet.protectnewpassword使用新密码将其锁定。但随后出现此问题。它第一次工作正常,但之后当它尝试使用oldpw取消保护时,我得到了异常。所以旧的pw是一次性使用的,我如何在c中实现这个逻辑?另外,我有15个工作表都有密码保护,所以使用计数器时会变得复杂

目前我使用的是这样的try-catch块

public static void Unprotect_Worksheet(string Name)

        {
            try
            { 

                //try old pw first, if gets exception, retry using new pw

                string strPassword = oldpassword;
                Excel.Worksheet wsheet = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[Name];

                wsheet.Unprotect(oldpassword);

            }
            catch
            {

                string strPassword = newpassword;
  Excel.Worksheet wsheet = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[Name];

                wsheet.Unprotect(strPassword);


            }
        }
这工作得非常好,但我认为不应该使用catch块来实现业务逻辑。有没有更好的办法解决这个问题


可能是我可以从catch块内部将0返回给调用方法,然后调用其他方法以使用新密码取消对工作表的保护。但这将是代码复制。任何专业知识???

免责声明:我不做Office互操作编程。也就是说,我做了很多其他的编程,所以这可能是一个有用的建议

首先,我在上面的评论中给Tim Williams一些建议,建议您在更熟悉代码后重新访问它。在花一些时间处理现有代码之前,重做逻辑是不明智的

现在:如果当您指定错误的密码时,调用Worksheet.Unprotect(COM接口)产生异常,那么您必须尝试/捕获异常。这似乎是处理错误的唯一方法。所以,要回答你的一个问题,你需要尝试/抓住这一块

根据您提供的代码,我可能会这样重新编写:

string strPassword = oldpassword;
Excel.Worksheet wsheet = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets[Name];

try { 
  // try the old password first (throws a COM exception if it fails)
  wsheet.Unprotect(oldpassword);
} catch {
  // ideally we should make sure we're only handling an invalid password error here
  try {
    // couldn't unprotect with the old password - try the new password
    strPassword = newpassword;
    wsheet.Unprotect(strPassword);
  } catch(Exception ex) {
    // TODO neither password worked - what do we do now? [insert code here...]
  }
}

为什么不在创建工作表的同一操作中更改密码呢?在那之后,你可以依靠使用新密码。我不知道怎么做。请出示一个示例代码或其他东西。您说您的应用程序创建了工作表:这是您的代码,所以您可能已经知道如何创建这些工作表了?这不是我的代码,我刚开始在这家公司工作,代码的所有者去世了。你指的是这一行吗?Excel.Worksheet wsheet=Excel.WorksheetGlobals.ThisAddIn.Application.ActiveWorkbook.Worksheets[Name];如果您对代码不太熟悉,并且您的try-catch即使不理想也能正常工作,那么我现在就不会担心了。如果你花了更多的时间在应用程序上,并且更好地了解了它是如何组合在一起的,那么也许可以再次访问。