避免OOM的高效Excel处理 MiniExcel

.NET 轻量级处理 Excel 文件库 - MiniExce MiniExcel 是一个轻量高效的 .NET 库,专为处理 Excel 和 CSV 文件而设计,特别适合大数据量场景。它采用流式处理机制,显著降低内存消耗,避免 OOM 问题,同时提供简洁的 API 接口。 核心功能包括: 读取:支持强类型、动态类型和 DataTable 三种方式,可指定工作表 写入:支持对象集合、匿名对象和数据数组写入,提供基础数据追加功能 样式:支持简单字体样式设置 优势:相比传统库(如 NPOI)内存占用更低,处理大文件性能更优 该库适合需要高效处理 Excel/CSV 数据的 . 阅读详情

当前项目中使用最多的几乎是下面的工具生成Excel:

HSSFWorkbook:一般用于操作Excel2003以前(包括2003)的版本,扩展名是.xls。
XSSFWorkbook:一般用于操作Excel2007及以上的版本,扩展名是.xlsx
SXSSFWorkbook(POI 3.8+版本):一般用于大数据量的导出。

第一种:HSSFWorkbook

针对EXCEL2003版本,扩展名为.xls,此种的局限就是导出的行数最多为65535行、256列。一般不会出现内存溢出(OOM)的情况

第二种:XSSFWorkbook

针对EXCEL2007+,扩展名为.xlsx ,最多可以导出1048576行,16384列,不过这样就伴随着一个问题–OOM内存溢出。

第三种:SXSSFWorkbook

SXSSFWorkbook可以根据行数将内存中的数据持久化写到文件中,以此逐步写入,避免OOM。

针对于现在项目需求,采用了MiniExcel进行Excel的导出

  1. 先添加MiniExcel的引用
    在这里插入图片描述

2.查询数据并调用MiniExcel生成文件

	public class ExcelConstants
    {
        // 一个sheet装100w数据
        public const int PerSheetRowCount = 1000000;
        // 每次查询20w数据,每次写入20w数据
        public const int PerWriteRowCount = 200000;
    }
    
 	public class ExportModel
    {
    
    	/*
    	引用MiniExcel  在生成Excel时会自动引用这里的描述作为列头
    	*/
        [ExcelColumnName("导出列1")]
        public string Column1{ get; set; }

        [ExcelColumnName("导出列2")]
        public string Column2{ get; set; }

        [ExcelColumnName("导出列3")]
        public string Column3{ get; set; }


    }
/// <summary>
/// 
/// </summary>
 public string ExportXeniosReportData()
        {
            try
            {
                /*To Do
                获取查询数据的总数代码
               	*/ 
                // 查询数据总数:实际中需要根据查询条件进行统计
                int totalCount = 1000000;
                // 每一个Sheet存放100w条数据
                int sheetDataRows = ExcelConstants.PerSheetRowCount;
                // 每次写入的数据量20w,每页查询20W
                int writeDataRows = ExcelConstants.PerWriteRowCount;
                // 计算需要的Sheet数量
                int sheetNum = (int)Math.Ceiling(totalCount / (double)sheetDataRows);
                // 计算一般情况下每一个Sheet需要写入的次数(一般情况不包含最后一个sheet,因为最后一个sheet不确定会写入多少条数据)
                int oneSheetWriteCount = (int)Math.Ceiling(sheetDataRows / (double)writeDataRows);
                // 计算最后一个sheet需要写入的次数
                int lastSheetWriteCount = (int)Math.Ceiling(totalCount % sheetDataRows / (double)writeDataRows);
                if (lastSheetWriteCount == 0)
                {
                    lastSheetWriteCount = oneSheetWriteCount;
                }

                var filepath = AppDomain.CurrentDomain.BaseDirectory + "自定义文件路径";
                if (!Directory.Exists(filepath))
                {
                    Directory.CreateDirectory(filepath);
                }
                string fileName = "自定义文件名称";
                string excelfilepath = $"{filepath}\\{fileName}.xlsx";

                var sheets = new Dictionary<string, object>();
                if (totalCount == 0)
                {
                    MiniExcel.SaveAs(excelfilepath, null, true, "data", ExcelType.XLSX);
                    _cacheManager.SetCache(cachekey, 100, 1);
                    return null;
                }
                
                // 开始分批查询分次写入
                for (int i = 0; i < sheetNum; i++)
                {
                    var onesheetdata = new List<ExportModel>();
                    // 循环写入次数: j的自增条件是当不是最后一个Sheet的时候写入次数为正常的每个Sheet写入的次数,如果是最后一个就需要使用计算的次数lastSheetWriteCount
                    for (int j = 0; j < (i != sheetNum - 1 ? oneSheetWriteCount : lastSheetWriteCount); j++)
                    {
                    
                        /* To Do
                        分页查询数据赋值 data
                        */
                        onesheetdata.AddRange(data);
                    }
                    sheets.Add($"Sheet{i + 1}", onesheetdata);
                }
                //生成EXCEL
                var config = new OpenXmlConfiguration()
                {
                    TableStyles = TableStyles.Default
                };
                //调用MiniExcel生成文件
                var task = MiniExcel.SaveAsAsync(excelfilepath, sheets, configuration: config);
                return excelfilepath;
            }
            catch (IOException e)
            {
                throw e;
            }
        }

