Blazor WASM 和 ExcelDataReader 兼容吗?

问题描述 投票:0回答:1

我需要在 Blazor 应用程序中读取和解析 Excel 电子表格。一旦我读取了数据,我就会保留它,但我的主要问题是我使用的 Nuget 包 ExcelDataReader 在尝试使用时会抛出错误,这似乎表明我无法在 WASM 应用程序中使用它:

System.NotSupportedException: Specified method is not supported.
   at Microsoft.AspNetCore.Components.Forms.BrowserFileStream.Seek(Int64 offset, SeekOrigin origin)
   at ExcelDataReader.ExcelReaderFactory.CreateOpenXmlReader(Stream fileStream, ExcelReaderConfiguration configuration)
   at CollectXScore.Web.ExcelFileReader.LoadFile(InputFileChangeEventArgs ev) in D:\Intellaegis\CollectXScore\CollectXScore.Web\ExcelFileReader.cs:line 54
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0(Object state)
   at Microsoft.AspNetCore.Components.Rendering.RendererSynchronizationContext.PostAsync[TState](Task antecedent, Action`1 callback, TState state)

执行以下操作时:

        public async void LoadFile(InputFileChangeEventArgs ev)
        {
            IReadOnlyList<IBrowserFile> files = ev.GetMultipleFiles();
            foreach (IBrowserFile file in ev.GetMultipleFiles())
            {
                Debug.WriteLine(file.ContentType);
                if (excelContentTypes.Contains(file.ContentType) || file.ContentType == "text/csv")
                {

                    // Auto-detect format, supports:
                    //  - Binary Excel files (2.0-2003 format; *.xls)
                    //  - OpenXml Excel files (2007 format; *.xlsx, *.xlsb)
                    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
                    using (var reader = ExcelReaderFactory.CreateReader(file.OpenReadStream()))
                    {

                        // Use the AsDataSet extension method
                        // The result of each spreadsheet is in result.Tables
                        var result = reader.AsDataSet();

                        // Access data in the DataSet
                        var dataTable = result.Tables[0];
                        foreach (DataRow row in dataTable.Rows)
                        {
                            foreach (var cell in row.ItemArray)
                            {
                                Debug.WriteLine(cell);
                            }
                        }
                    }
                }
            }
         }

我尝试使用内存流也没有成功。任何帮助表示赞赏。

期望能够读取Excel文件内容。相反得到了不受支持的结果。

c# excel blazor-webassembly
1个回答
0
投票

经过大量研究并使用代码后,这是一个可行的解决方案:

if (excelContentTypes.Contains(文件.ContentType)) {

            // Auto-detect format, supports:
            //  - Binary Excel files (2.0-2003 format; *.xls)
            //  - OpenXml Excel files (2007 format; *.xlsx, *.xlsb)
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            Stream stream = new MemoryStream();
            await file.OpenReadStream().CopyToAsync(stream);
            stream.Position = 0; // Position will be the end of the file after the copy
            using (var reader = ExcelReaderFactory.CreateReader(stream))
            {

                // Use the AsDataSet extension method
                // The result of each spreadsheet is in result.Tables
                var result = reader.AsDataSet();

                // Access data in the DataSet
                var dataTable = result.Tables[0];
                foreach (DataRow row in dataTable.Rows)
                {
                    foreach (var cell in row.ItemArray)
                    {
                        Debug.WriteLine(cell);
                    }
                }
            }
        }
    }

我发现以下网站提供了很好的解决方案。请注意,它使用内存流,因此文件大小可能是一个问题。普通的文件流可能会起作用,我稍后会尝试:

https://github.com/dotnet/aspnetcore/issues/38785

© www.soinside.com 2019 - 2024. All rights reserved.