Взаимодействие 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так что не должно быть иначе.

Другие вопросы по тегам