开放代码社区 › MiniExcel
MiniExcel
开发工具C#该项目属于 .NET 基金会 ,并根据其 行为准则 运作。 您的 Star 、 赞助 和 购买视频 能帮助 MiniExcel 成长 1群 : 813100564 / 2群 : 579033769 / 3群 : 625362917 / 4群 : 907750429 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 MiniExcel Rust MiniExcel 现已支持 Rust,提供更底层的控制和高效的 XLSX 处理。详见 MiniExcel-Rust 与 Rust/.NET 压力测试。
仓库地址
https://gitee.com/dotnetchina/MiniExcel.gitREADME
<div align="center"> <p><a href="https://www.nuget.org/packages/MiniExcel"><img src="https://img.shields.io/nuget/v/MiniExcel.svg" alt="NuGet"></a> <a href="https://www.nuget.org/packages/MiniExcel"><img src="https://img.shields.io/nuget/dt/MiniExcel.svg" alt=""></a> <a href="https://gitee.com/dotnetchina/MiniExcel"><img src="https://gitee.com/dotnetchina/MiniExcel/badge/star.svg" alt="star"></a> <a href="https://github.com/mini-software/MiniExcel" rel="nofollow"><img src="https://img.shields.io/github/stars/mini-software/MiniExcel?logo=github" alt="GitHub stars"></a> <a href="https://www.nuget.org/packages/MiniExcel"><img src="https://img.shields.io/badge/.NET-%3E%3D%204.5-red.svg" alt="version"></a> <a href="https://deepwiki.com/mini-software/MiniExcel"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a> <a href="https://doi.org/10.5281/zenodo.22054705"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.22054705.svg" alt="DOI"></a> </p> </div> --- [<img align="right" src="https://github.com/dotnet-foundation/swag/blob/main/logo/dotnetfoundation_v4.png?raw=true" width="100" />](https://www.dotnetfoundation.org/) <div align="center"> <p>该项目属于 <a href="https://www.dotnetfoundation.org/">.NET 基金会</a> ,并根据其<a href="https://www.dotnetfoundation.org/code-of-conduct">行为准则</a> 运作。</p> </div> --- <div align="center"> <p> 您的 <a href="https://github.com/mini-software/miniexcel">Star</a>、<a href="https://miniexcel.github.io">赞助</a> 和 <a href="https://edu.51cto.com/course/32914.html">购买视频</a> 能帮助 MiniExcel 成长 </p> </div> --- <div align="center"> <p> QQ群 - 1群 : <a href="https://qm.qq.com/q/33VXm1bMQ8" target="_blank">813100564</a> / 2群 : <a href="https://qm.qq.com/q/TaGjA1sPaq" target="_blank">579033769</a> / 3群 : <a href="https://qm.qq.com/q/QOtWF0fAEq" target="_blank">625362917</a> / 4群 : <a href="https://qm.qq.com/q/iKYWzIZ33y" target="_blank">907750429</a> </p> </div> ---- ### 简介 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 ### MiniExcel Rust MiniExcel 现已支持 Rust,提供更底层的控制和高效的 XLSX 处理。详见 [MiniExcel-Rust](https://github.com/mini-software/MiniExcel-Rust/blob/main/README.zh-CN.md) 与 [Rust/.NET 压力测试](#rust-与-net-压力测试)。 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。  ### 特点 - 低内存耗用,避免OOM、频繁 Full GC 情况 - 支持`即时`操作每行数据 - 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询 - 轻量,不需要安装 Microsoft Office、COM+,DLL小于150KB - 简便操作的 API 风格 ### 快速开始 - [导入、读取 Excel](#getstart1) - [导出 、创建 Excel](#getstart2) - [模板填充、创建 Excel](#getstart3) - [Excel Column Name/Index/Ignore Attribute](#getstart4) - [例子](#getstart5) ### 安装 请查看 [NuGet](https://www.nuget.org/packages/MiniExcel) ### 命令行工具 通过 .NET Tool 安装 MiniExcel CLI: ```shell dotnet tool install --global MiniExcel.Cli ``` 也可以从 [GitHub Releases](https://github.com/mini-software/MiniExcel/releases) 下载 Windows、Linux 或 macOS 的 NativeAOT 程序,无需安装 .NET 运行时。 Python、Node.js、Rust、Go、Java、PHP 等任何能启动进程的语言都可以调用 NativeAOT CLI。它通过文件路径接收输入,并将查询结果以 JSON 输出,因此不需要 .NET 语言绑定。这里提供的是命令行进程集成,不是原生库 FFI API。 将 Excel 或 CSV 查询为 JSON: ```shell miniexcel query --input input.xlsx --sheet Sheet1 ``` 在 Excel 与 CSV 之间转换: ```shell miniexcel convert --input input.csv --output output.xlsx miniexcel convert --input input.xlsx --output output.csv --overwrite ``` 运行 `miniexcel <command> --help` 查看全部选项。 ### 更新日志 请查看 [Release Notes](https://gitee.com/dotnetchina/MiniExcel/blob/master/docs) ### TODO 请查看 [TODO](https://github.com/mini-software/MiniExcel/projects/1?fullscreen=true) ### 性能比较、测试 Benchmarks 逻辑可以在 [MiniExcel.Benchmarks](https://gitee.com/dotnetchina/MiniExcel/blob/master/benchmarks/MiniExcel.Benchmarks/Program.cs) 查看或是提交 PR,运行指令 ```bash dotnet run -p .\benchmarks\MiniExcel.Benchmarks\ -c Release -f netcoreapp3.1 -- -f * --join ``` 最后一次运行规格、结果 : ```bash BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042 Intel Core i7-7700 CPU 3.60GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores [Host] : .NET Framework 4.8 (4.8.4341.0), X64 RyuJIT Job-ZYYABG : .NET Framework 4.8 (4.8.4341.0), X64 RyuJIT IterationCount=3 LaunchCount=3 WarmupCount=3 ``` Benchmark History : [Link](https://github.com/mini-software/MiniExcel/issues/276) #### Rust 与 .NET 压力测试 本测试比较动态流式 Query 性能:.NET 使用 `OpenXmlImporter.Query`,Rust 使用 `MiniExcel::query`,不包含 Save 性能。将 `MiniExcel` 与 `MiniExcel-Rust` 放在同级目录后,可使用同一份 100,000 行 XLSX 工作簿测试两种实现: ```powershell pwsh ./benchmarks/compare-rust-dotnet.ps1 ``` 默认每轮完整流式读取 3 次,并对每个运行时重复测试 3 轮。脚本会校验两端读取行数一致,并输出耗时与峰值工作集。结果会受硬件、操作系统、文件缓存及运行时版本影响,可通过 `-Passes` 和 `-Iterations` 调整压力。 测试环境:AMD Ryzen 5 5600X、Windows 10 22H2、.NET SDK 10.0.103、Rust 1.85.0。 | 运行时 | 方法 | 每轮读取行数 | 平均耗时 | 平均峰值工作集 | 最大峰值工作集 | |--------|------|-------------:|---------:|---------------:|---------------:| | .NET | `OpenXmlImporter.Query` | 300,000 | 6,282.31 ms | 70.65 MB | 70.71 MB | | Rust | `MiniExcel::query` | 300,000 | 3,814.61 ms | 9.79 MB | 9.83 MB | 以上结果仅供同机环境参考,不代表所有环境下的性能表现。 #### 导入、查询 Excel 比较 逻辑 : 以 [**Test1,000,000x10.xlsx**](https://gitee.com/dotnetchina/MiniExcel/blob/master/benchmarks/MiniExcel.Benchmarks/Test1%2C000%2C000x10.xlsx) 做基准与主流框架做性能测试,总共 1,000,000 行 * 10 列笔 "HelloWorld",文件大小 23 MB | Library | Method | 最大内存耗用 | 平均时间 | | ---------------------------- | -------------: | ---------------: | ---------------: | | MiniExcel | 'MiniExcel QueryFirst' | 0.109 MB | 0.0007264 sec | | ExcelDataReader | 'ExcelDataReader QueryFirst' | 15.24 MB | 10.66421 sec | | MiniExcel | 'MiniExcel Query' | 17.3 MB | 14.17933 sec | | ExcelDataReader | 'ExcelDataReader Query' | 17.3 MB | 22.56508 sec | | Epplus | 'Epplus QueryFirst' | 1,452 MB | 18.19801 sec | | Epplus | 'Epplus Query' | 1,451 MB | 23.64747 sec | | OpenXmlSDK | 'OpenXmlSDK Query' | 1,412 MB | 52.00327 sec