filestream-以只读方式打开excel文件失败

filestream-以只读方式打开excel文件失败,excel,vb.net,filestream,syncfusion,Excel,Vb.net,Filestream,Syncfusion,我使用vb.net应用程序读取excel文件(.xlsm;受密码保护)。我使用以下接口: System.IO.filestream Syncfusion.XlsIO(NuGet) 这是可行的,但我想以只读模式打开它,以便任何其他人都可以在MS Office中使用此文件(写入、保存等) 代码: 我一步一步地尝试,发现我在第行阻止了该文件: SyncFS = New FileStream(PathFile, FileMode.Open, FileAccess.Read, FileShare.Re

我使用vb.net应用程序读取excel文件(.xlsm;受密码保护)。我使用以下接口:

  • System.IO.filestream
  • Syncfusion.XlsIO(NuGet)
这是可行的,但我想以只读模式打开它,以便任何其他人都可以在MS Office中使用此文件(写入、保存等)

代码:

我一步一步地尝试,发现我在第行阻止了该文件:

SyncFS = New FileStream(PathFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
我在“discard”行释放文件


阻止意味着在我阅读excel文件时,没有人可以在MS 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工作

问候,,
Shamini

没错,另一个尝试是不使用Filestream,因此使用了Workbooks.open方法和其他参数:SyncWB=SyncEE.Excel.Workbooks.open(Me.PathFile,ExcelParseOptions.StringsReadOnly,openReadOnly,password,ExcelOpenType.Automatic)SyncWB.Unprotect(password)在Workbooks.open方法运行期间(这需要几秒钟,因为excel文件很大),文件被阻止-其他用户无法手动将文件保存在MS excel中。
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