Excel 互操作阻止显示密码对话框

Excel interop prevent showing password dialog

我正在编写一个程序来清除空行和空列中的 excel 文件,我从我自己的问题开始 并且一切正常。

问题是我想防止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("")

但运气不好。

有什么建议吗?

不要将 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 被抛出并显示以下消息:

"The password you supplied is not correct. Verify that the CAPS LOCK key is off and be sure to use the correct capitalization."

如果工作簿没有密码保护,假设文件可以访问,则不会抛出异常。

您还可以像这样定义上面显示的 "missing" 对象:

Dim missing As Object = Type.Missing

Type.MissingSystem.Reflection.Missing指的是同一个对象。

我找到了解决方案,但我会接受其他可行的答案

问题

当传递一个空字符串作为密码时,excel 认为它什么都没有。所以它要求输入密码并显示对话框。

解决方案

解决方法是传递单引号作为密码,excel会认为是空字符串。如果工作簿不受密码保护,它将打开,否则将抛出以下异常

The password you supplied is not correct. Verify that the CAPS LOCK key is off and be sure to use the correct capitalization

代码为:

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

备注

在 Microsoft excel 中,值开头的单引号用于强制文本格式化。

例子; '0 被读取为值 0

的文本

关于您的解决方案,您确定它不适用于任何东西,不是密码吗?像这样:

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,所以应该没有什么不同。