Blazor WASM与ExcelDataReader是否兼容?读取Excel报错求助
Blazor WASM使用ExcelDataReader读取Excel报错的解决方案
问题根源
Blazor WASM中IBrowserFile.OpenReadStream()返回的BrowserFileStream是**不可查找(non-seekable)**的流,而ExcelDataReader在解析Excel文件(尤其是OpenXml格式的.xlsx/.xlsb)时,需要调用流的Seek方法定位内容,因此直接传入该流会抛出System.NotSupportedException。
解决方案:将文件内容转为可查找的内存流
先把浏览器上传的文件内容完整复制到MemoryStream(支持Seek操作),再用这个内存流传给ExcelDataReader。同时修正原代码中async void的问题(Blazor事件处理方法应使用async Task,避免异步异常丢失)。
修改后的完整代码
public async Task LoadFile(InputFileChangeEventArgs ev) { foreach (IBrowserFile file in ev.GetMultipleFiles()) { Debug.WriteLine(file.ContentType); if (excelContentTypes.Contains(file.ContentType) || file.ContentType == "text/csv") { System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); // 将浏览器文件流复制到内存流 using var memoryStream = new MemoryStream(); await file.OpenReadStream().CopyToAsync(memoryStream); // 重置内存流位置到开头,确保ExcelDataReader能从起始位置读取 memoryStream.Position = 0; using (var reader = ExcelReaderFactory.CreateReader(memoryStream)) { var result = reader.AsDataSet(); var dataTable = result.Tables[0]; foreach (DataRow row in dataTable.Rows) { foreach (var cell in row.ItemArray) { Debug.WriteLine(cell); } } } } } }
关键说明
- 替换
async void为async Task:Blazor组件的异步事件处理方法必须返回Task,否则无法正确捕获异步执行过程中的异常。 - 使用
MemoryStream中转:MemoryStream是可查找的流,完全支持ExcelDataReader所需的Seek操作。 - 重置流位置:复制完成后必须将
memoryStream.Position设为0,否则ExcelDataReader会从流的末尾开始读取,导致无数据或报错。
内容的提问来源于stack exchange,提问作者Age of Empires
相关产品推荐
相关产品推荐

