首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用csvHelper从Blazor项目读取保存到文件位置的Excel

使用csvHelper从Blazor项目读取保存到文件位置的Excel
EN

Stack Overflow用户
提问于 2022-01-17 17:09:59
回答 1查看 1.2K关注 0票数 0

下面是我的blazor服务器端项目页面,用于将excel文件上载到服务器并使用CsvHelper处理该文件

代码语言:javascript
运行
复制
@page "/contact/import"
@using System.Data
@using System.IO
@using Microsoft.AspNetCore.Hosting 
@inject IWebHostEnvironment Environment

<h1>Upload Data</h1>

<p>This component   uploads data from Excel.</p>
 
<InputFile OnChange="@LoadFiles"  />

<MudButton HtmlTag="label"
           Variant="Variant.Filled"
           Color="Color.Primary"
           StartIcon="@Icons.Filled.CloudUpload"
           for="fileInput">
    Upload Files
</MudButton>
  
@code {
  
    protected override async Task OnInitializedAsync()
    {
    }

    private async Task LoadFiles(InputFileChangeEventArgs e)
    {
        try
        {  
            //https://learn.microsoft.com/en-us/aspnet/core/blazor/file-uploads?view=aspnetcore-6.0&pivots=server#upload-files-to-a-server
            long maxFileSize =  1024 * 1024 * 15; //15 MB            
            foreach (var file in e.GetMultipleFiles(1))
            {
                string rootpath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "FileUploads");

                var trustedFileNameForFileStorage = file.Name; //Path.GetRandomFileName();
                var path = Path.Combine(rootpath,
                        trustedFileNameForFileStorage);
                await using FileStream fs = new(path, FileMode.Create);
                await file.OpenReadStream(maxFileSize).CopyToAsync(fs);
            }
        }
        catch(Exception ex)
        {
            
        } 
    }
}

此代码将将文件保存到FileUploads文件夹中。

我使用CSVHelper读取用户上传的excel文件的内容,但找不到从特定位置保存的文件的读取方法。

从这个url https://learn.microsoft.com/en-us/aspnet/core/blazor/file-uploads?view=aspnetcore-6.0&pivots=server#upload-files-to-a-server中我可以看到

避免将传入的文件流直接读入内存。例如,不要将文件字节复制到MemoryStream或读取为字节数组。这些方法可能会导致性能和安全问题,特别是在Blazor Server中。相反,请考虑将文件字节复制到外部存储区,例如blob或磁盘上的文件。如果需要访问表示文件字节的流,请使用IBrowserFile.OpenReadStream。

这就是为什么我考虑先将文件保存到某个位置,然后从文件中读取的原因。

但是找不到将文件内容复制到流中的方法,然后CsvHelper可以使用该流将其转换为数据表,如csvHelper示例中所示

代码语言:javascript
运行
复制
using (var reader = new StreamReader("path\\to\\file.csv")) // How can i read from the file which is just saved!
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
   
}

还是真的有必要保存文件或任何可用于将excel的内容读取到csvHelper的安全方法?

找到了另一个有用的线程在流中使用CsvHelper,但看起来解决方案是使用其他插件

EN

回答 1

Stack Overflow用户

发布于 2022-01-17 22:14:44

我维护一个Excel数据读取器库,您可能会更幸运地使用该库:Sylvan.Data.Excel。它是开源的,麻省理工学院授权的,目标是netStandard2.0或2.1 (它支持所有.NET核心版本),没有其他依赖项。它可以与文件路径一起使用,也可以为其提供流。

它支持三种最广泛使用的Excel格式.xlsx.xslb.xls。它是用于.NET的速度最快、内存效率最高的Excel库 (在某些情况下有很大的差距)。API实现了DbDataReader,因此对于任何使用过ADO.NET API的人来说,它都应该是熟悉的。

代码语言:javascript
运行
复制
using Sylvan.Data.Excel;

var reader = ExcelDataReader.Create("path/to/file.xlsx");
// alternately you can provide a stream and a file type
//var reader = ExcelDataReader.Create(stream, ExcelWorkbookType.ExcelXml);

do // iterate sheets
{ 
    var sheet = reader.WorksheetName;
    // iterate rows in the file
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            var value = reader.GetString(i);
        }
    }
} while (reader.NextResult());
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70745065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档