diff --git a/README.md b/README.md index 1aa787c5..45f4ffe0 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,22 @@ 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"]) + + 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 @@ -1534,7 +1548,7 @@ public class ApiController : Controller
-" + 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; +``` ### 特點 - 低記憶體耗用,避免OOM、頻繁 Full GC 情況 @@ -100,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 | @@ -162,9 +177,9 @@ using (var stream = File.OpenRead(path)) * Key 系統預設為 `A,B,C,D...Z` -| MiniExcel | 1 | -| -------- | -------- | -| Github | 2 | +| MiniExcel | 1 | +| --------- | --- | +| Github | 2 | ```csharp @@ -188,10 +203,10 @@ using (var stream = File.OpenRead(path)) Input Excel : -| Column1 | Column2 | -| -------- | -------- | -| MiniExcel | 1 | -| Github | 2 | +| Column1 | Column2 | +| --------- | ------- | +| MiniExcel | 1 | +| Github | 2 | ```csharp 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -