Worksheet.Unprotect - Office Interop - разница между 2003 и 2007 годами - PullRequest
1 голос
/ 05 марта 2010

У меня есть приложение .NET winforms, которое автоматизирует Excel и проверяет пароль рабочего листа. Требования должны быть в состоянии обнаружить 1) что защита отключена 2) что пароль удален (защищен, но пароля нет) 3) что пароль соответствует правильному паролю из базы данных

Чтобы выполнить второе требование, программа вызывает команду Worksheet.Unprotect с пустой строкой, фиксируя ошибку. Если ошибка, как и ожидалось, выполняется 3-я проверка. Если ошибки нет, значит, Unprotect работал без пароля ==> пароль был удален.

Пример кода ниже имеет эти проверки.

Приложение прекрасно справляется с Office 2003. С тех пор мой компьютер dev был обновлен до Office 2007, и он больше не работает как раньше. Когда я вызываю Worksheet.Unprotect, Excel запрашивает пароль!

Мне нужно знать, как это должно быть достигнуто в новой версии Excel или есть ли способ ссылки на старую PIA. Независимо от того, что если я установлю ссылку на Excel 11, она будет заменена на PIA для 12 в GAC.

'return true if unprotect of worksheet does not generate an error
    'all other errors will bubble up
    'return false if specific error is "Password is invalid..."
    Try
        'detect unprotected or no password
        If oWorksheet.ProtectContents Then
            'try with no passsword and expect an error
            'if no error then raise exception
            Dim blnRaiseException As Boolean = True
            Try
                'oWorksheet.Unprotect(vbNullString)
                oWorksheet.Unprotect()
            Catch ex As Exception
                blnRaiseException = False
            End Try

            If blnRaiseException Then
                Throw New ExcelSheetNoPasswordException
            End If

            oWorksheet.Unprotect(strPwd)
            'no error so if we get here -- success
            fnCheckWorksheetPwd = True

            'leave as it was -- this may still cause workbook to think it is changed
            oWorksheet.Protect(strPwd)
        Else
            Throw New ExcelSheetNotProtectedException
        End If

    Catch COMex As System.Runtime.InteropServices.COMException
        'handle error code -2146827284 
        If COMex.ErrorCode = -2146827284 Then
            'this is the error we're looking for
        Else
            Throw
        End If
    Catch ex As Exception
        Throw
    End Try

1 Ответ

0 голосов
/ 05 марта 2010

Используйте свойство Worksheet.ProtectionMode , чтобы определить, защищен ли рабочий лист (вместо попытки try..catch), и попробуйте Снять защиту (""), чтобы попытаться снять защиту с пустых паролей.

...