Взаимодействие Excel предотвращает показ диалогового окна пароля

Я пишу программу для очистки файлов excel из пустых строк и столбцов, я начал с моего собственного вопроса Самый быстрый метод для удаления пустых строк и столбцов из файлов Excel с помощью Interop и все идет хорошо.

Проблема заключается в том, что я хочу запретить excel показывать диалог пароля, когда рабочая книга защищена паролем, а также исключать исключение вместо.

введите описание изображения здесь

Я использую следующий код для открытия файлов excel с помощью interop:

 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("")

но не повезло.

любые предложения?

Ответ 1

Я нашел решение, но я буду принимать другие рабочие ответы

Проблема

При передаче пустой строки в качестве пароля excel считает это ничем. Поэтому он запрашивает пароль и показывает диалог.

Решение

Решение: передать одну цитату в качестве пароля, excel будет считать ее пустой. Если рабочая книга не защищена паролем, она откроется, иначе она выкинет следующее исключение.

Указанный пароль неверен. Убедитесь, что кнопка CAPS LOCK выключена и не забудьте использовать правильную заглавную букву

Код будет выглядеть следующим образом:

m_xlWrkb = m_xlWrkbs.Open(strFile, Password:="'")

Примечание

В microsoft excel для форматирования текста используется одинарная кавычка в начале значения.

Пример; '0 читается как текст значения 0

Ответ 2

Не используйте 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 относятся к одному и тому же объекту.

Ответ 3

Что касается вашего решения, уверены ли вы, что он ничего не будет работать, это не пароль? Что-то вроде этого:

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, поэтому он не должен отличаться.