我正在编写一个程序来清空空行和列中的excel文件,我从我自己的问题Fastest method to remove Empty rows and Columns From Excel Files using Interop开始,一切都很顺利。
问题是我想阻止excel在工作簿受密码保护时显示密码对话框并抛出异常而不是。
我使用以下代码使用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("")
但没有运气。
有什么建议吗?
答案 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.Missing
和System.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
,因此不应该有所不同。