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.Missing
和System.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
,所以应该没有什么不同。
我正在编写一个程序来清除空行和空列中的 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.Missing
和System.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
,所以应该没有什么不同。