注意

在使用MiniExcel时我们会发现它的MiniExcel.Insert()方法.该方法只支持.csv格式的文件进行操作。
我自己在操作时,发现调用Save() Insert() 时,虽然给了SheetName以及PrintHeader 并没有效果。

if (文件不存在)
{
     MiniExcel.SaveAs(csvfilepath, data, true);

}
else
{
     MiniExcel.Insert(csvfilepath, data);
}

补充
对于上面的生成Excel文件会比较耗时,我们可以细化步骤,将进度值写进缓存,然后前端异步调用+轮询可以实时读取进度。

【netcore】MiniExcel轻量级开源组件使用 MiniExcel轻量级开源组件使用开源地址导入&读取Excle实践效果 开源地址 添加链接描述 通常复杂的EXCEL操作采用NPIO组件,优点:性能优越,支持各种复杂操作。缺点:比较繁琐和重量级 MiniExcel:则可以满足大部分应用场景,又是轻量级 Guget:搜MiniExcel安装组件 导入&读取Excle 文档简介; 读/导入 Excel Query 查询 Excel 返回强型别 IEnumerable 数据 [Try it] public class UserAccou 阅读详情

相关推荐

miniExcel.dll 1.30

miniExcel.dll 1.30 C#读取保存excel文件

MiniExcel 自学文档;

/把这个打开的文件路径显示在 label 中。private void btnOpenFile_Click(object sender, EventArgs e) //点键打开文件按键,if(openFile.ShowDialog() == DialogResult.OK ) //判断是不是成功打开文件。//下面这个就是 miniExecl查询打开的文件并转换为【ToList】赋值给 openExcelFile。在项目中添加 NuGet 包,在浏览中输入 MiniExcel,找到这个包安装即可;

m0_59051296的博客 6137

深入解析USB3.0一致性测试的关键技术与实践指南

本文深入解析了USB3.0一致性测试的核心技术与实践指南。文章阐述了测试如何确保设备在5Gbps高速传输下的信号完整性、电源管理合规性及协议兼容性,并提供了从测试系统搭建到完整流程执行的实战经验,帮助工程师有效应对高速信号、电源与兼容性三大核心挑战。

weixin_29164091的博客 282

开源项目MiniExcel-简单、高效避免OOM的.NET处理Excel查、写、填充数据工具

MiniExcel简介MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。image特点•低内存耗用,避免OOM、频繁 Full GC 情况•支持即时操作每行数据•兼具搭...

dotNET跨平台 3295

仿真系列专栏介绍

大家好!欢迎来到我的仿真学习系列专栏!这是一个我在学习仿真技术过程中整理和分享的系列文章。作为一名正在不断学习和实践的工程师,我希望通过这个专栏,和大家一起探索仿真技术,尤其是在高速信号完整性方面的应用。

案例文章,高速信号 368

出现 Transaction rolled back because it has been marked as rollback-only 解决方法

出现 Transaction rolled back because it has been marked as rollback-only 解决方法

码农研究僧的博客 1万+

C#使用开源操作库MiniExcel操作Excel

MiniExcel 简单、高效避免 OOM 的.NET 处理 Excel 查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本 1000 多 MB 占用降低到几 MB,避免内存不够情况。

明耀的博客 537

69页完整版智慧港口综合解决方案

智慧港口需求4港机远程操控等自动化改造需求自动化码头AGV无线通信及专用视频系统需求安全生产视频监控类需求港机RCMS及设备管理需求岸边智能理货码头三维全景应用智慧港口解决方案5自动化码头AGV/跨运车/无人集卡无线接入港机远控视觉及冗余无线通信视觉集卡防吊起系统集装箱码头岸边智能理货港机RCMS系统无线接入港机智能化管理(无线高清视频监控、一键报警、远程抄表系统)港口拖轮无线接入岸边溢油监测系统TD-LTE覆盖及业务终端接入港口生产管理系统港口可视化集群调度港口GiNMS综合网络设备智能管理全球作业效率最

zuoan1993的博客 2129

.NET 简单、高效、避免OOM的Excel工具

前言最近晚辈尝试做一个.NET简单、高效、避免OOM的Excel工具MiniExcel。主要目前主流框架大多将资料全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。适合像是低规格 azure app service 或是读取大文件等情境。特点低内存耗用,避免OOM(out of m...

weixin_68436326的博客 304

安川机器人外部轴添加

本文详细介绍了如何在安川机器人本体上添加第7轴以及如何设置动作,本文以添加点焊枪为例进行讲解。

haier123888的博客 7892

4、风险管理、信息安全与信息管理的核心原则

本文深入探讨了风险管理、信息安全与信息管理的核心原则,涵盖Risk IT框架、ISO 31000标准以及信息安全与信息管理的关键原则。通过案例分析与实际应用挑战的解析,帮助组织更好地应对数字化时代的风险与安全问题,实现可持续发展。

bread的博客 120

【.net core 通过miniexcel库将Excel文件内容分类输出到不同的Excel中】

.net core 通过miniexcel库将Excel文件内容分类输出到不同的Excel中

wu1825540的博客 2384

QT实现ftp服务器(附完整源码)

QT实现ftp服务器(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1783

C# Excel开源操作库MiniExcel使用教程

目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。逻辑 : 以 Test1,000,000x10.xlsx 做基准与主流框架做性能测试,总共 1,000,000 行 * 10 列笔 “HelloWorld”,文件大小 23 MB。Q. 保存如何取代MiniExcel.SaveAs(path, value),文件存在系统会报已存在错误?

kylezhao2019的博客 2939

YOLOv11 改进入门篇 | 轻量级涨点技巧:GhostConv 替代普通卷积的实战指南

摘要: 本文介绍如何通过GhostConv改进YOLOv11,实现轻量化涨点。YOLOv11深度增加导致参数量、延迟和内存占用上升,GhostConv通过“本征特征+线性变换”策略,在精度几乎无损的情况下降低30%-50%计算量。文章详细解析GhostConv原理,对比普通卷积的参数量和FLOPs优势,并提供完整的代码级改造流程,包括模块实现、注册及网络配置。实验表明,该方法有效提升边缘端推理效率,适用于移动端等资源受限场景。

shrgegrb的博客 1656

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C#使用MiniExcel导入导出数据到Excel/CSV文件

MiniExcel简介简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。特点:低内存耗用,避免OOM、频繁 Full GC 情况支持即时操作每行数据兼具搭配 LINQ 延迟查询特性,能办到低消...

dotNET跨平台 340

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

不会真有人还不会调用Excel吧?

一款开源的Excel 控件,占用内存小,还不要求必须有Office,很棒的控件!

myjackfox的博客 371

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

.net试用MiniExcel优雅的操作Excel

哈喽,大家好!我是指北君。 大家有没有过这样的经历:开发某个项目,需要调用Excel控件去生成Excel文件、填充数据、改变格式等等,常常在测试环境中一切正常,但在生产环境却无法正常调用Excel,不是安装的Excel版本不正确导致调用错误,就是因为超额数据量导致调用控件消耗内存过大,无法顺利解决问题,搞得码农心态崩溃,导致DeadLine延迟?现在好了,铛铛铛,值得推荐的一款实用控件来了:MiniExcel! 1. 控件介绍 MiniExcel简单、高效避免’OOM’的.NET处理Excel查、写、填充数

kyzb2022的博客 7002

.NET操作Excel高效低内存的开源框架 - MiniExcel

Net平台上对Excel进行操作主要有两种方式。第一种,把Excel文件看成一个数据库,通过OleDb的方式进行读取与操作;第二种,调用Excel的COM组件。两种方式各有特点。今天给大家介绍第三种方式:插件方式,目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。

风清扬的专栏 1222

一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel

日常工作中经常与数据打交道的同学肯定会难以避免对Excel的一些数据操作如导入、导出等,但是当对一些大数据量操作Excel时经常会遇到一个常见的问题内存溢出。今天给大家推荐一个简单、高效、低内存避免OOM(内存溢出)的.NET操作Excel开源框架:MiniExcel。MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。

专注于C#/.NET/.NET Core学习、工作、面试干货和实战教程分享。这里聚焦了大量的C#/.NET/.NET Core优质文章、开源项目、实用工具和学习、工作、面试心得。 1276

.NET 中高效 Excel 解决方案 MiniExcel

无论是用于数据分析、报告生成还是数据导入导出,MiniExcel 都能提供强大的支持。概念 : MiniExcel 当判断文件 SharedString 大小超过 5MB,预设会使用本地缓存,如 10x100000.xlsx(一百万笔数据),读取不开启本地缓存需要最高内存使用约195MB,开启后降为65MB。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。

DotNet技术匠 1633

如何使用MiniExcel:高效处理Excel的.NET终极工具

MiniExcel是一款为.NET开发者打造的高效Excel处理库,它以低内存占用、快速处理速度和跨平台支持(Linux、Mac)而著称。无论是导入、导出还是模板化生成电子表格,MiniExcel都能提供简单易用的API,帮助开发者轻松应对各种Excel操作需求。 ## 🚀 为什么选择MiniExcel? 在处理Excel文件时,开发者常常面临两大挑战:内存占用过高和处理速度缓慢。MiniE

gitblog_00099的博客 740

【亲测免费】探索MiniExcel:高效、轻量级的.NET Excel处理工具

MiniExcel是一款高效、低内存占用的.NET Excel处理工具,专为解决Excel操作中的内存溢出问题而设计。它通过流式处理算法,将原本可能占用1000MB内存的操作减少到仅需几MB,完美避免OOM(内存溢出)问题,同时支持Linux和Mac系统,是开发者处理Excel文件的理想选择。 ## 🚀 为什么选择MiniExcel?三大核心优势解析 ### 1️⃣ 超低内存占用,告别OOM

gitblog_00061的博客 1112

C#不要再使用Npoi啦,使用MiniExcel操作Excel文件更快更高效!

1.简介 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架如Npoi 需要将数据全载入到内存方便操作,但这会导致内存消耗问题。MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。Dotnet讲堂这里是Dotnet编程的乐园,如果你对C# Winfom感兴趣,你想学习wpf编写酷炫的界面通过mvvm模式实现前后端解耦,你热衷于智能制造、工控上位机,资深高工带你入坑。23篇原创内容公众号2.

biyusr的专栏 1546

C#库-MiniExcel

MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。從 V0.21.0 開始支持有的類別 format类别set;set;代码效果Query 支持自定义格式转换预设以\r\n作为换行符,自定义请修改NewLine属性。

ccf19881030的专栏 2140
上一篇: EF Decimal小数保留问题
下一篇: LayUI 时间控件的简单使用
Gen??
博客等级 码龄7年 24粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值