netcore项目中使用miniexcel

news2024/9/29 5:27:07

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1140468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SILKYPIX Developer Studio Pro 11E for Mac: 掌握数码照片处理的黄金标准

在当今的数字时代&#xff0c;照片处理已经成为我们日常生活的一部分。无论是社交媒体分享&#xff0c;还是个人相册制作&#xff0c;我们总是希望我们的照片能够展现出最佳的效果。然而&#xff0c;这并非易事。幸运的是&#xff0c;SILKYPIX Developer Studio Pro 11E for Ma…

Angular-04:指令

① 内置指令1.1 *ngIf 结构指令1.2 [hidden] 属性指令1.3. *ngFor 结构指令1.4 *ngSwitch 结构指令 ② 自定义指令用法 指令是angular操作dom的途径&#xff0c;分为属性指令和结构指令。属性指令&#xff1a;修改元素的外观或行为。使用 [ ] 包裹。结构指令&#xff1a;增加、…

未来嵌入式在哪些方向会更火?

针对于嵌入式比较官方的定义为&#xff1a;嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能、可靠性、成本、体积、功耗、环境等)灵活裁剪软硬件模块的专用计算机系统。目前,随着全球物联网设备的大量使用和ChatGpt的出现,嵌入式系统市场目前呈现出一个…

商人宝:选择服装店收银系统源码需要注意的三个关键点

当选择服装店收银系统源码时&#xff0c;有几个关键点需要注意。首先&#xff0c;确保系统具备完备的功能&#xff0c;以满足日常运营的需求。其次&#xff0c;易用性和用户体验也是重要的考虑因素。最后&#xff0c;安全性和稳定性是不可忽视的要素。商人宝开源收银系统今天分…

小型洗衣机哪个牌子质量好?家用小洗衣机推荐

随着人们的生活水平的提升&#xff0c;越来越多小伙伴来开始追求更高的生活水平&#xff0c;一些智能化的小家电就被发明出来&#xff0c;而且小型洗衣机是其中一个。现在通过内衣裤感染到细菌真的是越来越多&#xff0c;所以我们对内衣裤的清洗频次会高于普通衣服&#xff0c;…

第27届亚洲国际动力传动与控制技术展览会盛大开幕,意大利国家展团闪耀回归

2023年10月24日&#xff0c;第27届亚洲国际动力传动与控制技术展览会&#xff08;PTC ASIA&#xff09;在上海新国际博览中心正式拉开帷幕。作为亚太地区动力传动行业的风向标&#xff0c;PTC ASIA致力于为来自世界各地的参展企业提供专业的采供、技术信息交互平台&#xff0c;…

社群内容:吸粉、活跃社群的关键

优质的内容对社群的活跃度究竟有多重要&#xff0c;我们不妨通过以下的场景一起来感受下&#xff1a; 社群 1&#xff1a;每天群里发的都是一些标题党&#xff0c;诸如“震惊&#xff01;&#xff0a;&#xff0a;石头开口说人话”等&#xff1b; 社群 2&#xff1a;每天群里发…

css属性clip-path的使用说明

前言 当ui设计上的图片、div等的形状不是长方形&#xff0c;而是多边形的时候&#xff0c;就可以借助clip-path这个css属性来实现。 clip-path CSS 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示&#xff0c;区域外的隐藏。【from: MDN】 clip-path可以理解为一把剪…

虹科干货 | HK-TrueNAS版本大揭秘!一文教您如何选择合适的TrueNAS软件

文章来源&#xff1a;虹科网络基础设施 阅读原文&#xff1a;https://mp.weixin.qq.com/s/Iv0zDDmiDgE9vEGlAZs-sg 1&#xff0e;导语 TrueNAS是虹科iXsystems 设计和开发的NAS 操作系统&#xff0c;提供许多功能&#xff0c;例如文件存储、虚拟机 (VM) 和媒体服务器。它基于…

21.9 Python 使用Selenium库

Selenium是一个自动化测试框架&#xff0c;主要用于Web应用程序的自动化测试。它可以模拟用户在浏览器中的操作&#xff0c;如打开网页、点击链接、填写表单等&#xff0c;并且可以在代码中实现条件判断、异常处理等功能。Selenium最初是用于测试Web应用程序的&#xff0c;但也…

SQL查询优化---子查询优化、排序分组优化、覆盖索引优化

1、子查询优化 1、尽量不要使用not in 或者 not exists 取所有不为掌门人的员工&#xff0c;按年龄分组 &#xff0c;每个年龄段多少人 SELECT SQL_NO_CACHE age,count(*) FROM emp a WHERE id NOT IN(SELECT ceo FROM dept b2 WHERE ceo IS NOT NULL)group by age having…

NFC读卡器ST25R3911B-AQWT、ST25R3917B-AQET、ST25R3919B-AQET产品描述、功能框图

一、ST25R3911B 1.4 W功耗可支持VHBR和AAT的高性能HF读卡器 / NFC发起设备 ST25R3911B 是高度集成的NFC发起设备 / HF读卡器IC&#xff0c;包括模拟前端&#xff08;analog front end&#xff0c;AFE&#xff09;和一个高度集成的数据帧系统&#xff0c;可用于ISO 18092&#…

房产网源码 房产中介小程序源码 房产门户网站源码

房产网源码 房产中介小程序源码 房产门户网站源码 功能介绍&#xff1a; 一、付费发布信息 支持付费发布、刷新、置顶房源信息&#xff1b;二、个人发布信息 支持个人和房产经纪人发布房源信息&#xff1b;三、新房楼盘模块 支持新房楼盘功能&#xff0c;后台添加…

数字调制与星座图

文章目录 数字调制什么是调制&#xff1f;为什么调制&#xff1f;数字调制幅移键控 (ASK)频移键控 (FSK)相移键控 (PSK)二相相移键控(BPSK)正交相移键控(QPSK)补充&#xff1a;什么是相位 星座图IQ调制与解调IQ调制IQ解调IQ调制与解调的原理与过程IQ调制的应用举例 正交幅度调制…

ICC2:分段长tree的流程

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 分段长tree操作起来方法很多,这里提供两种ICC2分段长tree的方法。有需要的可以试试。 1.用原始sdc长一遍tree,找得到要做subtree部分,并预估latency值。 2.把sdc中添加subtree clock,subtree是…

使用Intersection Observer API 检测元素是否出现在可视窗口

使用Intersection Observer API 检测元素是否出现在可视窗口 API解读&#xff1a; Intersection Observer API提供了一种异步检测目标元素与祖先元素或视口(可统称为根元素)相交情况变化的方法。 注意点&#xff1a;因为该 API 是异步的&#xff0c;它不会随着目标元素的滚动…

基于springboot实现校园交友网站管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校园交友网站管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生…

COSCon'23媒体和社区合作伙伴正式公布!百川相聚,潮汇大海,邀您天府之城共话开源!...

一年一度的开源盛会&#xff0c;COSCon23 第八届中国开源年会&#xff0c;将于10月28~29日&#xff0c;在四川成都市高新区菁蓉汇召开&#xff01;本次大会的主题是&#xff1a;“开源&#xff1a;川流不息、山海相映”&#xff01; 如往年一样&#xff0c;作为中国最大的非营利…

独创变频杀毒(血影内核) 瑞星杀毒软件V16保驾护航

下载地址&#xff1a;https://user.qzone.qq.com/512526231/main

MySQL知识总结(内附超详细知识框架图)

MySQL知识总结 博友们&#xff0c;你们好&#xff01;博主最近对MySQL相关的知识进行了复盘&#xff0c;并通过思维导图的方式提取出了MySQL的核心知识点&#xff0c;现将复盘结果分享给大家&#xff0c;希望能够对大家学习MySQL有所帮助。 下面博主将MySQL各大模块的思维导图…