# ShExcelLib **Repository Path**: crazydu/sh-excel-lib ## Basic Information - **Project Name**: ShExcelLib - **Description**: 一个.NET下用于快速读取Excel数据的库 - **Primary Language**: C# - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-11-04 - **Last Updated**: 2024-11-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ShExcelLib #### 介绍 ##### 项目背景 某一天,我的一段导入Excel至数据库的程序内存溢出异常了,检查了一下,Excel数据增长得太大,耗的内存过多。 之前是用Aspose.Cells来完成Excel读取,Aspose.Cells是将文件全部读入内存,再读取数据的。我对比过多个Excel组件, 不得不说Aspose在常规的情况下,是功能最丰富速度最快的一个。但对于大批量的数据处理,它们会消耗大量的内存。 我也试过NPOI等其他组件,在海量的数据下,更加惨不忍睹。 于是在网上搜罗了一些内容,实在也找不出什么好的。搜到了个MiniExcel,近期挺火的,试用了一下,没满足自己的需求,于是自己撸了一个。 自吹一下: 代码极少,核心的类是ExcelReader,也就300行代码,一眼就看光了。但功能足够灵活,速度足够快,内存消耗足够小。 经过一个200M的文件测试,每行180多个字段(很变态?不,还有更变态的),内存消耗很小,如果是Aspose.Cells的话,能消耗掉6G内存。在运行过程中最高消耗600M左右内存,然后GC后后续稳定在300M左右 (无法避免,sharedStrings内容在解压Zip后就是占那么大,如果没有sharedStrings,都是用inlineStr的话,这300M就没了)。 速度稳定在每秒1500条左右的读取速度。如果字段更少,只有十来个的话,会更快。 ##### 功能特点(参考项目中的ReadConfig类) 1. 支持读取指定的表名(通过索引,或表名字符串指定),如果两者都指定,优先表名字符串 2. 支持指定的表头行,即读取某行的内容,作为数据的字段 3. 支持自定义表头清单,即直接指定数据字段(如果指定该配置,则以上第2点失效) 4. 支持指定的行号,作为数据开始行(因为并不是所有的表,都那么老老实实的从第2行开始插入数据) 5. 自定义日期、时间格式字符串 6. 准确识别Excel中的单元格,是数字还是日期,无论是使用了内置的日期格式,还是自定义的日期格式。 #### 软件架构 软件架构说明 1. 引用JSON组件Newtonsoft,读取到的数据以JObject返回。如果要实例化为指定的类,就直接使用JObject吧,我就不另做了 2. 引用OpenXml SDK, 方便读取Excel中的内容 3. COPY了 ExcelNumberFormat 项目中的 ExcelDateTime 类,用于Excel中的时间转换 #### 使用说明 1. 直接COPY下来吧,代码实在没几个