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

我正在写一个程序清理空行和列的Excel文件,我从我自己的问题开始最快速的方法来删除空行和列从Excel文件使用互操作 ,一切都很好。

问题是,我想防止excel显示密码对话框,当工作簿是密码保护,并抛出一个exception,而不是

在这里输入图像描述

我正在使用以下代码使用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 

我试图通过一个空的密码,build议一些链接

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

或者使用

 m_xlWrkb.Unprotect("") 

但没有运气。

有什么build议么?

我find了一个解决scheme,但我会接受其他工作的答案

问题

当传递一个空string作为密码时,excel认为它没有任何意义。 所以它要求input密码并显示对话框。

解决的办法是把一个单引号作为密码 ,excel会认为它是空string。 如果工作簿没有密码保护,它将打开,否则会抛出以下exception

您提供的密码不正确。 确认大写locking键已closures,并确保使用正确的大小写

代码将是:

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

注意

在Microsoft Excel中,值的开头使用单引号强制文本格式。

例; '0被作为值为0的文本

不要为你不想提供的方法参数使用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键已closures,并确保使用正确的大小写。”

如果工作簿没有密码保护,假定文件是可访问的,则不会抛出exception。

你也可以像这样定义上面显示的“缺失”对象:

 Dim missing As Object = Type.Missing 

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

关于你的解决scheme,你确定它不会与任何东西,这不是密码? 像这样的东西:

 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 ,所以它不应该是不同的。