изменить пароль Excel с помощью C #? - PullRequest
0 голосов
/ 04 ноября 2011

Я работаю над этим проектом, который использует Excel.interop для создания рабочих листов, и в настоящее время они защищены паролем. Каков наилучший способ изменить пароль с помощью c #? Я новичок в взаимодействии, поэтому не знаком со всеми доступными функциями.

В настоящее время я использую worksheet.unprotect (oldpassword), чтобы разблокировать лист, используя старый пароль, а затем вызываю worksheet.protect (newpassword), чтобы заблокировать его, используя новый пароль. Но тогда возникает эта проблема. Он работает нормально в первый раз, но после этого, когда он пытается снять защиту с помощью 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. Есть ли лучший способ решить эту проблему?

Может быть, я могу вернуть 0 в вызывающий метод изнутри блока catch, а затем вызвать другой метод, чтобы снять защиту с нового пароля. Но это будет репликация кода. Любая экспертиза ???

1 Ответ

0 голосов
/ 07 ноября 2011

Отказ от ответственности: я не занимаюсь программированием взаимодействия с Office. При этом я занимаюсь многими другими программами, так что, возможно, это будет полезным советом.

Во-первых, я даю реквизит Тиму Уильямсу в комментариях выше, чтобы он предложил вам вернуться к нему позже, как только вы ознакомитесь с кодом. Не стоит переделывать логику, пока вы не потратите некоторое время на существующий код.

Теперь: если вызов Worksheet.Unprotect (который является COM-интерфейсом) создает исключение, когда вы указываете неправильный пароль, вам придется попытаться / перехватить исключение. Похоже, что это единственный способ справиться с ошибкой. Итак, чтобы ответить на один ваш вопрос, вам нужен блок try / catch.

Учитывая код, который вы предоставили, я мог бы переработать его так:

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...]
  }
}
...