用NPOI读取Blazor wasm中的Excel文件

Reading Excel File in Blazor wasm using NPOI(用NPOI读取Blazor wasm中的Excel文件)
本文介绍了用NPOI读取Blazor wasm中的Excel文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码在PC上运行的.NET Core应用程序中运行良好。该代码加载一个Excel文件,并使用NPOI库读取该文件。
public void ReadExcel()
        {
            DataTable dtTable = new DataTable();
            List<string> rowList = new List<string>();
            ISheet sheet;
            using (var stream = new FileStream("Test.xlsx", FileMode.Open))
            {
                stream.Position = 0;
                XSSFWorkbook xssWorkbook = new XSSFWorkbook(stream);
                sheet = xssWorkbook.GetSheetAt(0);
                IRow headerRow = sheet.GetRow(0);
                int cellCount = headerRow.LastCellNum;
                for (int j = 0; j < cellCount; j++)
                {
                    ICell cell = headerRow.GetCell(j);
                    if (cell == null || string.IsNullOrWhiteSpace(cell.ToString())) continue;
                    {
                        dtTable.Columns.Add(cell.ToString());
                    }
                }
                for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                {
                    IRow row = sheet.GetRow(i);
                    if (row == null) continue;
                    if (row.Cells.All(d => d.CellType == CellType.Blank)) continue;
                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        if (row.GetCell(j) != null)
                        {
                            if (!string.IsNullOrEmpty(row.GetCell(j).ToString()) && !string.IsNullOrWhiteSpace(row.GetCell(j).ToString()))
                            {
                                rowList.Add(row.GetCell(j).ToString());
                            }
                        }
                    }
                    if (rowList.Count > 0)
                        dtTable.Rows.Add(rowList.ToArray());
                    rowList.Clear();
                }
            }
            return JsonConvert.SerializeObject(dtTable);
        }
我希望在我的Blazor应用程序中使用此代码,以便能够从浏览器读取Excel文件。我可以使用InputFile组件获取文件:
<InputFile OnChange="GetFile"/>
问题是如何将上传的文件作为可以传递给ReadExcel函数的流?所以应该是这样的:
public async Task GetFile(InputFileChangeEventArgs e) //get excel file
    {
        
        stream = e.File.OpenReadStream(); //need a stream here that ReadExcel() can use!
               
        ReadExcel();
    }

如果我在ReadExcel函数中使用上面的流,而不是它拥有的流,代码将无法工作。形成此流的正确方式是什么,以便ReadExcel可以使用该流而不是现在的流?

谢谢, Amjad。

推荐答案

我认为主要问题是读取流不可搜索(CanSeek==False)。

您可以将其复制到MemoryStream,但一定要注意大小限制。

public async Task GetFile(InputFileChangeEventArgs e) //get excel file
{        
    var stream1 = e.File.OpenReadStream(); //need a stream here that ReadExcel() can use!
    var stream2 = new MemoryStream();
    await stream1.CopyToAsync(stream2);
    stream1.Close();
   
    ReadExcel(stream2);       
}

这篇关于用NPOI读取Blazor wasm中的Excel文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)