如何解决如何将 Excel (.xlsx) 文件导入并显示到 Blazor WASM 客户端无需上传到服务器
正如标题所说。许多在线示例用于将文件上传到后端,但我在验证客户端/离线之后仅上传数据(无文件)。理论上,在 .Net5 上运行的任何东西都应该能够以接近的性能在 WASM 中运行。我正在尝试将这些繁重的操作卸载到客户的机器上。
我使用 ClosedXML 取得了一些成功,但是当文件只有几 1000 行时,它会变得非常慢。在 Blazor 服务器端使用 ClosedXML 轻松加载 100,000 行。
注意事项:
- 使用 MudBlazor UI 组件
- 我有一个来自文件的流而不是 ClosedXML 的文件路径(就像我在控制台应用程序中那样),我认为这是 WASM 中的唯一方法,但我可能错了。
- 我在 NPOI 中运行了相同的结果,结果相似(WASM 慢,服务器端快)。
- 除非有神奇的修复,否则我宁愿避免使用 EPPlus。
页面:
@page "/upload"
@inject HttpClient Http
<h1>Upload Data</h1>
<p>This component demonstrates uploading data from Excel.</p>
<InputFile id="fileInput" OnChange="UploadFiles" hidden single />
<MudButton HtmlTag="label"
Variant="Variant.Filled"
Color="Color.Primary"
StartIcon="@Icons.Filled.CloudUpload"
for="fileInput">
Upload Files
</MudButton>
@if (dataTable == null)
{
<p><em>Please upload Excel File</em></p>
}
else
{
<MudTable Items="@dataTable.AsEnumerable().Take(500)" Hover="true" Breakpoint="Breakpoint.Sm" T="DaTarow" RowsPerPage="100">
<HeaderContent>
@foreach (DataColumn col in dataTable.Columns)
{
<MudTh>@col.ColumnName</MudTh>
}
</HeaderContent>
<RowTemplate>
@foreach (var cell in context.ItemArray)
{
<MudTd>@cell.ToString()</MudTd>
}
</RowTemplate>
</MudTable>
}
@code {
//private IList<IbrowserFile> files = new List<IbrowserFile>();
private DataTable dataTable;
protected override async Task OnInitializedAsync()
{
}
private async Task UploadFiles(InputFileChangeEventArgs e)
{
dataTable = await ExcelHelper.GetDataTableFromExcel(e.File);
}
}
功能:
public static async Task<DataTable> GetDataTableFromExcel(IbrowserFile file)
{
DataTable dtTable = new DataTable();
using (MemoryStream memStream = new MemoryStream())
{
await file.OpenReadStream(file.Size).copyToAsync(memStream);
using (XLWorkbook workBook = new XLWorkbook(memStream,XLEventTracking.disabled))
{
//Read the first Sheet from Excel file.
IXLWorksheet workSheet = workBook.Worksheet(1);
//Loop through the Worksheet rows.
bool firstRow = true;
foreach (IXLRow row in workSheet.Rows())
{
//Use the first row to add columns to DataTable.
if (firstRow)
{
foreach (IXLCell cell in row.Cells())
{
dtTable.Columns.Add(cell.Value.ToString());
}
firstRow = false;
}
else
{
//Add rows to DataTable.
dtTable.Rows.Add();
int i = 0;
foreach (IXLCell cell in row.Cells(row.FirstCellUsed().Address.ColumnNumber,row.LastCellUsed().Address.ColumnNumber))
{
dtTable.Rows[dtTable.Rows.Count - 1][i] = cell.Value.ToString();
i++;
}
}
}
}
}
return dtTable;
}
引起延迟的线路是:
using (XLWorkbook workBook = new XLWorkbook(memStream,XLEventTracking.disabled))
我需要帮助解决 xlsx 文件读取缓慢的问题,或者如果有更好的方法,请采用完全不同的方法!实现这一目标的更好方法,没有作弊/上传文件到服务器:)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。