netcore项目中使用miniexcel

1.miniexcel背景简介

常工作中经常与数据打交道的同学肯定会难以避免对Excel的一些数据操作如导入、导出等,但是当对一些大数据量操作Excel时经常会遇到一个常见的问题内存溢出。今天给大家推荐一个简单、高效、低内存避免OOM(内存溢出)的.NET操作Excel开源框架:MiniExcel。
MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。
[gitee地址](https://gitee.com/dotnetchina/MiniExcel?_from=gitee_search#getstart1)

在这里插入图片描述

2.特点

  • 低内存耗用,避免OOM、频繁 Full GC 情况。
  • 支持即时操作每行数据。
  • 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询。
  • 轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB。
  • 简便操作的 API 风格。

3.主流Excel操作框架性能对比

导入、查询 Excel 比较
在这里插入图片描述
导出、创建 Excel 比较
在这里插入图片描述

4.使用经验示例

下面记录一些我自己项目中使用的经验和例子。
首先是查询:

var rows = MiniExcel.Query<ImportOrganizations>(path);
public class ImportOrganizations
{
    [ExcelColumnName("企业名称")]
    public string OrganizationName { get; set; }
    [ExcelColumnName("统一社会信用代码")]
    public string CreditCode { get; set; }
    [ExcelColumnName("联系人")]
    public string ContactPersonName { get; set; }
    [ExcelColumnName("联系人手机")]
    public string ContactPersonTel { get; set; }
    [ExcelColumnName("企业类型")]
    public string OrganizationTypes { get; set; }
}

ExcelColumnName可以加列名,中国肯定是中文的表头,这点使用起来就很方便了。

query的参数path这里需要注意一下,这个path是本地的路径,如果是远程的链接路径是 打不开的,这里翻看了底层代码,实际上使用的还是system.io 下的File.Open,File.Open注定了只能读取本地文件了。
这里还有个折中方案,就是先下载下来再去读下载下来的文件然后导入到库里。

 public static void SaveAsLocal(IFormFile file)
 {
      using (var stream  = file.OpenReadStream())
      {
          MiniExcel.SaveAs($"DownloadFile/{Guid.NewGuid()}_{file.FileName}",  stream.GetReader(),configuration:new OpenXmlConfiguration(){AutoFilter = false});
      }
  }

对于我们来说大多数还是传的文件流来读取文件(IFormFile file形式)。
我们 来看一种写法:

 public static List<T> GetList<T>(IFormFile file)
  {
       using (var stream = file.OpenReadStream())
       {
           var list = stream.Query().Cast<T>().ToList();
           return list;
       }
   }

Query支持Cast方法,按说可以转换为对象,但是这里我封装的这个泛型方法并没有好使,报错了。不得已我只能单独读取:

var rows = new List<ImportOrganizations>();
 using (var stream = file.OpenReadStream())
  {
      rows = (await stream.QueryAsync<ImportOrganizations>()).ToList();
  }

这样读取出来就不报错了,不知道为什么,暂时认定为miniexcel的bug。

获取excel表头值:

 using (var stream = file.OpenReadStream())
  {
        var columns = stream.GetColumns(useHeaderRow:true);//方式1
   }
        
var row2 = MiniExcel.Query(templateFilePath).Cast<IDictionary<string,object>>().First();//方式2

上面是两种获取的方式,templateFilePath是文件路径。

获取sheet页

 using (var stream = file.OpenReadStream())
 {
      var sheetNames = stream.GetSheetNames();
  }

导出:

public static FileStreamResult SaveAs(object value, string fileName)
{
    var memoryStream = new MemoryStream(); 
    memoryStream.SaveAs(value,configuration: new OpenXmlConfiguration() { AutoFilter = false });
    memoryStream.Seek(0, SeekOrigin.Begin);
    return new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    {
        FileDownloadName = fileName
    };
}

value就是导出的list,fileName文件名称。AutoFilter=false是指导出的excel文件默认不加筛选。

导出完后可以调用一下SaveAs方法,将文件报存到服务器 (本地):

 MiniExcel.SaveAs($"DownloadFile/{Guid.NewGuid()}_{file.FileName}",rows):
 

rows是我们上面query后的list。

校验excel行数,排除掉空白行:

 public static void CheckRowCount(IFormFile file, int count = 8000)
    {
        using (var stream = file.OpenReadStream())
        {
            var dt = stream.QueryAsDataTable();
            var rows = dt.AsEnumerable().Where(row => !row.ItemArray.All(field => string.IsNullOrWhiteSpace(field.ToString())));
            if (rows.Count() > count)
            {
                throw new UserFriendlyException("ExcelRowNumber_Error");
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用 .NET Core 编写一个 Web API 项目,你可以按照以下步骤进行操作: 1. 安装 .NET Core SDK:首先,保你已经安装了最新的 .NET Core SDK。你可以从 Microsoft方网站(https://dotnet.microsoft.com/download)下载并安装适合你操作系统的版本。 2. 创建 Web API 项目:打开命令行终端或者使用集成开发环境(IDE)如 Visual Studio Code,在你想要创建项目的目录下执行以下命令: ``` dotnet new webapi -n YourProjectName ``` 这将在当前目录下创建一个名为 YourProjectName 的新 Web API 项目。 3. 进入项目目录:执行以下命令进入项目目录: ``` cd YourProjectName ``` 4. 编写 API 控制器:在 Controllers 文件夹创建一个新的控制器文件(例如 `ValuesController.cs`),并按照需要实现你的 API 逻辑。例如,你可以创建一个简单的 GET 请求处理方法: ```csharp using Microsoft.AspNetCore.Mvc; namespace YourProjectName.Controllers { [ApiController] [Route("api/[controller]")] public class ValuesController : ControllerBase { [HttpGet] public ActionResult<string> Get() { return "Hello, World!"; } } } ``` 5. 运行项目:返回项目根目录,并执行以下命令来运行项目: ``` dotnet run ``` 这将启动一个本地开发服务器,并监听默认的端口号(通常是 5000)。 6. 测试你的 API:打开浏览器或使用工具如 Postman,访问 `http://localhost:5000/api/values`(如果你修改了默认的端口号,请相应地更改 URL),你将会看到返回的 "Hello, World!"。 这只是一个简单的示例,你可以根据你的需求添加更多的控制器和路由。你也可以使用 Entity Framework Core 或其他库来访问数据库,实现更复杂的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨中深巷的油纸伞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值