如何将 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...