[{"data":1,"prerenderedAt":1698},["ShallowReactive",2],{"top-blog-preview-en":3},[4,701,1127],{"id":5,"title":6,"author":7,"body":8,"date":685,"description":686,"extension":687,"meta":688,"navigation":423,"path":689,"seo":690,"stem":692,"tags":693,"thumbnail":699,"__hash__":700},"blog_en/blog/en/reogrid-web-1-2-1-release.md","ReoGrid Web 1.2.1 Released — Major Formula and Editing Enhancements",null,{"type":9,"value":10,"toc":673},"minimark",[11,20,25,32,70,73,76,80,83,88,99,281,292,296,318,322,325,362,365,369,386,577,581,592,596,614,616,620,623,641,644,669],[12,13,14,15,19],"p",{},"UNVELL Inc. has released ",[16,17,18],"strong",{},"ReoGrid Web 1.2.1",", the latest version of our Excel-like spreadsheet library for web applications. The 1.2.x series, built up since the official launch in March, has pushed the formula and editing experience to a level that genuinely feels like Excel. There are no breaking changes to the public API.",[21,22,24],"h2",{"id":23},"_121-highlights","1.2.1 highlights",[12,26,27,28,31],{},"1.2.1 extends the ",[16,29,30],{},"drag interaction on the formula reference highlights"," that appear on the grid while editing a formula.",[33,34,35,42,48,56],"ul",{},[36,37,38,41],"li",{},[16,39,40],{},"Drag the dashed border to move a range",": dragging the dashed edge of a reference rectangle translates the entire range.",[36,43,44,47],{},[16,45,46],{},"Drag a corner grip to resize",": dragging one of the four corner grips resizes the range. Resize uses cell-center boundaries — a cell only joins or leaves the range once the pointer passes its midpoint — matching Excel and our .NET edition.",[36,49,50,51,55],{},"When the same reference appears multiple times in the formula text, every occurrence is rewritten in step, preserving each token's absolute-reference (",[52,53,54],"code",{},"$",") flags.",[36,57,58,59,62,63,62,66,69],{},"Small colored corner squares are drawn on each highlight to make the resize hot-zone discoverable, with hover cursors (",[52,60,61],{},"move",", ",[52,64,65],{},"nwse-resize",[52,67,68],{},"nesw-resize",") on the border and corners.",[12,71,72],{},"The result: you can adjust a formula's reference ranges intuitively, entirely with the mouse.",[74,75],"hr",{},[21,77,79],{"id":78},"what-the-12x-series-added","What the 1.2.x series added",[12,81,82],{},"Leading up to 1.2.1, the 1.2.x series shipped these headline features.",[84,85,87],"h3",{"id":86},"formula-library-expanded-to-109-functions","Formula library expanded to 109 functions",[12,89,90,91,94,95,98],{},"ReoGrid Web now supports ",[16,92,93],{},"109 Excel-compatible built-in functions"," spanning lookup/reference, multi-criteria aggregation, dates, math/trig, statistics, text, and reference categories. Formulas inside imported ",[52,96,97],{},".xlsx"," files work out of the box.",[100,101,102,115],"table",{},[103,104,105],"thead",{},[106,107,108,112],"tr",{},[109,110,111],"th",{},"Category",[109,113,114],{},"Examples",[116,117,118,144,163,197,231,259],"tbody",{},[106,119,120,124],{},[121,122,123],"td",{},"Lookup / reference",[121,125,126,62,129,62,132,62,135,62,138,62,141],{},[52,127,128],{},"VLOOKUP",[52,130,131],{},"HLOOKUP",[52,133,134],{},"INDEX",[52,136,137],{},"MATCH",[52,139,140],{},"XLOOKUP",[52,142,143],{},"XMATCH",[106,145,146,149],{},[121,147,148],{},"Multi-criteria aggregation",[121,150,151,62,154,62,157,62,160],{},[52,152,153],{},"SUMIFS",[52,155,156],{},"COUNTIFS",[52,158,159],{},"AVERAGEIFS",[52,161,162],{},"SUMPRODUCT",[106,164,165,168],{},[121,166,167],{},"Date",[121,169,170,62,173,62,176,62,179,62,182,62,185,62,188,62,191,62,194],{},[52,171,172],{},"TODAY",[52,174,175],{},"NOW",[52,177,178],{},"YEAR",[52,180,181],{},"MONTH",[52,183,184],{},"DAY",[52,186,187],{},"WEEKDAY",[52,189,190],{},"EDATE",[52,192,193],{},"EOMONTH",[52,195,196],{},"DATEDIF",[106,198,199,202],{},[121,200,201],{},"Math / trig",[121,203,204,62,207,62,210,62,213,62,216,62,219,62,222,62,225,62,228],{},[52,205,206],{},"EXP",[52,208,209],{},"LN",[52,211,212],{},"LOG",[52,214,215],{},"SIN",[52,217,218],{},"COS",[52,220,221],{},"TAN",[52,223,224],{},"ATAN2",[52,226,227],{},"RAND",[52,229,230],{},"RANDBETWEEN",[106,232,233,236],{},[121,234,235],{},"Statistics",[121,237,238,62,241,62,244,62,247,62,250,62,253,62,256],{},[52,239,240],{},"MEDIAN",[52,242,243],{},"LARGE",[52,245,246],{},"SMALL",[52,248,249],{},"RANK",[52,251,252],{},"CEILING",[52,254,255],{},"FLOOR",[52,257,258],{},"MROUND",[106,260,261,264],{},[121,262,263],{},"Text",[121,265,266,62,269,62,272,62,275,62,278],{},[52,267,268],{},"SEARCH",[52,270,271],{},"EXACT",[52,273,274],{},"PROPER",[52,276,277],{},"CHAR",[52,279,280],{},"CODE",[12,282,283,284,287,288,291],{},"Argument order and the gotchas follow Excel. For example, Excel's ",[52,285,286],{},"ATAN2(x, y)"," reverses the argument order of JavaScript's ",[52,289,290],{},"Math.atan2(y, x)"," — the library follows Excel.",[84,293,295],{"id":294},"excel-like-formula-reference-editing","Excel-like formula reference editing",[12,297,298,299,302,303,62,306,309,310,313,314,317],{},"When you edit a formula starting with ",[52,300,301],{},"=",", every reference you enter (",[52,304,305],{},"A1",[52,307,308],{},"B2:D10",", etc.) is ",[16,311,312],{},"color-coded inline"," from a shared 8-color palette, and the grid draws a matching ",[16,315,316],{},"dashed rectangle"," around each referenced range. Clicking another cell inserts its address at the caret; drag extends it into a range. When a reference overlaps a merged region, the highlight expands to enclose the full merged area.",[84,319,321],{"id":320},"autofill-fill-handle","Autofill (fill handle)",[12,323,324],{},"A small square at the bottom-right of the selection lets you drag to extend values up, down, left, or right.",[33,326,327,333,347,353],{},[36,328,329,332],{},[16,330,331],{},"Single cell",": tile-copies the value.",[36,334,335,338,339,342,343,346],{},[16,336,337],{},"Two or more numeric cells",": extrapolates as an arithmetic progression (",[52,340,341],{},"1, 2"," → ",[52,344,345],{},"3, 4, 5",").",[36,348,349,352],{},[16,350,351],{},"Date-formatted cell",": increments by one day per step.",[36,354,355,358,359,361],{},[16,356,357],{},"Formula cells",": shift relative references like Excel; absolute ",[52,360,54],{}," references are preserved.",[12,363,364],{},"Styles, number formats, and cell types propagate to the new region, with full undo/redo support.",[84,366,368],{"id":367},"idiomatic-react-vue-event-props","Idiomatic React / Vue event props",[12,370,371,372,62,375,62,378,381,382,385],{},"Worksheet events are now exposed as React props and Vue emits. You can wire up ",[52,373,374],{},"onSelectionChange",[52,376,377],{},"onCellValueChange",[52,379,380],{},"onScrollChange",", and more declaratively, with no imperative ",[52,383,384],{},"worksheet.on*()"," calls.",[387,388,393],"pre",{"className":389,"code":390,"language":391,"meta":392,"style":392},"language-tsx shiki shiki-themes github-light github-dark","import { Reogrid } from '@reogrid/pro/react';\n\n\u003CReogrid\n  onReady={({ worksheet }) => worksheet.cell('A1').setValue('Hello')}\n  onSelectionChange={(range) => console.log('selected', range)}\n  onCellValueChange={({ row, column, newValue }) => save(row, column, newValue)}\n  style={{ width: '100%', height: 500 }}\n/>\n","tsx","",[52,394,395,418,425,435,482,515,548,571],{"__ignoreMap":392},[396,397,400,404,408,411,415],"span",{"class":398,"line":399},"line",1,[396,401,403],{"class":402},"szBVR","import",[396,405,407],{"class":406},"sVt8B"," { Reogrid } ",[396,409,410],{"class":402},"from",[396,412,414],{"class":413},"sZZnC"," '@reogrid/pro/react'",[396,416,417],{"class":406},";\n",[396,419,421],{"class":398,"line":420},2,[396,422,424],{"emptyLinePlaceholder":423},true,"\n",[396,426,428,431],{"class":398,"line":427},3,[396,429,430],{"class":406},"\u003C",[396,432,434],{"class":433},"sj4cs","Reogrid\n",[396,436,438,442,444,447,451,454,457,460,463,466,469,471,474,476,479],{"class":398,"line":437},4,[396,439,441],{"class":440},"sScJk","  onReady",[396,443,301],{"class":402},[396,445,446],{"class":406},"{({ ",[396,448,450],{"class":449},"s4XuR","worksheet",[396,452,453],{"class":406}," }) ",[396,455,456],{"class":402},"=>",[396,458,459],{"class":406}," worksheet.",[396,461,462],{"class":440},"cell",[396,464,465],{"class":406},"(",[396,467,468],{"class":413},"'A1'",[396,470,346],{"class":406},[396,472,473],{"class":440},"setValue",[396,475,465],{"class":406},[396,477,478],{"class":413},"'Hello'",[396,480,481],{"class":406},")}\n",[396,483,485,488,490,493,496,499,501,504,507,509,512],{"class":398,"line":484},5,[396,486,487],{"class":440},"  onSelectionChange",[396,489,301],{"class":402},[396,491,492],{"class":406},"{(",[396,494,495],{"class":449},"range",[396,497,498],{"class":406},") ",[396,500,456],{"class":402},[396,502,503],{"class":406}," console.",[396,505,506],{"class":440},"log",[396,508,465],{"class":406},[396,510,511],{"class":413},"'selected'",[396,513,514],{"class":406},", range)}\n",[396,516,518,521,523,525,528,530,533,535,538,540,542,545],{"class":398,"line":517},6,[396,519,520],{"class":440},"  onCellValueChange",[396,522,301],{"class":402},[396,524,446],{"class":406},[396,526,527],{"class":449},"row",[396,529,62],{"class":406},[396,531,532],{"class":449},"column",[396,534,62],{"class":406},[396,536,537],{"class":449},"newValue",[396,539,453],{"class":406},[396,541,456],{"class":402},[396,543,544],{"class":440}," save",[396,546,547],{"class":406},"(row, column, newValue)}\n",[396,549,551,554,556,559,562,565,568],{"class":398,"line":550},7,[396,552,553],{"class":440},"  style",[396,555,301],{"class":402},[396,557,558],{"class":406},"{{ width: ",[396,560,561],{"class":413},"'100%'",[396,563,564],{"class":406},", height: ",[396,566,567],{"class":433},"500",[396,569,570],{"class":406}," }}\n",[396,572,574],{"class":398,"line":573},8,[396,575,576],{"class":406},"/>\n",[84,578,580],{"id":579},"per-side-border-overrides-in-conditional-formatting","Per-side border overrides in conditional formatting",[12,582,583,584,587,588,591],{},"Conditional format rules can now carry a ",[52,585,586],{},"border"," payload that overrides cell borders per side (right / top / bottom / left) on matching cells. These round-trip through xlsx ",[52,589,590],{},"\u003Cdxf>\u003Cborder>",", so formatting survives an Excel load-and-save.",[84,593,595],{"id":594},"faster-rendering-engine-70-fewer-canvas-calls","Faster rendering engine (~70% fewer Canvas calls)",[12,597,598,599,62,602,605,606,609,610,613],{},"The Canvas render path now caches ",[52,600,601],{},"ctx.font",[52,603,604],{},"ctx.fillStyle",", and ",[52,607,608],{},"measureText",", plus wrapped/multi-line text layout, on a per-frame basis — cutting Canvas API calls during scroll by ",[16,611,612],{},"roughly 70%+ per frame"," on text-heavy sheets. Frame rates stay stable even on dense sheets.",[74,615],{},[21,617,619],{"id":618},"getting-started","Getting started",[12,621,622],{},"The Lite edition requires no license key and is available on npm.",[387,624,628],{"className":625,"code":626,"language":627,"meta":392,"style":392},"language-bash shiki shiki-themes github-light github-dark","npm install @reogrid/lite\n","bash",[52,629,630],{"__ignoreMap":392},[396,631,632,635,638],{"class":398,"line":399},[396,633,634],{"class":440},"npm",[396,636,637],{"class":413}," install",[396,639,640],{"class":413}," @reogrid/lite\n",[12,642,643],{},"The Pro edition adds the 109-function formula library, xlsx export, the full set of cell types, and more.",[33,645,646,655,662],{},[36,647,648],{},[649,650,654],"a",{"href":651,"rel":652},"https://web.reogrid.net",[653],"nofollow","Product site",[36,656,657],{},[649,658,661],{"href":659,"rel":660},"https://web.reogrid.net/demos",[653],"Live demo gallery",[36,663,664],{},[649,665,668],{"href":666,"rel":667},"https://www.npmjs.com/package/@reogrid/lite",[653],"npm package (@reogrid/lite)",[670,671,672],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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":392,"searchDepth":420,"depth":420,"links":674},[675,676,684],{"id":23,"depth":420,"text":24},{"id":78,"depth":420,"text":79,"children":677},[678,679,680,681,682,683],{"id":86,"depth":427,"text":87},{"id":294,"depth":427,"text":295},{"id":320,"depth":427,"text":321},{"id":367,"depth":427,"text":368},{"id":579,"depth":427,"text":580},{"id":594,"depth":427,"text":595},{"id":618,"depth":420,"text":619},"2026-05-15","ReoGrid Web 1.2.1 is here. The 1.2.x series brings 109 built-in formula functions, Excel-like color-coded formula reference editing, autofill, drag-to-move and drag-to-resize on reference ranges, idiomatic React/Vue event props, and a faster rendering engine — all with no breaking API changes.","md",{},"/blog/en/reogrid-web-1-2-1-release",{"title":6,"description":691},"ReoGrid Web 1.2.x substantially improves the editing experience — 109 built-in functions, color-coded formula reference editing, drag-to-move/resize references, autofill, React/Vue event props, and ~70% fewer Canvas calls per frame — while preserving API compatibility.","blog/en/reogrid-web-1-2-1-release",[694,695,696,697,698],"reogrid","reogrid-web","spreadsheet","release","javascript","/images/articles/reogrid-web-release.png","56ROzjJ2mFvc4OegE9rqjBfsdIrmDavAyCAW6TqMF1E",{"id":702,"title":703,"author":7,"body":704,"date":1115,"description":1116,"extension":687,"meta":1117,"navigation":423,"path":1118,"seo":1119,"stem":1121,"tags":1122,"thumbnail":727,"__hash__":1126},"blog_en/blog/en/reogrid-studio-release.md","ReoGrid Studio Released — Build Online Spreadsheets in Natural Language, with MCP for AI Agents",{"type":9,"value":705,"toc":1103},[706,722,728,732,739,746,748,752,756,763,772,779,783,786,797,816,824,827,829,833,847,929,936,938,942,945,955,958,960,964,972,1006,1009,1016,1019,1021,1025,1053,1056,1075,1077,1081,1084,1100],[12,707,14,708,711,712,717,718,721],{},[16,709,710],{},"ReoGrid Studio"," (",[649,713,716],{"href":714,"rel":715},"https://studio.reogrid.net",[653],"studio.reogrid.net","), a browser-hosted online spreadsheet. You can author and edit sheets in plain language — and, most importantly, ",[16,719,720],{},"AI agents can publish their analyzed data as real, navigable spreadsheets"," through a public MCP endpoint.",[12,723,724],{},[725,726],"img",{"alt":710,"src":727},"/images/articles/reogrid-studio-release.jpg",[21,729,731],{"id":730},"why-this-exists","Why this exists",[12,733,734,735,738],{},"Most AI tools today output text. Even after analyzing a spreadsheet — sorting rows, computing totals, building a forecast — the result lands in chat as a ",[16,736,737],{},"markdown table",". You have to manually paste it into a real spreadsheet to act on it.",[12,740,741,742,745],{},"ReoGrid Studio closes that gap. The AI builds a spreadsheet, receives a short URL, and hands it back. The recipient opens the URL and sees a ",[16,743,744],{},"live, navigable spreadsheet"," — selectable, filterable, copyable, shareable.",[74,747],{},[21,749,751],{"id":750},"two-roles","Two roles",[84,753,755],{"id":754},"_1-natural-language-authoring","1. Natural-language authoring",[12,757,758,759,762],{},"Open ",[649,760,716],{"href":714,"rel":761},[653],", type what you want, and a spreadsheet renders live:",[764,765,766],"blockquote",{},[12,767,768],{},[769,770,771],"em",{},"\"Make me a Q1 sales summary with three regions, monthly totals, and a SUM column.\"",[12,773,774,775,778],{},"The grid updates in real time, and you can iterate via chat. Hit ",[16,776,777],{},"Publish"," to mint a short URL you can share. This is the on-ramp.",[84,780,782],{"id":781},"_2-ai-visualization-endpoint","2. AI visualization endpoint",[12,784,785],{},"The heart of Studio. Any AI that has analyzed data can publish it as a real spreadsheet and hand the user the URL.",[12,787,788,789,792,793,796],{},"This is plumbed through ",[16,790,791],{},"MCP (Model Context Protocol)",". An AI client — Claude Code, Claude Desktop, Cursor, or any application built on the Anthropic API — connects to ",[52,794,795],{},"https://api-studio.reogrid.net/studio/mcp"," and can:",[798,799,800,803,810,813],"ol",{},[36,801,802],{},"Read the spreadsheet schema (cells, styles, formulas, filters, frozen panes, etc.)",[36,804,805,806,809],{},"Build a ",[52,807,808],{},"ReoGridJsonDocument"," from analyzed data",[36,811,812],{},"Publish it — and receive a public URL",[36,814,815],{},"Hand the URL to the user",[387,817,822],{"className":818,"code":820,"language":821},[819],"language-text","your app  ──► AI analysis  ──► publish_sheet(doc)  ──► { url }\n                                                        │\n                                                        ▼\n                          user opens https://studio.reogrid.net/{shortId}\n","text",[52,823,820],{"__ignoreMap":392},[12,825,826],{},"The AI does the analysis, calls the MCP, gets back a URL, and the URL becomes part of its reply. The user clicks. That is the whole interaction — no SDK to integrate, no infrastructure to host, no data-export pipeline.",[74,828],{},[21,830,832],{"id":831},"what-works-today","What works today",[12,834,835,836,838,839,846],{},"The wire format is the canonical ",[52,837,808],{}," from ",[649,840,843],{"href":841,"rel":842},"https://www.npmjs.com/package/@reogrid/pro",[653],[52,844,845],{},"@reogrid/pro"," — the same JSON that powers ReoGrid Web in the browser. Features Studio supports on day one:",[100,848,849,857],{},[103,850,851],{},[106,852,853,855],{},[109,854,111],{},[109,856,114],{},[116,858,859,869,879,889,899,909,919],{},[106,860,861,866],{},[121,862,863],{},[16,864,865],{},"Core",[121,867,868],{},"Cell values, Excel-style formulas, shared styles, merges, borders",[106,870,871,876],{},[121,872,873],{},[16,874,875],{},"Layout",[121,877,878],{},"Frozen rows/columns, custom row heights / column widths, banded rows",[106,880,881,886],{},[121,882,883],{},[16,884,885],{},"Numbers",[121,887,888],{},"Custom number formats (currency, date, percentage, scientific)",[106,890,891,896],{},[121,892,893],{},[16,894,895],{},"Interaction",[121,897,898],{},"Auto-filter on a header range, sort, autofill, range copy/paste",[106,900,901,906],{},[121,902,903],{},[16,904,905],{},"Cell types",[121,907,908],{},"Checkbox, dropdown, rating (★), progress bar, sparkline, hyperlink, button",[106,910,911,916],{},[121,912,913],{},[16,914,915],{},"Conditional",[121,917,918],{},"Color scales, data bars, value-based highlighting, top-N",[106,920,921,926],{},[121,922,923],{},[16,924,925],{},"Rich",[121,927,928],{},"Rich-text runs (mixed bold/italic/color within a cell), outline grouping",[12,930,931,932,935],{},"The public viewer is ",[16,933,934],{},"interactive read-only"," — viewers can select, scroll, copy, sort, filter, and click widgets, but cannot mutate the published data. This is the right shape for a \"shared link\" view: the recipient can explore freely, take what they need, and trust that what they're seeing is the published snapshot.",[74,937],{},[21,939,941],{"id":940},"free-no-login-rate-limited","Free, no login, rate-limited",[12,943,944],{},"ReoGrid Studio is completely free today. No login, no API key, no quota negotiation.",[12,946,947,948,951,952,346],{},"The only gate is a per-IP rate limit of ",[16,949,950],{},"30 publishes per hour",", which keeps the anonymous surface honest. Published sheets persist indefinitely; the short URLs are 14-character flickr-base58 (e.g. ",[52,953,954],{},"9mkzWpAibo4K34",[12,956,957],{},"A commercial plan with higher quotas and team features is on the roadmap, but concrete pricing and packaging are deliberately Phase 2 work — the bar to entry stays at zero while AI tooling integration scales up.",[74,959],{},[21,961,963],{"id":962},"using-it-from-claude-code","Using it from Claude Code",[12,965,966,971],{},[649,967,970],{"href":968,"rel":969},"https://claude.com/claude-code",[653],"Claude Code"," supports remote MCP servers out of the box. Add the Studio MCP with one command:",[387,973,975],{"className":625,"code":974,"language":627,"meta":392,"style":392},"claude mcp add --transport http --scope user reogrid-studio https://api-studio.reogrid.net/studio/mcp\n",[52,976,977],{"__ignoreMap":392},[396,978,979,982,985,988,991,994,997,1000,1003],{"class":398,"line":399},[396,980,981],{"class":440},"claude",[396,983,984],{"class":413}," mcp",[396,986,987],{"class":413}," add",[396,989,990],{"class":433}," --transport",[396,992,993],{"class":413}," http",[396,995,996],{"class":433}," --scope",[396,998,999],{"class":413}," user",[396,1001,1002],{"class":413}," reogrid-studio",[396,1004,1005],{"class":413}," https://api-studio.reogrid.net/studio/mcp\n",[12,1007,1008],{},"Then open Claude Code in any project and ask:",[764,1010,1011],{},[12,1012,1013],{},[769,1014,1015],{},"\"I have Q1 sales numbers: Tokyo 1200/1450/1600, Osaka 900/1100/1250, Nagoya 700/850/950 across Jan/Feb/Mar. Make a clean spreadsheet with monthly totals and a Q1 total column. Publish it via reogrid-studio.\"",[12,1017,1018],{},"Claude Code uses the Studio tools autonomously and ends its reply with the public URL. Click it, and you have your spreadsheet. See our setup guide for Claude Desktop, Cursor, and the Anthropic API.",[74,1020],{},[21,1022,1024],{"id":1023},"try-it-now","Try it now",[33,1026,1027,1037,1043],{},[36,1028,1029,1032,1033,1036],{},[16,1030,1031],{},"In your browser",": open ",[649,1034,716],{"href":714,"rel":1035},[653]," and describe what you want.",[36,1038,1039,1042],{},[16,1040,1041],{},"From your AI client",": add the MCP config above and ask it to \"make a spreadsheet from this data.\"",[36,1044,1045,1048,1049,1052],{},[16,1046,1047],{},"From your application",": ",[52,1050,1051],{},"POST https://api-studio.reogrid.net/studio/mcp"," (JSON-RPC 2.0).",[12,1054,1055],{},"Anything an AI can analyze, it can now display as a real spreadsheet for you to act on.",[12,1057,1058,1059,1068,1069,1071,1072,1074],{},"ReoGrid Studio is built on top of ",[649,1060,1062,711,1065,1067],{"href":841,"rel":1061},[653],[16,1063,1064],{},"ReoGrid Web",[52,1066,845],{},")",", the browser-native spreadsheet library. The shared ",[52,1070,808],{}," format means a sheet published from Studio can be loaded by any ",[52,1073,845],{}," deployment — and vice versa.",[74,1076],{},[21,1078,1080],{"id":1079},"learn-more","Learn more",[12,1082,1083],{},"More detailed articles are available on the ReoGrid site.",[33,1085,1086,1093],{},[36,1087,1088],{},[649,1089,1092],{"href":1090,"rel":1091},"https://reogrid.net/articles/introducing-reogrid-studio",[653],"Introducing ReoGrid Studio — A Spreadsheet Endpoint for AI Agents",[36,1094,1095],{},[649,1096,1099],{"href":1097,"rel":1098},"https://reogrid.net/articles/use-reogrid-studio-from-claude-code",[653],"Use ReoGrid Studio from Claude Code (and Other MCP Clients)",[670,1101,1102],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":392,"searchDepth":420,"depth":420,"links":1104},[1105,1106,1110,1111,1112,1113,1114],{"id":730,"depth":420,"text":731},{"id":750,"depth":420,"text":751,"children":1107},[1108,1109],{"id":754,"depth":427,"text":755},{"id":781,"depth":427,"text":782},{"id":831,"depth":420,"text":832},{"id":940,"depth":420,"text":941},{"id":962,"depth":420,"text":963},{"id":1023,"depth":420,"text":1024},{"id":1079,"depth":420,"text":1080},"2026-05-12","UNVELL Inc. has released ReoGrid Studio, a browser-hosted online spreadsheet. Create and edit sheets in plain language, and let AI agents publish their analyzed data as live, navigable spreadsheets via a public MCP endpoint.",{},"/blog/en/reogrid-studio-release",{"title":703,"description":1120},"ReoGrid Studio is a browser-hosted spreadsheet at studio.reogrid.net. Author sheets in natural language and share via short URLs. Its public MCP endpoint lets Claude Code and other AI agents publish analyzed data as live spreadsheets. Free, no login.","blog/en/reogrid-studio-release",[694,1123,696,1124,1125,981],"reogrid-studio","ai","mcp","0P_b1suAQ1d6BOs_m0dbDpM7gmbWS9W0F0hImXMmufU",{"id":1128,"title":1129,"author":7,"body":1130,"date":1686,"description":1687,"extension":687,"meta":1688,"navigation":423,"path":1689,"seo":1690,"stem":1692,"tags":1693,"thumbnail":1696,"__hash__":1697},"blog_en/blog/en/reogrid-v4-4-release.md","Announcing ReoGrid 4.4 — Performance Improvements for Large-Scale Data",{"type":9,"value":1131,"toc":1668},[1132,1136,1144,1155,1162,1164,1168,1191,1194,1196,1200,1260,1262,1266,1270,1276,1309,1366,1372,1376,1381,1411,1420,1425,1429,1437,1467,1487,1492,1494,1498,1501,1538,1540,1544,1547,1551,1565,1568,1572,1592,1594,1598,1601,1610,1613,1624,1626,1630,1637,1640,1643,1645,1649,1665],[21,1133,1135],{"id":1134},"introduction","Introduction",[12,1137,1138,1143],{},[649,1139,1142],{"href":1140,"rel":1141},"https://github.com/unvell/ReoGrid",[653],"ReoGrid"," is a .NET component that brings Excel-like spreadsheet functionality to WinForms and WPF applications.",[12,1145,1146,1147,1150,1151,1154],{},"The newly released ",[16,1148,1149],{},"ReoGrid 4.4"," is a version that ",[16,1152,1153],{},"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.",[12,1156,1157,1158,1161],{},"This article introduces the main improvements in 4.4, supported by ",[16,1159,1160],{},"measured results comparing v4.3.13 and v4.4.0 in the same environment",".",[74,1163],{},[21,1165,1167],{"id":1166},"key-improvements","Key Improvements",[33,1169,1170,1176,1182],{},[36,1171,1172,1175],{},[16,1173,1174],{},"Bulk data loading with conditional formatting",": approximately 11,700× faster (70 seconds → 6 milliseconds)",[36,1177,1178,1181],{},[16,1179,1180],{},"Sorting 10,000 rows",": approximately 10× faster",[36,1183,1184,1190],{},[16,1185,1186,1187],{},"Bulk loading 200,000 cells via ",[52,1188,1189],{},"SetRangeData",": approximately 3× faster",[12,1192,1193],{},"Upgrading from 4.3.13 to 4.4.0 requires no changes to existing code.",[74,1195],{},[21,1197,1199],{"id":1198},"benchmark-environment","Benchmark Environment",[100,1201,1202,1212],{},[103,1203,1204],{},[106,1205,1206,1209],{},[109,1207,1208],{},"Item",[109,1210,1211],{},"Details",[116,1213,1214,1222,1230,1238,1252],{},[106,1215,1216,1219],{},[121,1217,1218],{},"CPU",[121,1220,1221],{},"AMD Ryzen 9 9900X (12 cores / 24 threads)",[106,1223,1224,1227],{},[121,1225,1226],{},"OS",[121,1228,1229],{},"Windows 11 Pro",[106,1231,1232,1235],{},[121,1233,1234],{},"Runtime",[121,1236,1237],{},".NET 8.0 (x64, Release build)",[106,1239,1240,1243],{},[121,1241,1242],{},"Versions compared",[121,1244,1245,1248,1249],{},[52,1246,1247],{},"v4.3.13"," ↔ ",[52,1250,1251],{},"v4.4.0",[106,1253,1254,1257],{},[121,1255,1256],{},"Method",[121,1258,1259],{},"Each scenario: 1 warmup + 3 measurement runs, using min / median",[74,1261],{},[21,1263,1265],{"id":1264},"performance-improvements-in-detail","Performance Improvements in Detail",[84,1267,1269],{"id":1268},"_1-conditional-formatting-with-bulk-data-entry-11700-faster","1. Conditional Formatting with Bulk Data Entry: ~11,700× Faster",[12,1271,1272,1275],{},[16,1273,1274],{},"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.",[100,1277,1278,1289],{},[103,1279,1280],{},[106,1281,1282,1285],{},[109,1283,1284],{},"Version",[109,1286,1288],{"align":1287},"right","Time",[116,1290,1291,1298],{},[106,1292,1293,1295],{},[121,1294,1247],{},[121,1296,1297],{"align":1287},"70,175 ms (about 70 seconds)",[106,1299,1300,1304],{},[121,1301,1302],{},[16,1303,1251],{},[121,1305,1306],{"align":1287},[16,1307,1308],{},"6 ms",[387,1310,1314],{"className":1311,"code":1312,"language":1313,"meta":392,"style":392},"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",[52,1315,1316,1321,1326,1331,1336,1341,1345,1350,1354,1360],{"__ignoreMap":392},[396,1317,1318],{"class":398,"line":399},[396,1319,1320],{},"sheet.ConditionalStyles.Add(new Rule(\"THIS > 100\", \"A1:A5000\", new WorksheetRangeStyle\n",[396,1322,1323],{"class":398,"line":420},[396,1324,1325],{},"{\n",[396,1327,1328],{"class":398,"line":427},[396,1329,1330],{},"    Flag = PlainStyleFlag.TextColor,\n",[396,1332,1333],{"class":398,"line":437},[396,1334,1335],{},"    TextColor = SolidColor.Red,\n",[396,1337,1338],{"class":398,"line":484},[396,1339,1340],{},"}));\n",[396,1342,1343],{"class":398,"line":517},[396,1344,424],{"emptyLinePlaceholder":423},[396,1346,1347],{"class":398,"line":550},[396,1348,1349],{},"for (int r = 0; r \u003C 5000; r++)\n",[396,1351,1352],{"class":398,"line":573},[396,1353,1325],{},[396,1355,1357],{"class":398,"line":1356},9,[396,1358,1359],{},"    sheet[r, 0] = r;\n",[396,1361,1363],{"class":398,"line":1362},10,[396,1364,1365],{},"}\n",[12,1367,1368,1371],{},[16,1369,1370],{},"Business impact",": Workflows that load data from external systems into report templates with pre-configured conditional formatting now run smoothly without delay.",[84,1373,1375],{"id":1374},"_2-sorting-10000-rows-10-faster","2. Sorting 10,000 Rows: ~10× Faster",[12,1377,1378,1380],{},[16,1379,1274],{},": Sort 10,000 rows × 5 columns of random integers in ascending order by column A.",[100,1382,1383,1391],{},[103,1384,1385],{},[106,1386,1387,1389],{},[109,1388,1284],{},[109,1390,1288],{"align":1287},[116,1392,1393,1400],{},[106,1394,1395,1397],{},[121,1396,1247],{},[121,1398,1399],{"align":1287},"397 ms",[106,1401,1402,1406],{},[121,1403,1404],{},[16,1405,1251],{},[121,1407,1408],{"align":1287},[16,1409,1410],{},"39 ms",[387,1412,1414],{"className":1311,"code":1413,"language":1313,"meta":392,"style":392},"sheet.SortColumn(0, new RangePosition(0, 0, 10000, 5), SortOrder.Ascending);\n",[52,1415,1416],{"__ignoreMap":392},[396,1417,1418],{"class":398,"line":399},[396,1419,1413],{},[12,1421,1422,1424],{},[16,1423,1370],{},": Large data sets can now be sorted in the on-screen grid with the same operational feel as Excel.",[84,1426,1428],{"id":1427},"_3-bulk-loading-via-setrangedata-3-faster","3. Bulk Loading via SetRangeData: ~3× Faster",[12,1430,1431,1433,1434,1161],{},[16,1432,1274],{},": Bulk-load a 2D array of 10,000 rows × 20 columns (200,000 cells in total) via ",[52,1435,1436],{},"SetRangeData()",[100,1438,1439,1447],{},[103,1440,1441],{},[106,1442,1443,1445],{},[109,1444,1284],{},[109,1446,1288],{"align":1287},[116,1448,1449,1456],{},[106,1450,1451,1453],{},[121,1452,1247],{},[121,1454,1455],{"align":1287},"326 ms",[106,1457,1458,1462],{},[121,1459,1460],{},[16,1461,1251],{},[121,1463,1464],{"align":1287},[16,1465,1466],{},"104 ms",[387,1468,1470],{"className":1311,"code":1469,"language":1313,"meta":392,"style":392},"var data = new object[10000, 20];\n// ... populate data ...\nsheet.SetRangeData(new RangePosition(0, 0, 10000, 20), data);\n",[52,1471,1472,1477,1482],{"__ignoreMap":392},[396,1473,1474],{"class":398,"line":399},[396,1475,1476],{},"var data = new object[10000, 20];\n",[396,1478,1479],{"class":398,"line":420},[396,1480,1481],{},"// ... populate data ...\n",[396,1483,1484],{"class":398,"line":427},[396,1485,1486],{},"sheet.SetRangeData(new RangePosition(0, 0, 10000, 20), data);\n",[12,1488,1489,1491],{},[16,1490,1370],{},": Initial-load operations that populate the grid with records retrieved from databases or CSV files complete in noticeably less time.",[74,1493],{},[21,1495,1497],{"id":1496},"bug-fixes","Bug Fixes",[12,1499,1500],{},"The main bug fixes are as follows.",[33,1502,1503,1512,1523,1529],{},[36,1504,1505,1508,1509,1067],{},[16,1506,1507],{},"Formula parser",": Added support for the unary plus operator (e.g., ",[52,1510,1511],{},"=+D25-F8-F14",[36,1513,1514,1516,1517,62,1520,1067],{},[16,1515,1507],{},": Added support for quoted sheet name references (e.g., ",[52,1518,1519],{},"'BS (JPY)'!B3",[52,1521,1522],{},"'My Sheet'!A1",[36,1524,1525,1528],{},[16,1526,1527],{},"Sort",": Fixed an issue where formula cells remained at their original positions during sorting. As in Excel, formulas now move together with their rows",[36,1530,1531,1534,1535],{},[16,1532,1533],{},"Conditional formatting",": Fixed a defect in the rule removal order in ",[52,1536,1537],{},"ClearConditionalStyles",[74,1539],{},[21,1541,1543],{"id":1542},"api-changes","API Changes",[12,1545,1546],{},"Impact on compatibility has been kept to a minimum, but the following API changes have been made.",[84,1548,1550],{"id":1549},"removed","Removed",[33,1552,1553,1559],{},[36,1554,1555,1558],{},[52,1556,1557],{},"Worksheet.ConditionalStyleApplyCells"," property",[36,1560,1561,1564],{},[52,1562,1563],{},"ConditionalStyleApplyCellCollection"," class",[12,1566,1567],{},"Please use the following methods instead.",[84,1569,1571],{"id":1570},"added","Added",[387,1573,1575],{"className":1311,"code":1574,"language":1313,"meta":392,"style":392},"bool hasStyle = worksheet.HasConditionalStyle(row, col);\nbool hasStyle = worksheet.HasConditionalStyle(new CellPosition(\"A1\"));\nbool hasStyle = cell.HasConditionalStyles;\n",[52,1576,1577,1582,1587],{"__ignoreMap":392},[396,1578,1579],{"class":398,"line":399},[396,1580,1581],{},"bool hasStyle = worksheet.HasConditionalStyle(row, col);\n",[396,1583,1584],{"class":398,"line":420},[396,1585,1586],{},"bool hasStyle = worksheet.HasConditionalStyle(new CellPosition(\"A1\"));\n",[396,1588,1589],{"class":398,"line":427},[396,1590,1591],{},"bool hasStyle = cell.HasConditionalStyles;\n",[74,1593],{},[21,1595,1597],{"id":1596},"how-to-upgrade","How to Upgrade",[12,1599,1600],{},"ReoGrid V4 and later are provided as commercial editions. The latest assemblies can be downloaded by signing in to our customer portal.",[33,1602,1603],{},[36,1604,1605,1606],{},"Customer portal: ",[649,1607,1608],{"href":1608,"rel":1609},"https://portal.unvell.com/",[653],[12,1611,1612],{},"For existing projects, the upgrade is completed simply by replacing the assembly reference with the downloaded version. No code changes are required.",[12,1614,1615,1616,1619,1620,1623],{},"If you were directly referencing ",[52,1617,1618],{},"ConditionalStyleApplyCells",", please replace those references with ",[52,1621,1622],{},"HasConditionalStyle()"," as shown above.",[74,1625],{},[21,1627,1629],{"id":1628},"closing","Closing",[12,1631,1632,1633,1636],{},"ReoGrid 4.4 is a release that focuses on ",[16,1634,1635],{},"resolving the performance issues that have the greatest impact on existing users",", rather than on adding new features.",[12,1638,1639],{},"All figures presented above are measured values obtained by comparing v4.3.13 and v4.4.0 with identical code in the same environment.",[12,1641,1642],{},"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.",[74,1644],{},[21,1646,1648],{"id":1647},"related-links","Related Links",[33,1650,1651,1658],{},[36,1652,1653],{},[649,1654,1657],{"href":1655,"rel":1656},"https://reogrid.net/",[653],"ReoGrid Official Site",[36,1659,1660],{},[649,1661,1664],{"href":1662,"rel":1663},"https://reogrid.net/release-notes",[653],"ReoGrid Release Notes",[670,1666,1667],{},"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":392,"searchDepth":420,"depth":420,"links":1669},[1670,1671,1672,1673,1678,1679,1683,1684,1685],{"id":1134,"depth":420,"text":1135},{"id":1166,"depth":420,"text":1167},{"id":1198,"depth":420,"text":1199},{"id":1264,"depth":420,"text":1265,"children":1674},[1675,1676,1677],{"id":1268,"depth":427,"text":1269},{"id":1374,"depth":427,"text":1375},{"id":1427,"depth":427,"text":1428},{"id":1496,"depth":420,"text":1497},{"id":1542,"depth":420,"text":1543,"children":1680},[1681,1682],{"id":1549,"depth":427,"text":1550},{"id":1570,"depth":427,"text":1571},{"id":1596,"depth":420,"text":1597},{"id":1628,"depth":420,"text":1629},{"id":1647,"depth":420,"text":1648},"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.",{},"/blog/en/reogrid-v4-4-release",{"title":1129,"description":1691},"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",[694,696,1694,1695,697],".net","performance","/images/articles/reogrid-net-snapshot.png","ANYwKHKH80H1lVMDblL8HnOWXJYf5JNAdlOSUvTP31E",1780730735968]