[{"data":1,"prerenderedAt":613},["ShallowReactive",2],{"blog-en-reogrid-v4-4-release":3},{"id":4,"title":5,"author":6,"body":7,"date":597,"description":598,"extension":599,"meta":600,"navigation":249,"path":601,"seo":602,"stem":604,"tags":605,"thumbnail":611,"__hash__":612},"blog_en/blog/en/reogrid-v4-4-release.md","Announcing ReoGrid 4.4 — Performance Improvements for Large-Scale Data",null,{"type":8,"value":9,"toc":579},"minimark",[10,15,26,38,45,48,52,78,81,83,87,153,155,159,164,170,203,274,280,284,289,319,328,333,337,345,375,395,400,402,406,409,448,450,454,457,461,475,478,482,502,504,508,511,520,523,534,536,540,547,550,553,555,559,575],[11,12,14],"h2",{"id":13},"introduction","Introduction",[16,17,18,25],"p",{},[19,20,24],"a",{"href":21,"rel":22},"https://github.com/unvell/ReoGrid",[23],"nofollow","ReoGrid"," is a .NET component that brings Excel-like spreadsheet functionality to WinForms and WPF applications.",[16,27,28,29,33,34,37],{},"The newly released ",[30,31,32],"strong",{},"ReoGrid 4.4"," is a version that ",[30,35,36],{},"significantly improves processing performance"," while maintaining full API compatibility. In response to the many requests we have received from customers regarding \"responsiveness when handling large data sets\" and \"time required for sort operations,\" we have substantially accelerated the operations that were time-consuming in the 4.3 series.",[16,39,40,41,44],{},"This article introduces the main improvements in 4.4, supported by ",[30,42,43],{},"measured results comparing v4.3.13 and v4.4.0 in the same environment",".",[46,47],"hr",{},[11,49,51],{"id":50},"key-improvements","Key Improvements",[53,54,55,62,68],"ul",{},[56,57,58,61],"li",{},[30,59,60],{},"Bulk data loading with conditional formatting",": approximately 11,700× faster (70 seconds → 6 milliseconds)",[56,63,64,67],{},[30,65,66],{},"Sorting 10,000 rows",": approximately 10× faster",[56,69,70,77],{},[30,71,72,73],{},"Bulk loading 200,000 cells via ",[74,75,76],"code",{},"SetRangeData",": approximately 3× faster",[16,79,80],{},"Upgrading from 4.3.13 to 4.4.0 requires no changes to existing code.",[46,82],{},[11,84,86],{"id":85},"benchmark-environment","Benchmark Environment",[88,89,90,103],"table",{},[91,92,93],"thead",{},[94,95,96,100],"tr",{},[97,98,99],"th",{},"Item",[97,101,102],{},"Details",[104,105,106,115,123,131,145],"tbody",{},[94,107,108,112],{},[109,110,111],"td",{},"CPU",[109,113,114],{},"AMD Ryzen 9 9900X (12 cores / 24 threads)",[94,116,117,120],{},[109,118,119],{},"OS",[109,121,122],{},"Windows 11 Pro",[94,124,125,128],{},[109,126,127],{},"Runtime",[109,129,130],{},".NET 8.0 (x64, Release build)",[94,132,133,136],{},[109,134,135],{},"Versions compared",[109,137,138,141,142],{},[74,139,140],{},"v4.3.13"," ↔ ",[74,143,144],{},"v4.4.0",[94,146,147,150],{},[109,148,149],{},"Method",[109,151,152],{},"Each scenario: 1 warmup + 3 measurement runs, using min / median",[46,154],{},[11,156,158],{"id":157},"performance-improvements-in-detail","Performance Improvements in Detail",[160,161,163],"h3",{"id":162},"_1-conditional-formatting-with-bulk-data-entry-11700-faster","1. Conditional Formatting with Bulk Data Entry: ~11,700× Faster",[16,165,166,169],{},[30,167,168],{},"Scenario",": One conditional formatting rule (\"set text color to red when value exceeds 100\") is applied to A1:A5000, then values are written sequentially into 5,000 cells.",[88,171,172,183],{},[91,173,174],{},[94,175,176,179],{},[97,177,178],{},"Version",[97,180,182],{"align":181},"right","Time",[104,184,185,192],{},[94,186,187,189],{},[109,188,140],{},[109,190,191],{"align":181},"70,175 ms (about 70 seconds)",[94,193,194,198],{},[109,195,196],{},[30,197,144],{},[109,199,200],{"align":181},[30,201,202],{},"6 ms",[204,205,210],"pre",{"className":206,"code":207,"language":208,"meta":209,"style":209},"language-csharp shiki shiki-themes github-light github-dark","sheet.ConditionalStyles.Add(new Rule(\"THIS > 100\", \"A1:A5000\", new WorksheetRangeStyle\n{\n    Flag = PlainStyleFlag.TextColor,\n    TextColor = SolidColor.Red,\n}));\n\nfor (int r = 0; r \u003C 5000; r++)\n{\n    sheet[r, 0] = r;\n}\n","csharp","",[74,211,212,220,226,232,238,244,251,257,262,268],{"__ignoreMap":209},[213,214,217],"span",{"class":215,"line":216},"line",1,[213,218,219],{},"sheet.ConditionalStyles.Add(new Rule(\"THIS > 100\", \"A1:A5000\", new WorksheetRangeStyle\n",[213,221,223],{"class":215,"line":222},2,[213,224,225],{},"{\n",[213,227,229],{"class":215,"line":228},3,[213,230,231],{},"    Flag = PlainStyleFlag.TextColor,\n",[213,233,235],{"class":215,"line":234},4,[213,236,237],{},"    TextColor = SolidColor.Red,\n",[213,239,241],{"class":215,"line":240},5,[213,242,243],{},"}));\n",[213,245,247],{"class":215,"line":246},6,[213,248,250],{"emptyLinePlaceholder":249},true,"\n",[213,252,254],{"class":215,"line":253},7,[213,255,256],{},"for (int r = 0; r \u003C 5000; r++)\n",[213,258,260],{"class":215,"line":259},8,[213,261,225],{},[213,263,265],{"class":215,"line":264},9,[213,266,267],{},"    sheet[r, 0] = r;\n",[213,269,271],{"class":215,"line":270},10,[213,272,273],{},"}\n",[16,275,276,279],{},[30,277,278],{},"Business impact",": Workflows that load data from external systems into report templates with pre-configured conditional formatting now run smoothly without delay.",[160,281,283],{"id":282},"_2-sorting-10000-rows-10-faster","2. Sorting 10,000 Rows: ~10× Faster",[16,285,286,288],{},[30,287,168],{},": Sort 10,000 rows × 5 columns of random integers in ascending order by column A.",[88,290,291,299],{},[91,292,293],{},[94,294,295,297],{},[97,296,178],{},[97,298,182],{"align":181},[104,300,301,308],{},[94,302,303,305],{},[109,304,140],{},[109,306,307],{"align":181},"397 ms",[94,309,310,314],{},[109,311,312],{},[30,313,144],{},[109,315,316],{"align":181},[30,317,318],{},"39 ms",[204,320,322],{"className":206,"code":321,"language":208,"meta":209,"style":209},"sheet.SortColumn(0, new RangePosition(0, 0, 10000, 5), SortOrder.Ascending);\n",[74,323,324],{"__ignoreMap":209},[213,325,326],{"class":215,"line":216},[213,327,321],{},[16,329,330,332],{},[30,331,278],{},": Large data sets can now be sorted in the on-screen grid with the same operational feel as Excel.",[160,334,336],{"id":335},"_3-bulk-loading-via-setrangedata-3-faster","3. Bulk Loading via SetRangeData: ~3× Faster",[16,338,339,341,342,44],{},[30,340,168],{},": Bulk-load a 2D array of 10,000 rows × 20 columns (200,000 cells in total) via ",[74,343,344],{},"SetRangeData()",[88,346,347,355],{},[91,348,349],{},[94,350,351,353],{},[97,352,178],{},[97,354,182],{"align":181},[104,356,357,364],{},[94,358,359,361],{},[109,360,140],{},[109,362,363],{"align":181},"326 ms",[94,365,366,370],{},[109,367,368],{},[30,369,144],{},[109,371,372],{"align":181},[30,373,374],{},"104 ms",[204,376,378],{"className":206,"code":377,"language":208,"meta":209,"style":209},"var data = new object[10000, 20];\n// ... populate data ...\nsheet.SetRangeData(new RangePosition(0, 0, 10000, 20), data);\n",[74,379,380,385,390],{"__ignoreMap":209},[213,381,382],{"class":215,"line":216},[213,383,384],{},"var data = new object[10000, 20];\n",[213,386,387],{"class":215,"line":222},[213,388,389],{},"// ... populate data ...\n",[213,391,392],{"class":215,"line":228},[213,393,394],{},"sheet.SetRangeData(new RangePosition(0, 0, 10000, 20), data);\n",[16,396,397,399],{},[30,398,278],{},": Initial-load operations that populate the grid with records retrieved from databases or CSV files complete in noticeably less time.",[46,401],{},[11,403,405],{"id":404},"bug-fixes","Bug Fixes",[16,407,408],{},"The main bug fixes are as follows.",[53,410,411,421,433,439],{},[56,412,413,416,417,420],{},[30,414,415],{},"Formula parser",": Added support for the unary plus operator (e.g., ",[74,418,419],{},"=+D25-F8-F14",")",[56,422,423,425,426,429,430,420],{},[30,424,415],{},": Added support for quoted sheet name references (e.g., ",[74,427,428],{},"'BS (JPY)'!B3",", ",[74,431,432],{},"'My Sheet'!A1",[56,434,435,438],{},[30,436,437],{},"Sort",": Fixed an issue where formula cells remained at their original positions during sorting. As in Excel, formulas now move together with their rows",[56,440,441,444,445],{},[30,442,443],{},"Conditional formatting",": Fixed a defect in the rule removal order in ",[74,446,447],{},"ClearConditionalStyles",[46,449],{},[11,451,453],{"id":452},"api-changes","API Changes",[16,455,456],{},"Impact on compatibility has been kept to a minimum, but the following API changes have been made.",[160,458,460],{"id":459},"removed","Removed",[53,462,463,469],{},[56,464,465,468],{},[74,466,467],{},"Worksheet.ConditionalStyleApplyCells"," property",[56,470,471,474],{},[74,472,473],{},"ConditionalStyleApplyCellCollection"," class",[16,476,477],{},"Please use the following methods instead.",[160,479,481],{"id":480},"added","Added",[204,483,485],{"className":206,"code":484,"language":208,"meta":209,"style":209},"bool hasStyle = worksheet.HasConditionalStyle(row, col);\nbool hasStyle = worksheet.HasConditionalStyle(new CellPosition(\"A1\"));\nbool hasStyle = cell.HasConditionalStyles;\n",[74,486,487,492,497],{"__ignoreMap":209},[213,488,489],{"class":215,"line":216},[213,490,491],{},"bool hasStyle = worksheet.HasConditionalStyle(row, col);\n",[213,493,494],{"class":215,"line":222},[213,495,496],{},"bool hasStyle = worksheet.HasConditionalStyle(new CellPosition(\"A1\"));\n",[213,498,499],{"class":215,"line":228},[213,500,501],{},"bool hasStyle = cell.HasConditionalStyles;\n",[46,503],{},[11,505,507],{"id":506},"how-to-upgrade","How to Upgrade",[16,509,510],{},"ReoGrid V4 and later are provided as commercial editions. The latest assemblies can be downloaded by signing in to our customer portal.",[53,512,513],{},[56,514,515,516],{},"Customer portal: ",[19,517,518],{"href":518,"rel":519},"https://portal.unvell.com/",[23],[16,521,522],{},"For existing projects, the upgrade is completed simply by replacing the assembly reference with the downloaded version. No code changes are required.",[16,524,525,526,529,530,533],{},"If you were directly referencing ",[74,527,528],{},"ConditionalStyleApplyCells",", please replace those references with ",[74,531,532],{},"HasConditionalStyle()"," as shown above.",[46,535],{},[11,537,539],{"id":538},"closing","Closing",[16,541,542,543,546],{},"ReoGrid 4.4 is a release that focuses on ",[30,544,545],{},"resolving the performance issues that have the greatest impact on existing users",", rather than on adding new features.",[16,548,549],{},"All figures presented above are measured values obtained by comparing v4.3.13 and v4.4.0 with identical code in the same environment.",[16,551,552],{},"If there are any use cases that you previously avoided due to long processing times, we would be glad if you would give 4.4 a try.",[46,554],{},[11,556,558],{"id":557},"related-links","Related Links",[53,560,561,568],{},[56,562,563],{},[19,564,567],{"href":565,"rel":566},"https://reogrid.net/",[23],"ReoGrid Official Site",[56,569,570],{},[19,571,574],{"href":572,"rel":573},"https://reogrid.net/release-notes",[23],"ReoGrid Release Notes",[576,577,578],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":209,"searchDepth":222,"depth":222,"links":580},[581,582,583,584,589,590,594,595,596],{"id":13,"depth":222,"text":14},{"id":50,"depth":222,"text":51},{"id":85,"depth":222,"text":86},{"id":157,"depth":222,"text":158,"children":585},[586,587,588],{"id":162,"depth":228,"text":163},{"id":282,"depth":228,"text":283},{"id":335,"depth":228,"text":336},{"id":404,"depth":222,"text":405},{"id":452,"depth":222,"text":453,"children":591},[592,593],{"id":459,"depth":228,"text":460},{"id":480,"depth":228,"text":481},{"id":506,"depth":222,"text":507},{"id":538,"depth":222,"text":539},{"id":557,"depth":222,"text":558},"2026-04-30","ReoGrid 4.4 maintains full API compatibility while delivering ~11,700× faster bulk data loading with conditional formatting, ~10× faster sorting of 10,000 rows, and ~3× faster bulk loading via SetRangeData.","md",{},"/blog/en/reogrid-v4-4-release",{"title":5,"description":603},"ReoGrid 4.4 keeps API compatibility while substantially improving performance. Measured against v4.3.13, bulk data loading with conditional formatting is ~11,700× faster, sorting is ~10× faster, and SetRangeData is ~3× faster.","blog/en/reogrid-v4-4-release",[606,607,608,609,610],"reogrid","spreadsheet",".net","performance","release","/images/articles/reogrid-snapshots.png","ve2Gp7C9238Ll-5TO6cXfPLIb1wkGvouHHQHDstT0OM",1777560483839]