问题描述
我用vb.net应用程序读取了一个Excel文件(.xlsm;受密码保护)。我使用以下接口:
- System.IO.filestream
- Syncfusion.XlsIO(NuGet)
可以,但是我想以只读模式打开它,以便其他任何人都可以在MS Office中使用此文件(写,保存,...)。
代码:
Imports Syncfusion.XlsIO
Private SyncEE As Syncfusion.XlsIO.ExcelEngine
Private SyncWB As Syncfusion.XlsIO.IWorkbook
Private SyncFS As System.IO.FileStream
Public Sub new
SyncEE = New ExcelEngine
SyncFS = New FileStream(PathFile,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
SyncEE.Excel.DefaultVersion = ExcelVersion.Excel2016
SyncWB = SyncEE.Excel.Workbooks.Open(SyncFS,ExcelParSEOptions.Default,openReadOnly,password)
SyncWB.Unprotect(password)
SyncWB = SyncEE.Excel.Workbooks.Open(SyncFS,ExcelOpenType.Automatic)
' read....
'discard
SyncWB.Close()
SyncWB = nothing
SyncEE.dispose()
SyncEE = nothing
SyncFS.dispose()
SyncFS = nothing
End Sub
我一步一步尝试了一下,发现我将文件阻止在行上:
SyncFS = New FileStream(PathFile,FileShare.ReadWrite)
然后在“废弃”行释放文件。
阻止意味着当我阅读该文件时,没有人可以在MS Excel中手动编辑和保存excel文件。
解决方法
来自Syncfusion的问候。
正如您提到的那样,您在使用FileStream加载文件时阻止了该文件,并且仅在整个程序结束时才丢弃FileStream对象。您可以在将FileStream对象加载到工作簿对象后立即丢弃它,以便其他人在读取文件时可以在MS Office中使用该文件(写入,保存等)。因此,我们按照以下方式修改了您的代码,以满足您的要求。
代码段:
Private Sub new
SyncEE = New ExcelEngine
SyncFS = New FileStream(PathFile,FileMode.Open,FileAccess.Read,FileShare.ReadWrite)
SyncEE.Excel.DefaultVersion = ExcelVersion.Excel2016
SyncWB = SyncEE.Excel.Workbooks.Open(SyncFS,ExcelParseOptions.Default,openReadOnly,password)
'Discard FileStream
SyncFS.Dispose()
SyncFS = Nothing
' read....
'discard
SyncWB.Close()
SyncWB = Nothing
SyncEE.Dispose()
SyncEE = Nothing
End Sub
注意:我为Syncfusion工作。
关于, 沙米尼