文件流-打开Excel文件只读失败

问题描述

我用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工作。

关于, 沙米尼