我需要在 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文件内容。相反得到了不受支持的结果。
经过大量研究并使用代码后,这是一个可行的解决方案:
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);
}
}
}
}
}
我发现以下网站提供了很好的解决方案。请注意,它使用内存流,因此文件大小可能是一个问题。普通的文件流可能会起作用,我稍后会尝试: