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