Взаимодействие Excel препятствует отображению диалогового окна с паролем
Я пишу программу для очистки файлов Excel из пустых строк и столбцов, я начал с собственного вопроса Самый быстрый метод удаления пустых строк и столбцов из файлов Excel с помощью Interop, и все идет хорошо.
Проблема в том, что я хочу, чтобы Excel не отображал диалоговое окно ввода пароля, когда рабочая книга защищена паролем, и вместо этого выдает исключение.
я использую следующий код для открытия файлов Excel с помощью взаимодействия:
m_XlApp = New Excel.Application
m_XlApp.visible = False
m_XlApp.DisplayAlerts = False
Dim m_xlWrkbs As Excel.Workbooks = m_XlApp.Workbooks
Dim m_xlWrkb As Excel.Workbook
m_xlWrkb = m_xlWrkbs.Open(strFile)
m_xlWrkb.DoNotPromptForConvert = true
я пытался передать пустой пароль, как предлагали некоторые ссылки
m_xlWrkb = m_xlWrkbs.Open(strFile, Password:="")
Или используя
m_xlWrkb.Unprotect("")
но не повезло.
какие-либо предложения?
3 ответа
Я нашел решение, но я приму другие рабочие ответы
проблема
При передаче пустой строки в качестве пароля Excel считает это ничем. Так что попросите пароль и покажите диалог.
Решение
Решение состоит в том, чтобы передать одну кавычку в качестве пароля, Excel будет рассматривать его как пустую строку. Если рабочая книга не защищена паролем, она откроется, иначе она выдаст следующее исключение
Вы указали неверный пароль. Убедитесь, что ключ CAPS LOCK выключен, и обязательно используйте правильную прописную букву.
Код будет:
m_xlWrkb = m_xlWrkbs.Open(strFile, Password:="'")
Заметка
В Microsoft Excel для принудительного форматирования текста используется одинарная кавычка в начале значения.
пример; '0
читается как текст значения 0
Не использовать Nothing
для аргументов метода, которые вы не хотите указывать.
Вместо:
m_xlWrkb = m_xlWrkbs.Open(strFile, Nothing, Nothing, Nothing, "", Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing)
используйте любое из следующего:
m_xlWrkb = m_xlWrkbs.Open(strFile, Password:="")
или же
m_xlWrkb = m_xlWrkbs.Open(strFile, , , , "", , , , , , , , , , )
или же
Dim missing As System.Reflection.Missing = System.Reflection.Missing.Value
m_xlWrkb = m_xlWrkbs.Open(strFile,missing, missing, missing, "", missing, missing, missing, missing, missing, missing, missing, missing, missing, missing)
Если рабочая книга защищена паролем, это приведет к COMException
быть брошенным с сообщением:
"Вы ввели неверный пароль. Убедитесь, что клавиша CAPS LOCK выключена, и обязательно используйте правильную прописную букву".
Если рабочая книга не защищена паролем, исключение не будет выдано, если файл доступен.
Вы также можете определить "отсутствующий" объект, показанный выше, следующим образом:
Dim missing As Object = Type.Missing
Type.Missing
а также System.Reflection.Missing
ссылаются на тот же объект.
Что касается вашего решения, вы уверены, что оно не будет работать ни с чем, кроме пароля? Что-то вроде этого:
Public Function wb_get_workbook(ByVal sFullName As String) As Workbook
Dim sFile As String
Dim wbReturn As Workbook
sFile = Dir(sFullName)
On Error Resume Next
Set wbReturn = Workbooks(sFile)
If wbReturn Is Nothing Then
Application.AskToUpdateLinks = False
Set wbReturn = Workbooks.Open(sFullName, , , , "ThisIsDefinitelyAPasswordThatNooneHasUsed681")
End If
On Error GoTo 0
Set wb_get_workbook = wbReturn
End Function
Будет также выдано сообщение об ошибке, если оно защищено паролем, а если нет, то оно не будет заботиться о пароле, который вы предоставляете. Я пытаюсь в VBA
, но в C#
вы используете Excel Application object
так что не должно быть иначе.