From cf8342901b17f32d2a93234e2b034435b91c9294 Mon Sep 17 00:00:00 2001 From: Victor Irzak Date: Sun, 6 Jul 2025 10:16:04 -0400 Subject: [PATCH 1/4] Replace image chart with mermaid --- README.md | 8 +++++++- README.zh-CN.md | 9 ++++++++- README.zh-Hant.md | 10 +++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1aa787c5..92e7d392 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,14 @@ MiniExcel is a simple and efficient Excel processing tool for .NET, specifically At present, most popular frameworks need to load all the data from an Excel document into memory to facilitate operations, but this may cause memory consumption problems. MiniExcel's approach is different: the data is processed row by row in a streaming manner, reducing the original consumption from potentially hundreds of megabytes to just a few megabytes, effectively preventing out-of-memory(OOM) issues. -![Screenshot 2025-06-22 123525](https://github.com/user-attachments/assets/0b99a61e-8061-4604-8957-0b1f3ec74544) +```mermaid +flowchart LR + A1["Excel analysis
process"] --> A2>"Unzipping
XLSX file"] --> A3>"Parsing
OpenXML"] --> A4>"Model
conversion"] --> A5>"Output"] + B1["Other Excel
Frameworks"] --> B2>"Memory"] --> B3>"Memory"] --> B4>"Workbooks &
Worksheets"] --> B5>"All rows at
the same time"] + + C1["MiniExcel"] --> C2>"Stream"] --> C3>"Stream"] --> C4>"POCO or dynamic"] --> C5>"Deferred execution
row by row"] +``` ### Features diff --git a/README.zh-CN.md b/README.zh-CN.md index e55b6a1a..2798d106 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -42,7 +42,14 @@ MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。 -![image](https://user-images.githubusercontent.com/12729184/113120478-33d59980-9244-11eb-8675-a49651c8af67.png) +```mermaid +flowchart LR + A1["Excel 解析流程"] --> A2>"XLSX文件
解壓縮"] --> A3>"解析
OpenXML"] --> A4>"模型轉"] --> A5>"返回結果"] + + B1["一般框架"] --> B2>"記憶體"] --> B3>"記憶體"] --> B4>"封裝類別"] --> B5>"全部資料"] + + C1["MiniExcel"] --> C2>"Stream流"] --> C3>"Stream流"] --> C4>"POCO
或 dynamic"] --> C5>"延遲查詢
一行一行返回"] +``` ### 特点 - 低内存耗用,避免OOM、频繁 Full GC 情况 diff --git a/README.zh-Hant.md b/README.zh-Hant.md index 13b3c64d..34787dfa 100644 --- a/README.zh-Hant.md +++ b/README.zh-Hant.md @@ -41,7 +41,15 @@ MiniExcel 簡單、高效避免OOM的.NET處理Excel查、寫、填充工具。 目前主流框架大多需要將資料全載入到記憶體方便操作,但這會導致記憶體消耗問題,MiniExcel 嘗試以 Stream 角度寫底層算法邏輯,能讓原本1000多MB占用降低到幾MB,避免記憶體不夠情況。 -![image](https://user-images.githubusercontent.com/12729184/113084691-1804d000-9211-11eb-9b08-cbb89d9ecdc2.png) +```mermaid +flowchart LR + A1["Excel 解析流程"] --> A2>"XLSX文件
解壓縮"] --> A3>"解析
OpenXML"] --> A4>"模型轉"] --> A5>"返回結果"] + + B1["一般框架"] --> B2>"記憶體"] --> B3>"記憶體"] --> B4>"封裝類別"] --> B5>"全部資料"] + + C1["MiniExcel"] --> C2>"Stream流"] --> C3>"Stream流"] --> C4>"POCO
或 dynamic"] --> C5>"延遲查詢
一行一行返回"] +``` + ### 特點 - 低記憶體耗用,避免OOM、頻繁 Full GC 情況 From 064af424c17509fd8e5848a847ca9c0790b2f263 Mon Sep 17 00:00:00 2001 From: Victor Irzak Date: Sun, 6 Jul 2025 12:44:23 -0400 Subject: [PATCH 2/4] Remove drawio --- docs/core_logic_diagram.drawio | 145 --------------------------------- 1 file changed, 145 deletions(-) delete mode 100644 docs/core_logic_diagram.drawio diff --git a/docs/core_logic_diagram.drawio b/docs/core_logic_diagram.drawio deleted file mode 100644 index 2080c187..00000000 --- a/docs/core_logic_diagram.drawio +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 02ade2e0b0635913d41a9621b36ed28ba7fb680d Mon Sep 17 00:00:00 2001 From: Victor Irzak Date: Sun, 6 Jul 2025 19:42:14 -0400 Subject: [PATCH 3/4] Change style --- README.md | 16 +++++++++--- README.zh-CN.md | 14 +++++++--- README.zh-Hant.md | 65 ++++++++++++++++++++++++++--------------------- 3 files changed, 59 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 92e7d392..45f4ffe0 100644 --- a/README.md +++ b/README.md @@ -39,11 +39,19 @@ At present, most popular frameworks need to load all the data from an Excel docu ```mermaid flowchart LR - A1["Excel analysis
process"] --> A2>"Unzipping
XLSX file"] --> A3>"Parsing
OpenXML"] --> A4>"Model
conversion"] --> A5>"Output"] + A1(["Excel analysis
process"]) --> A2{{"Unzipping
XLSX file"}} --> A3{{"Parsing
OpenXML"}} --> A4{{"Model
conversion"}} --> A5(["Output"]) - B1["Other Excel
Frameworks"] --> B2>"Memory"] --> B3>"Memory"] --> B4>"Workbooks &
Worksheets"] --> B5>"All rows at
the same time"] + B1(["Other Excel
Frameworks"]) --> B2{{"Memory"}} --> B3{{"Memory"}} --> B4{{"Workbooks &
Worksheets"}} --> B5(["All rows at
the same time"]) - C1["MiniExcel"] --> C2>"Stream"] --> C3>"Stream"] --> C4>"POCO or dynamic"] --> C5>"Deferred execution
row by row"] + C1(["MiniExcel"]) --> C2{{"Stream"}} --> C3{{"Stream"}} --> C4{{"POCO or dynamic"}} --> C5(["Deferred execution
row by row"]) + + classDef analysis fill:#D0E8FF,stroke:#1E88E5,color:#0D47A1,font-weight:bold; + classDef others fill:#FCE4EC,stroke:#EC407A,color:#880E4F,font-weight:bold; + classDef miniexcel fill:#E8F5E9,stroke:#388E3C,color:#1B5E20,font-weight:bold; + + class A1,A2,A3,A4,A5 analysis; + class B1,B2,B3,B4,B5 others; + class C1,C2,C3,C4,C5 miniexcel; ``` ### Features @@ -1540,7 +1548,7 @@ public class ApiController : Controller
-" + A2>"XLSX文件
解壓縮"] --> A3>"解析
OpenXML"] --> A4>"模型轉"] --> A5>"返回結果"] + A1(["Excel 解析流程"]) --> A2{{"XLSX文件
解壓縮"}} --> A3{{"解析
OpenXML"}} --> A4{{"模型轉"}} --> A5(["返回結果"]) - B1["一般框架"] --> B2>"記憶體"] --> B3>"記憶體"] --> B4>"封裝類別"] --> B5>"全部資料"] + B1(["一般框架"]) --> B2{{"記憶體"}} --> B3{{"記憶體"}} --> B4{{"封裝類別"}} --> B5(["全部資料"]) - C1["MiniExcel"] --> C2>"Stream流"] --> C3>"Stream流"] --> C4>"POCO
或 dynamic"] --> C5>"延遲查詢
一行一行返回"] + C1(["MiniExcel"]) --> C2{{"Stream流"}} --> C3{{"Stream流"}} --> C4{{"POCO
或 dynamic"}} --> C5(["延遲查詢
一行一行返回"]) + + classDef analysis fill:#D0E8FF,stroke:#1E88E5,color:#0D47A1,font-weight:bold; + classDef others fill:#FCE4EC,stroke:#EC407A,color:#880E4F,font-weight:bold; + classDef miniexcel fill:#E8F5E9,stroke:#388E3C,color:#1B5E20,font-weight:bold; + + class A1,A2,A3,A4,A5 analysis; + class B1,B2,B3,B4,B5 others; + class C1,C2,C3,C4,C5 miniexcel; ``` ### 特点 diff --git a/README.zh-Hant.md b/README.zh-Hant.md index 34787dfa..8ad84234 100644 --- a/README.zh-Hant.md +++ b/README.zh-Hant.md @@ -43,13 +43,20 @@ MiniExcel 簡單、高效避免OOM的.NET處理Excel查、寫、填充工具。 ```mermaid flowchart LR - A1["Excel 解析流程"] --> A2>"XLSX文件
解壓縮"] --> A3>"解析
OpenXML"] --> A4>"模型轉"] --> A5>"返回結果"] + A1(["Excel 解析流程"]) --> A2{{"XLSX文件
解壓縮"}} --> A3{{"解析
OpenXML"}} --> A4{{"模型轉"}} --> A5(["返回結果"]) - B1["一般框架"] --> B2>"記憶體"] --> B3>"記憶體"] --> B4>"封裝類別"] --> B5>"全部資料"] + B1(["一般框架"]) --> B2{{"記憶體"}} --> B3{{"記憶體"}} --> B4{{"封裝類別"}} --> B5(["全部資料"]) - C1["MiniExcel"] --> C2>"Stream流"] --> C3>"Stream流"] --> C4>"POCO
或 dynamic"] --> C5>"延遲查詢
一行一行返回"] -``` + C1(["MiniExcel"]) --> C2{{"Stream流"}} --> C3{{"Stream流"}} --> C4{{"POCO
或 dynamic"}} --> C5(["延遲查詢
一行一行返回"]) + + classDef analysis fill:#D0E8FF,stroke:#1E88E5,color:#0D47A1,font-weight:bold; + classDef others fill:#FCE4EC,stroke:#EC407A,color:#880E4F,font-weight:bold; + classDef miniexcel fill:#E8F5E9,stroke:#388E3C,color:#1B5E20,font-weight:bold; + class A1,A2,A3,A4,A5 analysis; + class B1,B2,B3,B4,B5 others; + class C1,C2,C3,C4,C5 miniexcel; +``` ### 特點 - 低記憶體耗用,避免OOM、頻繁 Full GC 情況 @@ -108,29 +115,29 @@ Benchmark History : [Link](https://github.com/mini-software/MiniExcel/issues/27 邏輯 : 以 [**Test1,000,000x10.xlsx**](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 | -| OpenXmlSDK | 'OpenXmlSDK QueryFirst' | 1,413 MB | 52.34865 sec | -| ClosedXml | 'ClosedXml QueryFirst' | 2,158 MB | 66.18897 sec | -| ClosedXml | 'ClosedXml Query' | 2,184 MB | 191.43412 sec | +| 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 | +| OpenXmlSDK | 'OpenXmlSDK QueryFirst' | 1,413 MB | 52.34865 sec | +| ClosedXml | 'ClosedXml QueryFirst' | 2,158 MB | 66.18897 sec | +| ClosedXml | 'ClosedXml Query' | 2,184 MB | 191.43412 sec | #### 導出、創建 Excel 比較 邏輯 : 創建1千萬筆 "HelloWorld" -| Library | Method | 最大記憶體耗用 | 平均時間 | -| ------------------------ | -------------: | ---------------: | -----------: | -| MiniExcel | 'MiniExcel Create Xlsx' | 15 MB | 11.53181 sec | -| Epplus | 'Epplus Create Xlsx' | 1,204 MB | 22.50971 sec | -| OpenXmlSdk | 'OpenXmlSdk Create Xlsx' | 2,621 MB | 42.47399 sec | -| ClosedXml | 'ClosedXml Create Xlsx' | 7,141 MB | 140.93992 sec | +| Library | Method | 最大記憶體耗用 | 平均時間 | +| ---------- | -----------------------: | -------------: | ------------: | +| MiniExcel | 'MiniExcel Create Xlsx' | 15 MB | 11.53181 sec | +| Epplus | 'Epplus Create Xlsx' | 1,204 MB | 22.50971 sec | +| OpenXmlSdk | 'OpenXmlSdk Create Xlsx' | 2,621 MB | 42.47399 sec | +| ClosedXml | 'ClosedXml Create Xlsx' | 7,141 MB | 140.93992 sec | @@ -170,9 +177,9 @@ using (var stream = File.OpenRead(path)) * Key 系統預設為 `A,B,C,D...Z` -| MiniExcel | 1 | -| -------- | -------- | -| Github | 2 | +| MiniExcel | 1 | +| --------- | --- | +| Github | 2 | ```csharp @@ -196,10 +203,10 @@ using (var stream = File.OpenRead(path)) Input Excel : -| Column1 | Column2 | -| -------- | -------- | -| MiniExcel | 1 | -| Github | 2 | +| Column1 | Column2 | +| --------- | ------- | +| MiniExcel | 1 | +| Github | 2 | ```csharp From e90a9a2c5e3f3a65bb1e7a32518cc4d7eaedea45 Mon Sep 17 00:00:00 2001 From: Wei Lin Date: Mon, 7 Jul 2025 10:35:21 +0800 Subject: [PATCH 4/4] Update README.zh-CN.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🙌🙌🙌 Because in China Gitee platform not support mermaid yet, and lots miniexcel users in China use this platform : https://gitee.com/dotnetchina/MiniExcel Signed-off-by: Wei Lin --- README.zh-CN.md | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/README.zh-CN.md b/README.zh-CN.md index b9c5db10..e55b6a1a 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -42,22 +42,7 @@ MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工 目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel 尝试以 Stream 角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。 -```mermaid -flowchart LR - A1(["Excel 解析流程"]) --> A2{{"XLSX文件
解壓縮"}} --> A3{{"解析
OpenXML"}} --> A4{{"模型轉"}} --> A5(["返回結果"]) - - B1(["一般框架"]) --> B2{{"記憶體"}} --> B3{{"記憶體"}} --> B4{{"封裝類別"}} --> B5(["全部資料"]) - - C1(["MiniExcel"]) --> C2{{"Stream流"}} --> C3{{"Stream流"}} --> C4{{"POCO
或 dynamic"}} --> C5(["延遲查詢
一行一行返回"]) - - classDef analysis fill:#D0E8FF,stroke:#1E88E5,color:#0D47A1,font-weight:bold; - classDef others fill:#FCE4EC,stroke:#EC407A,color:#880E4F,font-weight:bold; - classDef miniexcel fill:#E8F5E9,stroke:#388E3C,color:#1B5E20,font-weight:bold; - - class A1,A2,A3,A4,A5 analysis; - class B1,B2,B3,B4,B5 others; - class C1,C2,C3,C4,C5 miniexcel; -``` +![image](https://user-images.githubusercontent.com/12729184/113120478-33d59980-9244-11eb-8675-a49651c8af67.png) ### 特点 - 低内存耗用,避免OOM、频繁 Full GC 情况