[{"data":1,"prerenderedAt":605},["ShallowReactive",2],{"blog-ja-reogrid-v4-4-release":3},{"id":4,"title":5,"author":6,"body":7,"date":589,"description":590,"extension":591,"meta":592,"navigation":245,"path":593,"seo":594,"stem":596,"tags":597,"thumbnail":603,"__hash__":604},"blog/blog/reogrid-v4-4-release.md","ReoGrid 4.4 リリースのご案内 — 大規模データ処理の性能改善",null,{"type":8,"value":9,"toc":571},"minimark",[10,14,25,37,44,47,50,76,79,81,84,150,152,155,160,166,199,270,276,280,285,315,324,329,333,342,372,392,397,399,402,405,445,447,451,454,457,471,474,477,497,499,502,505,514,517,528,530,533,540,543,546,548,551,567],[11,12,13],"h2",{"id":13},"はじめに",[15,16,17,24],"p",{},[18,19,23],"a",{"href":20,"rel":21},"https://github.com/unvell/ReoGrid",[22],"nofollow","ReoGrid"," は、WinForms および WPF アプリケーションに Excel ライクなスプレッドシート機能を組み込める .NET コンポーネントです。",[15,26,27,28,32,33,36],{},"このたびリリースいたしました ",[29,30,31],"strong",{},"ReoGrid 4.4"," は、API の互換性を維持したまま、",[29,34,35],{},"処理性能を大幅に改善","したバージョンです。お客様より多くお寄せいただいておりました「大量データ処理時の応答性」「ソート処理の所要時間」に関するご要望に対応し、4.3 系で時間を要していた処理を大きく高速化いたしました。",[15,38,39,40,43],{},"本記事では、4.4 における主な改善点を、",[29,41,42],{},"v4.3.13 と v4.4.0 を同一環境で計測した実測値","とともにご紹介いたします。",[45,46],"hr",{},[11,48,49],{"id":49},"主な改善点",[51,52,53,60,66],"ul",{},[54,55,56,59],"li",{},[29,57,58],{},"条件付き書式を伴う大量データ投入",": 約 11,700 倍（70 秒 → 6 ミリ秒）",[54,61,62,65],{},[29,63,64],{},"1 万行のソート処理",": 約 10 倍高速化",[54,67,68,75],{},[29,69,70,74],{},[71,72,73],"code",{},"SetRangeData"," による 20 万セルの一括ロード",": 約 3 倍高速化",[15,77,78],{},"バージョンを 4.3.13 から 4.4.0 へアップグレードしていただくのみで、既存コードの変更は不要です。",[45,80],{},[11,82,83],{"id":83},"計測環境",[85,86,87,100],"table",{},[88,89,90],"thead",{},[91,92,93,97],"tr",{},[94,95,96],"th",{},"項目",[94,98,99],{},"内容",[101,102,103,112,120,128,142],"tbody",{},[91,104,105,109],{},[106,107,108],"td",{},"CPU",[106,110,111],{},"AMD Ryzen 9 9900X (12 コア / 24 スレッド)",[91,113,114,117],{},[106,115,116],{},"OS",[106,118,119],{},"Windows 11 Pro",[91,121,122,125],{},[106,123,124],{},"Runtime",[106,126,127],{},".NET 8.0 (x64, Release ビルド)",[91,129,130,133],{},[106,131,132],{},"比較対象",[106,134,135,138,139],{},[71,136,137],{},"v4.3.13"," ↔ ",[71,140,141],{},"v4.4.0",[91,143,144,147],{},[106,145,146],{},"測定方法",[106,148,149],{},"各シナリオ warmup 1 回 + 計測 3 回、min / median を採用",[45,151],{},[11,153,154],{"id":154},"性能改善の詳細",[156,157,159],"h3",{"id":158},"_1-条件付き書式と大量データ投入約-11700-倍の高速化","1. 条件付き書式と大量データ投入：約 11,700 倍の高速化",[15,161,162,165],{},[29,163,164],{},"シナリオ",": A1:A5000 に「値が 100 を超えた場合に文字色を赤にする」条件付き書式を 1 件設定し、5000 セルに値を順次書き込む処理。",[85,167,168,179],{},[88,169,170],{},[91,171,172,175],{},[94,173,174],{},"バージョン",[94,176,178],{"align":177},"right","所要時間",[101,180,181,188],{},[91,182,183,185],{},[106,184,137],{},[106,186,187],{"align":177},"70,175 ms（約 70 秒）",[91,189,190,194],{},[106,191,192],{},[29,193,141],{},[106,195,196],{"align":177},[29,197,198],{},"6 ms",[200,201,206],"pre",{"className":202,"code":203,"language":204,"meta":205,"style":205},"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","",[71,207,208,216,222,228,234,240,247,253,258,264],{"__ignoreMap":205},[209,210,213],"span",{"class":211,"line":212},"line",1,[209,214,215],{},"sheet.ConditionalStyles.Add(new Rule(\"THIS > 100\", \"A1:A5000\", new WorksheetRangeStyle\n",[209,217,219],{"class":211,"line":218},2,[209,220,221],{},"{\n",[209,223,225],{"class":211,"line":224},3,[209,226,227],{},"    Flag = PlainStyleFlag.TextColor,\n",[209,229,231],{"class":211,"line":230},4,[209,232,233],{},"    TextColor = SolidColor.Red,\n",[209,235,237],{"class":211,"line":236},5,[209,238,239],{},"}));\n",[209,241,243],{"class":211,"line":242},6,[209,244,246],{"emptyLinePlaceholder":245},true,"\n",[209,248,250],{"class":211,"line":249},7,[209,251,252],{},"for (int r = 0; r \u003C 5000; r++)\n",[209,254,256],{"class":211,"line":255},8,[209,257,221],{},[209,259,261],{"class":211,"line":260},9,[209,262,263],{},"    sheet[r, 0] = r;\n",[209,265,267],{"class":211,"line":266},10,[209,268,269],{},"}\n",[15,271,272,275],{},[29,273,274],{},"業務上の効果",": 条件付き書式を設定済みの帳票テンプレートに対し、外部システムから取得したデータを流し込むような処理が、滞りなく実行できるようになります。",[156,277,279],{"id":278},"_2-1-万行のソート約-10-倍の高速化","2. 1 万行のソート：約 10 倍の高速化",[15,281,282,284],{},[29,283,164],{},": 1 万行 × 5 列のランダム整数を A 列で昇順ソート。",[85,286,287,295],{},[88,288,289],{},[91,290,291,293],{},[94,292,174],{},[94,294,178],{"align":177},[101,296,297,304],{},[91,298,299,301],{},[106,300,137],{},[106,302,303],{"align":177},"397 ms",[91,305,306,310],{},[106,307,308],{},[29,309,141],{},[106,311,312],{"align":177},[29,313,314],{},"39 ms",[200,316,318],{"className":202,"code":317,"language":204,"meta":205,"style":205},"sheet.SortColumn(0, new RangePosition(0, 0, 10000, 5), SortOrder.Ascending);\n",[71,319,320],{"__ignoreMap":205},[209,321,322],{"class":211,"line":212},[209,323,317],{},[15,325,326,328],{},[29,327,274],{},": Excel と同等の操作感で、画面上のグリッドに対する大規模データの並べ替えを行うことができます。",[156,330,332],{"id":331},"_3-setrangedata-による一括ロード約-3-倍の高速化","3. SetRangeData による一括ロード：約 3 倍の高速化",[15,334,335,337,338,341],{},[29,336,164],{},": 10,000 行 × 20 列（合計 20 万セル）の 2 次元配列を ",[71,339,340],{},"SetRangeData()"," にて一括投入。",[85,343,344,352],{},[88,345,346],{},[91,347,348,350],{},[94,349,174],{},[94,351,178],{"align":177},[101,353,354,361],{},[91,355,356,358],{},[106,357,137],{},[106,359,360],{"align":177},"326 ms",[91,362,363,367],{},[106,364,365],{},[29,366,141],{},[106,368,369],{"align":177},[29,370,371],{},"104 ms",[200,373,375],{"className":202,"code":374,"language":204,"meta":205,"style":205},"var data = new object[10000, 20];\n// ... データを設定 ...\nsheet.SetRangeData(new RangePosition(0, 0, 10000, 20), data);\n",[71,376,377,382,387],{"__ignoreMap":205},[209,378,379],{"class":211,"line":212},[209,380,381],{},"var data = new object[10000, 20];\n",[209,383,384],{"class":211,"line":218},[209,385,386],{},"// ... データを設定 ...\n",[209,388,389],{"class":211,"line":224},[209,390,391],{},"sheet.SetRangeData(new RangePosition(0, 0, 10000, 20), data);\n",[15,393,394,396],{},[29,395,274],{},": データベースや CSV から取得したレコードをグリッドへ反映する初期ロード処理の所要時間が短縮されます。",[45,398],{},[11,400,401],{"id":401},"バグ修正",[15,403,404],{},"主なバグ修正は以下のとおりです。",[51,406,407,417,429,435],{},[54,408,409,412,413,416],{},[29,410,411],{},"数式パーサ",": 単項プラス演算子に対応（例: ",[71,414,415],{},"=+D25-F8-F14","）",[54,418,419,421,422,425,426,416],{},[29,420,411],{},": クォート付きシート名参照に対応（例: ",[71,423,424],{},"'BS（円）'!B3","、",[71,427,428],{},"'My Sheet'!A1",[54,430,431,434],{},[29,432,433],{},"ソート",": 数式セルがソート時に元の位置に残る問題を修正。Excel と同様に、数式は行とともに移動するようになりました",[54,436,437,440,441,444],{},[29,438,439],{},"条件付き書式",": ",[71,442,443],{},"ClearConditionalStyles"," におけるルール解除順序の不具合を修正",[45,446],{},[11,448,450],{"id":449},"api-の変更点","API の変更点",[15,452,453],{},"互換性への影響は最小限ですが、以下の API が変更されております。",[156,455,456],{"id":456},"削除",[51,458,459,465],{},[54,460,461,464],{},[71,462,463],{},"Worksheet.ConditionalStyleApplyCells"," プロパティ",[54,466,467,470],{},[71,468,469],{},"ConditionalStyleApplyCellCollection"," クラス",[15,472,473],{},"代替として、以下のメソッドをご利用ください。",[156,475,476],{"id":476},"追加",[200,478,480],{"className":202,"code":479,"language":204,"meta":205,"style":205},"bool hasStyle = worksheet.HasConditionalStyle(row, col);\nbool hasStyle = worksheet.HasConditionalStyle(new CellPosition(\"A1\"));\nbool hasStyle = cell.HasConditionalStyles;\n",[71,481,482,487,492],{"__ignoreMap":205},[209,483,484],{"class":211,"line":212},[209,485,486],{},"bool hasStyle = worksheet.HasConditionalStyle(row, col);\n",[209,488,489],{"class":211,"line":218},[209,490,491],{},"bool hasStyle = worksheet.HasConditionalStyle(new CellPosition(\"A1\"));\n",[209,493,494],{"class":211,"line":224},[209,495,496],{},"bool hasStyle = cell.HasConditionalStyles;\n",[45,498],{},[11,500,501],{"id":501},"アップグレード方法",[15,503,504],{},"ReoGrid V4 以降は有償版でのご提供となっております。最新版のアセンブリは、弊社ポータルサイトにログインのうえダウンロードいただけます。",[51,506,507],{},[54,508,509,510],{},"ポータルサイト: ",[18,511,512],{"href":512,"rel":513},"https://portal.unvell.com/",[22],[15,515,516],{},"既存プロジェクトにおきましては、ダウンロードしたアセンブリへの参照を差し替えていただくのみでアップグレードが完了し、コードの変更は不要です。",[15,518,519,520,523,524,527],{},"なお、",[71,521,522],{},"ConditionalStyleApplyCells"," を直接ご参照されていた場合のみ、上記 ",[71,525,526],{},"HasConditionalStyle()"," への置き換えをお願いいたします。",[45,529],{},[11,531,532],{"id":532},"おわりに",[15,534,535,536,539],{},"ReoGrid 4.4 は、新機能の追加よりも、",[29,537,538],{},"既存ユーザーの皆様にとって影響の大きい性能課題の解消"," に注力したリリースでございます。",[15,541,542],{},"ご紹介いたしました数値は、すべて同一環境・同一コードで v4.3.13 と v4.4.0 を比較した実測値です。",[15,544,545],{},"これまで処理時間の長さからご利用を見送られていたケースがございましたら、ぜひ 4.4 にてお試しいただけますと幸いです。",[45,547],{},[11,549,550],{"id":550},"関連リンク",[51,552,553,560],{},[54,554,555],{},[18,556,559],{"href":557,"rel":558},"https://reogrid.net/jp",[22],"ReoGrid 公式サイト",[54,561,562],{},[18,563,566],{"href":564,"rel":565},"https://reogrid.net/jp/release-notes",[22],"ReoGrid リリースノート",[568,569,570],"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":205,"searchDepth":218,"depth":218,"links":572},[573,574,575,576,581,582,586,587,588],{"id":13,"depth":218,"text":13},{"id":49,"depth":218,"text":49},{"id":83,"depth":218,"text":83},{"id":154,"depth":218,"text":154,"children":577},[578,579,580],{"id":158,"depth":224,"text":159},{"id":278,"depth":224,"text":279},{"id":331,"depth":224,"text":332},{"id":401,"depth":218,"text":401},{"id":449,"depth":218,"text":450,"children":583},[584,585],{"id":456,"depth":224,"text":456},{"id":476,"depth":224,"text":476},{"id":501,"depth":218,"text":501},{"id":532,"depth":218,"text":532},{"id":550,"depth":218,"text":550},"2026-04-30","ReoGrid 4.4 では API の互換性を維持したまま、条件付き書式を伴う大量データ投入を約 11,700 倍、1 万行のソートを約 10 倍、SetRangeData による 20 万セルの一括ロードを約 3 倍に高速化しました。","md",{},"/blog/reogrid-v4-4-release",{"title":5,"description":595},"ReoGrid 4.4 は API 互換性を保ちつつ性能を大幅改善。条件付き書式を伴う大量データ投入で約 11,700 倍、ソートで約 10 倍、SetRangeData で約 3 倍の高速化を v4.3.13 との実測比較で確認しています。","blog/reogrid-v4-4-release",[598,599,600,601,602],"reogrid","spreadsheet",".net","performance","release","/images/articles/reogrid-snapshots.png","PjLEqPKK8B_vbPSn2hE-az8D1p99QuJvz5_1vmKE8Tg",1777560482862]