У меня есть приложение .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