[{"data":1,"prerenderedAt":1141},["ShallowReactive",2],{"blog-en-reogrid-web-1-5-release":3},{"id":4,"title":5,"author":6,"body":7,"date":1124,"description":1125,"extension":1126,"meta":1127,"navigation":180,"path":1128,"seo":1129,"stem":1132,"tags":1133,"thumbnail":1139,"__hash__":1140},"blog_en/blog/en/reogrid-web-1-5-release.md","ReoGrid Web 1.5 Released — Find & Replace, Drag-to-Move, Headers/Footers, and PDF by Locale",null,{"type":8,"value":9,"toc":1114},"minimark",[10,34,39,89,96,99,103,123,134,140,143,330,346,349,352,379,381,385,396,403,444,447,454,577,580,598,600,604,610,666,707,710,712,716,719,739,811,823,826,844,904,923,925,929,979,983,1022,1033,1035,1039,1042,1056,1059,1110],[11,12,13,14,18,19,22,23,22,26,29,30,33],"p",{},"UNVELL Inc. has released ",[15,16,17],"strong",{},"ReoGrid Web 1.5",", a feature release that fills in the places where \"Excel does this, and we did not yet.\" Four headline items: ",[15,20,21],{},"find & replace",", ",[15,24,25],{},"drag-to-move for ranges, rows and columns",[15,27,28],{},"page headers and footers",", and ",[15,31,32],{},"PDF export by locale",". There are no breaking changes to the public API.",[35,36,38],"h2",{"id":37},"_15-highlights","1.5 highlights",[40,41,42,55],"table",{},[43,44,45],"thead",{},[46,47,48,52],"tr",{},[49,50,51],"th",{},"Feature",[49,53,54],{},"Edition",[56,57,58,67,74,82],"tbody",{},[46,59,60,64],{},[61,62,63],"td",{},"Find & replace (Ctrl/Cmd+F, Ctrl/Cmd+H)",[61,65,66],{},"Lite / Pro",[46,68,69,72],{},[61,70,71],{},"Range, row and column drag-to-move",[61,73,66],{},[46,75,76,79],{},[61,77,78],{},"Page headers and footers",[61,80,81],{},"Pro",[46,83,84,87],{},[61,85,86],{},"PDF export by locale (CJK fonts)",[61,88,81],{},[11,90,91,92,95],{},"Find & replace and drag-to-move are treated as basic editing, so they are ",[15,93,94],{},"available in the free Lite edition"," as well.",[97,98],"hr",{},[35,100,102],{"id":101},"find-replace-ctrlcmdf-and-ctrlcmdh","Find & replace — Ctrl/Cmd+F and Ctrl/Cmd+H",[11,104,105,106,110,111,114,115,118,119,122],{},"Press ",[107,108,109],"code",{},"Ctrl/Cmd+F"," (find) or ",[107,112,113],{},"Ctrl/Cmd+H"," (replace) over the grid and the built-in find bar opens. Every match is highlighted on the canvas, and ",[107,116,117],{},"Enter"," / ",[107,120,121],{},"Shift+Enter"," step through them.",[11,124,125,126,129,130,133],{},"Searches run over one of three scopes — ",[15,127,128],{},"the sheet, the selection, or the whole workbook",". Workbook scope activates the sheet a match lands on and reports your position as ",[107,131,132],{},"2/4 · Sheet1",".",[11,135,136,137,133],{},"The options follow Excel: match case, entire cell contents, and ",[15,138,139],{},"regular expressions",[11,141,142],{},"Everything the bar does is also available programmatically.",[144,145,150],"pre",{"className":146,"code":147,"language":148,"meta":149,"style":149},"language-ts shiki shiki-themes github-light github-dark","import { createReogrid } from '@reogrid/lite';\n\nconst grid = createReogrid({ workspace: '#app' });\n\n// Open the bar (same as Ctrl/Cmd+H)\ngrid.showFindBar('replace');\n\n// Or search without the UI\ngrid.find('Tokyo', { scope: 'workbook', matchCase: true });\ngrid.findNext();\n\n// Returns the number of cells rewritten\nconst count = grid.replaceAll('Tokyo', 'Kyoto', { wholeCell: true });\n","ts","",[107,151,152,175,182,208,213,220,238,243,249,276,287,292,298],{"__ignoreMap":149},[153,154,157,161,165,168,172],"span",{"class":155,"line":156},"line",1,[153,158,160],{"class":159},"szBVR","import",[153,162,164],{"class":163},"sVt8B"," { createReogrid } ",[153,166,167],{"class":159},"from",[153,169,171],{"class":170},"sZZnC"," '@reogrid/lite'",[153,173,174],{"class":163},";\n",[153,176,178],{"class":155,"line":177},2,[153,179,181],{"emptyLinePlaceholder":180},true,"\n",[153,183,185,188,192,195,199,202,205],{"class":155,"line":184},3,[153,186,187],{"class":159},"const",[153,189,191],{"class":190},"sj4cs"," grid",[153,193,194],{"class":159}," =",[153,196,198],{"class":197},"sScJk"," createReogrid",[153,200,201],{"class":163},"({ workspace: ",[153,203,204],{"class":170},"'#app'",[153,206,207],{"class":163}," });\n",[153,209,211],{"class":155,"line":210},4,[153,212,181],{"emptyLinePlaceholder":180},[153,214,216],{"class":155,"line":215},5,[153,217,219],{"class":218},"sJ8bj","// Open the bar (same as Ctrl/Cmd+H)\n",[153,221,223,226,229,232,235],{"class":155,"line":222},6,[153,224,225],{"class":163},"grid.",[153,227,228],{"class":197},"showFindBar",[153,230,231],{"class":163},"(",[153,233,234],{"class":170},"'replace'",[153,236,237],{"class":163},");\n",[153,239,241],{"class":155,"line":240},7,[153,242,181],{"emptyLinePlaceholder":180},[153,244,246],{"class":155,"line":245},8,[153,247,248],{"class":218},"// Or search without the UI\n",[153,250,252,254,257,259,262,265,268,271,274],{"class":155,"line":251},9,[153,253,225],{"class":163},[153,255,256],{"class":197},"find",[153,258,231],{"class":163},[153,260,261],{"class":170},"'Tokyo'",[153,263,264],{"class":163},", { scope: ",[153,266,267],{"class":170},"'workbook'",[153,269,270],{"class":163},", matchCase: ",[153,272,273],{"class":190},"true",[153,275,207],{"class":163},[153,277,279,281,284],{"class":155,"line":278},10,[153,280,225],{"class":163},[153,282,283],{"class":197},"findNext",[153,285,286],{"class":163},"();\n",[153,288,290],{"class":155,"line":289},11,[153,291,181],{"emptyLinePlaceholder":180},[153,293,295],{"class":155,"line":294},12,[153,296,297],{"class":218},"// Returns the number of cells rewritten\n",[153,299,301,303,306,308,311,314,316,318,320,323,326,328],{"class":155,"line":300},13,[153,302,187],{"class":159},[153,304,305],{"class":190}," count",[153,307,194],{"class":159},[153,309,310],{"class":163}," grid.",[153,312,313],{"class":197},"replaceAll",[153,315,231],{"class":163},[153,317,261],{"class":170},[153,319,22],{"class":163},[153,321,322],{"class":170},"'Kyoto'",[153,324,325],{"class":163},", { wholeCell: ",[153,327,273],{"class":190},[153,329,207],{"class":163},[11,331,332,333,336,337,340,341,345],{},"By default a search compares against each cell's raw input — ",[107,334,335],{},"=SUM(A1:A3)"," for a formula cell. Pass ",[107,338,339],{},"lookIn: 'value'"," to search the displayed text instead; in that mode a formula cell whose ",[342,343,344],"em",{},"result"," matched is never rewritten.",[11,347,348],{},"A replace-all is undoable in a single step and skips protected cells.",[11,350,351],{},"To build your own search UI, disable the built-in bar and drive the API directly.",[144,353,355],{"className":146,"code":354,"language":148,"meta":149,"style":149},"const grid = createReogrid({ workspace: '#app', showFindBar: false });\n",[107,356,357],{"__ignoreMap":149},[153,358,359,361,363,365,367,369,371,374,377],{"class":155,"line":156},[153,360,187],{"class":159},[153,362,191],{"class":190},[153,364,194],{"class":159},[153,366,198],{"class":197},[153,368,201],{"class":163},[153,370,204],{"class":170},[153,372,373],{"class":163},", showFindBar: ",[153,375,376],{"class":190},"false",[153,378,207],{"class":163},[97,380],{},[35,382,384],{"id":383},"drag-to-move-ranges-rows-and-columns","Drag to move ranges, rows and columns",[11,386,387,388,391,392,395],{},"Grab the ",[15,389,390],{},"border"," of a selection and drag it to relocate the cell block. Values, formulas, rich text, number formats, styles, cell types, borders, comments and lock states all travel together, and the destination is ",[15,393,394],{},"overwritten"," — exactly as in Excel.",[11,397,398,399,402],{},"Dragging an ",[15,400,401],{},"already-selected"," row or column header does something different: it reorders whole rows or columns as a cut-and-insert. That is a pure permutation, so nothing is lost.",[144,404,406],{"className":146,"code":405,"language":148,"meta":149,"style":149},"// Move B2:D10 so that its top-left lands on F2\ngrid.worksheet.range('B2:D10').moveTo(1, 5);\n",[107,407,408,413],{"__ignoreMap":149},[153,409,410],{"class":155,"line":156},[153,411,412],{"class":218},"// Move B2:D10 so that its top-left lands on F2\n",[153,414,415,418,421,423,426,429,432,434,437,439,442],{"class":155,"line":177},[153,416,417],{"class":163},"grid.worksheet.",[153,419,420],{"class":197},"range",[153,422,231],{"class":163},[153,424,425],{"class":170},"'B2:D10'",[153,427,428],{"class":163},").",[153,430,431],{"class":197},"moveTo",[153,433,231],{"class":163},[153,435,436],{"class":190},"1",[153,438,22],{"class":163},[153,440,441],{"class":190},"5",[153,443,237],{"class":163},[11,445,446],{},"A move that would tear a merged cell, land outside the sheet, hit a protected cell, or run while a delay-load data source is attached is refused.",[11,448,449,450,453],{},"Moves emit a ",[15,451,452],{},"cancellable"," event, so a host can substitute its own behaviour.",[144,455,457],{"className":146,"code":456,"language":148,"meta":149,"style":149},"grid.onBeforeRangeMove((e) => {\n  // Never let the header row be moved\n  if (e.kind === 'rows' && e.from.topRow === 0) {\n    e.cancel = true;\n  }\n});\n\ngrid.onAfterRangeMove((e) => {\n  console.log(e.kind, e.from, e.to); // completed moves only\n});\n",[107,458,459,482,487,515,528,533,538,542,559,573],{"__ignoreMap":149},[153,460,461,463,466,469,473,476,479],{"class":155,"line":156},[153,462,225],{"class":163},[153,464,465],{"class":197},"onBeforeRangeMove",[153,467,468],{"class":163},"((",[153,470,472],{"class":471},"s4XuR","e",[153,474,475],{"class":163},") ",[153,477,478],{"class":159},"=>",[153,480,481],{"class":163}," {\n",[153,483,484],{"class":155,"line":177},[153,485,486],{"class":218},"  // Never let the header row be moved\n",[153,488,489,492,495,498,501,504,507,509,512],{"class":155,"line":184},[153,490,491],{"class":159},"  if",[153,493,494],{"class":163}," (e.kind ",[153,496,497],{"class":159},"===",[153,499,500],{"class":170}," 'rows'",[153,502,503],{"class":159}," &&",[153,505,506],{"class":163}," e.from.topRow ",[153,508,497],{"class":159},[153,510,511],{"class":190}," 0",[153,513,514],{"class":163},") {\n",[153,516,517,520,523,526],{"class":155,"line":210},[153,518,519],{"class":163},"    e.cancel ",[153,521,522],{"class":159},"=",[153,524,525],{"class":190}," true",[153,527,174],{"class":163},[153,529,530],{"class":155,"line":215},[153,531,532],{"class":163},"  }\n",[153,534,535],{"class":155,"line":222},[153,536,537],{"class":163},"});\n",[153,539,540],{"class":155,"line":240},[153,541,181],{"emptyLinePlaceholder":180},[153,543,544,546,549,551,553,555,557],{"class":155,"line":245},[153,545,225],{"class":163},[153,547,548],{"class":197},"onAfterRangeMove",[153,550,468],{"class":163},[153,552,472],{"class":471},[153,554,475],{"class":163},[153,556,478],{"class":159},[153,558,481],{"class":163},[153,560,561,564,567,570],{"class":155,"line":251},[153,562,563],{"class":163},"  console.",[153,565,566],{"class":197},"log",[153,568,569],{"class":163},"(e.kind, e.from, e.to); ",[153,571,572],{"class":218},"// completed moves only\n",[153,574,575],{"class":155,"line":278},[153,576,537],{"class":163},[11,578,579],{},"If your application does not want the interaction at all, turn it off without touching the API.",[144,581,583],{"className":146,"code":582,"language":148,"meta":149,"style":149},"grid.worksheet.setRangeMoveEnabled(false);\n",[107,584,585],{"__ignoreMap":149},[153,586,587,589,592,594,596],{"class":155,"line":156},[153,588,417],{"class":163},[153,590,591],{"class":197},"setRangeMoveEnabled",[153,593,231],{"class":163},[153,595,376],{"class":190},[153,597,237],{"class":163},[97,599],{},[35,601,603],{"id":602},"page-headers-and-footers-pro","Page headers and footers (Pro)",[11,605,606,607,133],{},"Print and PDF output can now put page numbers, dates and sheet names in the paper margins. A band has left, center and right sections for both header and footer, and the text holds ",[15,608,609],{},"Excel's format codes verbatim",[144,611,613],{"className":146,"code":612,"language":148,"meta":149,"style":149},"grid.worksheet.setPrintSettings({\n  headerFooter: {\n    header: { center: 'Sales Report', right: '&D' },\n    footer: { right: 'Page &P / &N' },\n  },\n});\n",[107,614,615,625,630,647,657,662],{"__ignoreMap":149},[153,616,617,619,622],{"class":155,"line":156},[153,618,417],{"class":163},[153,620,621],{"class":197},"setPrintSettings",[153,623,624],{"class":163},"({\n",[153,626,627],{"class":155,"line":177},[153,628,629],{"class":163},"  headerFooter: {\n",[153,631,632,635,638,641,644],{"class":155,"line":184},[153,633,634],{"class":163},"    header: { center: ",[153,636,637],{"class":170},"'Sales Report'",[153,639,640],{"class":163},", right: ",[153,642,643],{"class":170},"'&D'",[153,645,646],{"class":163}," },\n",[153,648,649,652,655],{"class":155,"line":210},[153,650,651],{"class":163},"    footer: { right: ",[153,653,654],{"class":170},"'Page &P / &N'",[153,656,646],{"class":163},[153,658,659],{"class":155,"line":215},[153,660,661],{"class":163},"  },\n",[153,663,664],{"class":155,"line":222},[153,665,537],{"class":163},[11,667,668,671,672,675,676,118,679,682,683,686,687,690,691,694,695,698,699,702,703,706],{},[107,669,670],{},"&P"," (page), ",[107,673,674],{},"&N"," (page count), ",[107,677,678],{},"&D",[107,680,681],{},"&T"," (date and time), ",[107,684,685],{},"&F"," (file name) and ",[107,688,689],{},"&A"," (sheet name) are supported, including offsets like ",[107,692,693],{},"&P+2",". Because the codes are stored rather than expanded, ",[15,696,697],{},"a round-trip through xlsx keeps them intact in Excel",". ",[107,700,701],{},"differentOddEven"," and ",[107,704,705],{},"differentFirst"," are available for alternating and title pages.",[11,708,709],{},"When a band is taller than its margin allows, the body area is pushed in rather than drawn over — Excel's behaviour, which means a tall header costs you rows per page. The break computation, the PDF exporter and the paged print HTML all share that geometry, so what you see and what you print agree.",[97,711],{},[35,713,715],{"id":714},"pdf-export-by-locale-pro","PDF export by locale (Pro)",[11,717,718],{},"PDF embeds glyph outlines, so exporting needs real font bytes. Through 1.4 the only bundled loader was a Japanese font, which covers roughly a third of everyday simplified-Chinese business vocabulary — Chinese sheets came out full of tofu (□) with no supported way to fix it.",[11,720,721,722,725,726,22,729,22,732,702,735,738],{},"1.5 introduces a ",[15,723,724],{},"font registry"," with ",[107,727,728],{},"ja",[107,730,731],{},"zh-CN",[107,733,734],{},"zh-TW",[107,736,737],{},"ko"," registered out of the box. Name a locale and the right font is embedded.",[144,740,742],{"className":146,"code":741,"language":148,"meta":149,"style":149},"import { preloadPdfFont } from '@reogrid/pro';\n\n// Once at app start — this is where the download happens\nawait preloadPdfFont('zh-CN');\n\n// Thereafter, export synchronously from anywhere\ngrid.saveAsPdf({ locale: 'zh-CN', filename: 'report.pdf' });\n",[107,743,744,758,762,767,782,786,791],{"__ignoreMap":149},[153,745,746,748,751,753,756],{"class":155,"line":156},[153,747,160],{"class":159},[153,749,750],{"class":163}," { preloadPdfFont } ",[153,752,167],{"class":159},[153,754,755],{"class":170}," '@reogrid/pro'",[153,757,174],{"class":163},[153,759,760],{"class":155,"line":177},[153,761,181],{"emptyLinePlaceholder":180},[153,763,764],{"class":155,"line":184},[153,765,766],{"class":218},"// Once at app start — this is where the download happens\n",[153,768,769,772,775,777,780],{"class":155,"line":210},[153,770,771],{"class":159},"await",[153,773,774],{"class":197}," preloadPdfFont",[153,776,231],{"class":163},[153,778,779],{"class":170},"'zh-CN'",[153,781,237],{"class":163},[153,783,784],{"class":155,"line":215},[153,785,181],{"emptyLinePlaceholder":180},[153,787,788],{"class":155,"line":222},[153,789,790],{"class":218},"// Thereafter, export synchronously from anywhere\n",[153,792,793,795,798,801,803,806,809],{"class":155,"line":240},[153,794,225],{"class":163},[153,796,797],{"class":197},"saveAsPdf",[153,799,800],{"class":163},"({ locale: ",[153,802,779],{"class":170},[153,804,805],{"class":163},", filename: ",[153,807,808],{"class":170},"'report.pdf'",[153,810,207],{"class":163},[11,812,813,814,698,817,819,820,822],{},"Registration and loading are separate steps in order to ",[15,815,816],{},"keep PDF export synchronous",[107,818,797],{}," ends in a click on a download anchor, and an ",[107,821,771],{}," immediately before that would lose the user-gesture context and meet the popup blocker. Network access is therefore moved to an async point the caller controls.",[11,824,825],{},"We have also published subsetted CJK fonts as npm packages. The built-in sources point at full upstream fonts on a public CDN, which can be slow or unreachable in some environments — notably mainland China. Installing a package removes the runtime network entirely and works on the offline intranets common in enterprise deployments.",[144,827,831],{"className":828,"code":829,"language":830,"meta":149,"style":149},"language-bash shiki shiki-themes github-light github-dark","npm install @reogrid/font-sc\n","bash",[107,832,833],{"__ignoreMap":149},[153,834,835,838,841],{"class":155,"line":156},[153,836,837],{"class":197},"npm",[153,839,840],{"class":170}," install",[153,842,843],{"class":170}," @reogrid/font-sc\n",[144,845,847],{"className":146,"code":846,"language":148,"meta":149,"style":149},"import { registerPdfFont, preloadPdfFont } from '@reogrid/pro';\nimport { loadNotoSansSC } from '@reogrid/font-sc';\n\nregisterPdfFont('zh-CN', loadNotoSansSC);\nawait preloadPdfFont('zh-CN');\n",[107,848,849,862,876,880,892],{"__ignoreMap":149},[153,850,851,853,856,858,860],{"class":155,"line":156},[153,852,160],{"class":159},[153,854,855],{"class":163}," { registerPdfFont, preloadPdfFont } ",[153,857,167],{"class":159},[153,859,755],{"class":170},[153,861,174],{"class":163},[153,863,864,866,869,871,874],{"class":155,"line":177},[153,865,160],{"class":159},[153,867,868],{"class":163}," { loadNotoSansSC } ",[153,870,167],{"class":159},[153,872,873],{"class":170}," '@reogrid/font-sc'",[153,875,174],{"class":163},[153,877,878],{"class":155,"line":184},[153,879,181],{"emptyLinePlaceholder":180},[153,881,882,885,887,889],{"class":155,"line":210},[153,883,884],{"class":197},"registerPdfFont",[153,886,231],{"class":163},[153,888,779],{"class":170},[153,890,891],{"class":163},", loadNotoSansSC);\n",[153,893,894,896,898,900,902],{"class":155,"line":215},[153,895,771],{"class":159},[153,897,774],{"class":197},[153,899,231],{"class":163},[153,901,779],{"class":170},[153,903,237],{"class":163},[11,905,906,907,910,911,914,915,918,919,922],{},"Alongside ",[107,908,909],{},"@reogrid/font-sc"," (zh-CN / GB 2312) there are ",[107,912,913],{},"@reogrid/font-tc"," (zh-TW / Big5), ",[107,916,917],{},"@reogrid/font-jp"," (ja / JIS X 0208) and ",[107,920,921],{},"@reogrid/font-kr"," (ko / KS X 1001).",[97,924],{},[35,926,928],{"id":927},"also-added-and-improved","Also added and improved",[930,931,932,941,954,963,969],"ul",{},[933,934,935,940],"li",{},[15,936,937],{},[107,938,939],{},"instance.focus()"," — returns keyboard focus to the grid. Call it after a host toolbar action so the next shortcut (undo, copy/paste, arrow navigation) reaches the grid instead of the browser.",[933,942,943,946,947,118,950,953],{},[15,944,945],{},"Clearing outlines in one call"," — ",[107,948,949],{},"clearRowOutlines()",[107,951,952],{},"clearColumnOutlines()"," drop every group and reveal any rows or columns a collapsed group was hiding. This is what you want when rebuilding an outline tree from a model.",[933,955,956,946,959,962],{},[15,957,958],{},"Bounded auto-fit scanning",[107,960,961],{},"autoFitMaxScanRows"," (default 1000) caps how many rows are measured when auto-fitting a column, bounding the cost on very large sheets.",[933,964,965,968],{},[15,966,967],{},"Double-click fits the whole selection"," — select A:D and double-click any of their borders and every selected column is fitted, as in Excel.",[933,970,971,974,975,978],{},[15,972,973],{},"HiDPI re-scale on monitor change"," — the grid watches ",[107,976,977],{},"devicePixelRatio",", so moving a window between a Retina and a standard display no longer leaves the canvas blurry.",[35,980,982],{"id":981},"notable-fixes","Notable fixes",[930,984,985,988,991,994,997,1003,1010,1016,1019],{},[933,986,987],{},"Text overflowing from a cell no longer disappears when the cell holding it scrolls out of view.",[933,989,990],{},"Dropdowns (list validation rules and the auto-filter popup) near the bottom of the window now open upward instead of off-screen.",[933,992,993],{},"On hosts with classic, space-reserving scrollbars (Windows and similar), the last row and column are no longer hidden beneath the scrollbar.",[933,995,996],{},"Freezing panes no longer leaves dead travel at the end of the scrollbar.",[933,998,999,1002],{},[107,1000,1001],{},"readReoGridJson()"," now resets the worksheet before loading, so opening a second document no longer leaves the previous one underneath it.",[933,1004,1005,1006,1009],{},"PDF export honors B4, B5, Tabloid and Executive in ",[107,1007,1008],{},"pageSize"," — previously anything outside a five-entry table silently fell back to A4, which made JIS B4/B5 a quiet wrong-output bug in Japan.",[933,1011,1012,1013,428],{},"PDF export follows the sheet's own grid-line setting (",[107,1014,1015],{},"setShowGridLines(false)",[933,1017,1018],{},"A border sitting on a page boundary now prints on both pages.",[933,1020,1021],{},"A number-formatted formula cell no longer keeps a stale value after a bulk recalculation such as a sort.",[11,1023,1024,1025,1032],{},"See the ",[1026,1027,1031],"a",{"href":1028,"rel":1029},"https://github.com/unvell/reogrid-web/blob/main/CHANGELOG.md",[1030],"nofollow","CHANGELOG"," for the full list.",[97,1034],{},[35,1036,1038],{"id":1037},"get-started","Get started",[11,1040,1041],{},"Lite needs no license key — install it straight from npm. Find & replace and drag-to-move both work there.",[144,1043,1045],{"className":828,"code":1044,"language":830,"meta":149,"style":149},"npm install @reogrid/lite\n",[107,1046,1047],{"__ignoreMap":149},[153,1048,1049,1051,1053],{"class":155,"line":156},[153,1050,837],{"class":197},[153,1052,840],{"class":170},[153,1054,1055],{"class":170}," @reogrid/lite\n",[11,1057,1058],{},"Pro adds the 109-function formula library, xlsx and PDF export, page headers and footers, and the full set of cell types. A 30-day evaluation is available.",[930,1060,1061,1068,1075,1082,1089,1096,1103],{},[933,1062,1063],{},[1026,1064,1067],{"href":1065,"rel":1066},"https://web.reogrid.net",[1030],"Product site",[933,1069,1070],{},[1026,1071,1074],{"href":1072,"rel":1073},"https://web.reogrid.net/docs/find-replace",[1030],"Find & replace documentation",[933,1076,1077],{},[1026,1078,1081],{"href":1079,"rel":1080},"https://web.reogrid.net/docs/pdf-export",[1030],"PDF export documentation",[933,1083,1084],{},[1026,1085,1088],{"href":1086,"rel":1087},"https://web.reogrid.net/docs/print",[1030],"Print and page setup documentation",[933,1090,1091],{},[1026,1092,1095],{"href":1093,"rel":1094},"https://web.reogrid.net/demos",[1030],"Live demo gallery",[933,1097,1098],{},[1026,1099,1102],{"href":1100,"rel":1101},"https://reogrid.net/contact",[1030],"Contact us",[933,1104,1105],{},[1026,1106,1109],{"href":1107,"rel":1108},"https://www.npmjs.com/package/@reogrid/lite",[1030],"npm package (@reogrid/lite)",[1111,1112,1113],"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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":149,"searchDepth":177,"depth":177,"links":1115},[1116,1117,1118,1119,1120,1121,1122,1123],{"id":37,"depth":177,"text":38},{"id":101,"depth":177,"text":102},{"id":383,"depth":177,"text":384},{"id":602,"depth":177,"text":603},{"id":714,"depth":177,"text":715},{"id":927,"depth":177,"text":928},{"id":981,"depth":177,"text":982},{"id":1037,"depth":177,"text":1038},"2026-08-08","ReoGrid Web 1.5 is here. Excel-style find & replace on Ctrl/Cmd+F and Ctrl/Cmd+H, drag-to-move for selected ranges, rows and columns, page headers and footers using Excel's own format codes, and a PDF font registry that embeds the right CJK font from a locale name. No breaking changes to the public API.","md",{},"/blog/en/reogrid-web-1-5-release",{"title":1130,"description":1131},"ReoGrid Web 1.5 Released — Find & Replace and Drag-to-Move for JavaScript Spreadsheets","What's new in ReoGrid Web 1.5 — a built-in find & replace bar with regular expressions and workbook-wide scope, range/row/column drag-to-move, page headers and footers with Excel format codes, and locale-based CJK font embedding for PDF export. React and Vue supported, no breaking API changes.","blog/en/reogrid-web-1-5-release",[1134,1135,1136,1137,1138],"reogrid","reogrid-web","spreadsheet","release","javascript","/images/articles/reogrid-web-1-5.jpg","aPrVQbIULJCGU7H3Ai4on5Un9BBkQkhymfNoDm9vxKI",1787018325691]