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

时间:2017-05-24 21:15:50

标签: c# excel vb.net excel-interop

我正在编写一个程序来清空空行和列中的excel文件,我从我自己的问题Fastest method to remove Empty rows and Columns From Excel Files using Interop开始,一切都很顺利。

问题是我想阻止excel在工作簿受密码保护时显示密码对话框并抛出异常而不是

enter image description here

我使用以下代码使用interop打开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 个答案:

答案 0 :(得分:8)

我找到了解决方案,但我会接受其他工作答案

问题

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

解决方案

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

  

您提供的密码不正确。验证CAPS LOCK键是否已关闭并确保使用正确的大写

代码为:

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

注意

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

实例; '0被视为有价值的文字0

答案 1 :(得分:3)

不要将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.MissingSystem.Reflection.Missing指的是同一个对象。

答案 2 :(得分:2)

关于您的解决方案,您确定它不能用于任何事情,那不是密码吗?像这样:

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,因此不应该有所不同。