【问题标题】:Excel interop prevent showing password dialogExcel 互操作防止显示密码对话框
【发布时间】:2017-10-25 09:37:17
【问题描述】:

我正在编写一个程序来清除空行和空列中的 excel 文件,我从我自己的问题 Fastest method to remove Empty rows and Columns From Excel Files using 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("")

但没有运气。

有什么建议吗?

【问题讨论】:

  • interop 有HasPassword 属性msdn.microsoft.com/en-us/library/… 然后可以自己抛出异常
  • @Jaxedin 我同意你的观点,但是在打开文件之前无法访问此属性,所以它不起作用,当调用workbook.open() 方法时会显示密码对话框
  • @Jaxedin 我找到了解决办法看看

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


【解决方案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.MissingSystem.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,所以应该不会有所不同。

    【讨论】:

    • 我确信这在使用 c# 和 vb.net 时不起作用
    • 这很奇怪。您尝试过 TryCatch 吗?
    • 是的,我使用了 try catch。唯一可行的方法是传递单引号
    • @Yahfoufi - 谢谢,我想今天晚些时候在 C# 中尝试一下,你为我节省了努力。但是,就它们使用相同的 Excel 对象而言,在 C# 中不应该是相同的吗?
    • @Yahfoufi - 是的,这个问题似乎很有帮助,但我对 C# 中的 Excel 对象的理解有点不同。 :)
    猜你喜欢
    • 2011-10-24
    • 2015-08-20
    • 2012-01-16
    • 2014-06-17
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多