{"id":15536,"date":"2026-05-21T11:11:38","date_gmt":"2026-05-21T08:11:38","guid":{"rendered":"https:\/\/dhtmlx.com\/blog\/?p=15536"},"modified":"2026-06-30T18:47:01","modified_gmt":"2026-06-30T15:47:01","slug":"meet-dhtmlx-spreadsheet-6-0","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/meet-dhtmlx-spreadsheet-6-0\/","title":{"rendered":"Meet DHTMLX Spreadsheet 6.0 with React Wrapper, Custom Formulas, Scientific Notation, and More"},"content":{"rendered":"<p>Today, we are delighted to announce the highly anticipated release of DHTMLX Spreadsheet 6.0. In this iteration, we take a major step toward modern React development workflows by introducing the React Spreadsheet wrapper. This novelty enables you to add the time-tested <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSpreadsheet\/\" rel=\"noopener\" target=\"_blank\">JavaScript Spreadsheet<\/a> functionality to React apps in a familiar, declarative way. The wrapper covers all major spreadsheet capabilities and, when needed, provides direct access to the native API, which also received useful updates. Specifically, v6.0 adds support for custom formulas, requested conditional aggregate functions, scientific notation, flexible font-size settings, and JSDoc annotations. <\/p>\n\n\t\t<div class='post-banner'>\n\t\t    <div class='post-banner__inside'>\n\t\t        <div>\n\t\t            <div class=\"post-banner__title\">Download DHTMLX Spreadsheet v6.0<\/div>\n\t\t            <div class=\"post-banner__text\">Estimate the updated functionality for delivering Excel-like data tables<\/div>\n                <\/div>\n\t\t            \n                \n            <div class='post-banner__btn'>\n                <a href='https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSpreadsheet\/download.shtml' title='' class='button-secondary'>Get free trial<\/a>\n            <\/div>\n        \n            <\/div>\n\t\t<\/div>\n\t\n<p>Now, let us delve into the details. <\/p>\n<h2>What You Get with React Spreadsheet<\/h2>\n<p>React is still considered an industry standard for building modern business apps, thanks to its component-based architecture and scalability, while Excel-like spreadsheets remain relevant for data analysis. The new DHTMLX wrapper helps development teams address both these needs. It is designed to work seamlessly with modern React (18 and later versions) and follows the main React principles, making it easier to configure a powerful spreadsheet via props.<\/p>\n<p>Here is a basic setup that shows how to import and render a basic spreadsheet table in React:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> useState <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;react&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> ReactSpreadsheet<span class=\"sy0\">,<\/span> type SheetData <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;@dhtmlx\/trial-react-spreadsheet&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"st0\">&quot;@dhtmlx\/trial-react-spreadsheet\/spreadsheet.react.css&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> App<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">const<\/span> <span class=\"br0\">&#91;<\/span>sheets<span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> useState<span class=\"sy0\">&lt;<\/span>SheetData<span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;sheet1&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Sales&quot;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cells<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A1<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Product&quot;<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;bold&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B1<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Revenue&quot;<\/span><span class=\"sy0\">,<\/span> css<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;bold&quot;<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;currency&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;A2<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Widget&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;B2<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> <span class=\"nu0\">15000<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;currency&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw1\">const<\/span> styles <span class=\"sy0\">=<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;bold<span class=\"sy0\">:<\/span> <span class=\"br0\">&#123;<\/span> <span class=\"st0\">&quot;font-weight&quot;<\/span><span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;bold&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw1\">return<\/span> <span class=\"sy0\">&lt;<\/span>ReactSpreadsheet sheets<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span>sheets<span class=\"br0\">&#125;<\/span> styles<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span>styles<span class=\"br0\">&#125;<\/span> activeSheet<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;sheet1&quot;<\/span> <span class=\"sy0\">\/&gt;;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>Under the hood, all spreadsheet data is organized via the <strong>sheets<\/strong> prop, which acts as the single source of truth. In the example above, this prop is used to specify a single sheet and formatted cells. <\/p>\n<p>Using props, you can extend the spreadsheet with other popular features available in DHTMLX Spreadsheet: multiple sheets, predefined formulas, number formatting, themes, localization, data manipulations, and more. <\/p>\n<p>Props describe the UI state. So when they are updated, the wrapper synchronizes the underlying widget accordingly. Props differ in update behavior. Check the documentation to learn <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/react\/overview\/#prop-update-behavior\" rel=\"noopener\" target=\"_blank\">how props are categorized by this criterion<\/a> and gain a deeper understanding of <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/react\/state\/\" rel=\"noopener\" target=\"_blank\">state management<\/a> in the React Spreadsheet.<\/p>\n<p>The wrapper also provides typed event callbacks (like <strong>onAfterAction<\/strong> shown below) to respond to user interactions.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>ReactSpreadsheet<br \/>\n&nbsp; &nbsp;sheets<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span>sheets<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;onAfterAction<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#40;<\/span>action<span class=\"sy0\">,<\/span> config<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;console.<span class=\"me1\">log<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;Action:&quot;<\/span><span class=\"sy0\">,<\/span> action<span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;Cell:&quot;<\/span><span class=\"sy0\">,<\/span> config.<span class=\"me1\">cell<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"sy0\">\/&gt;<\/span><\/div><\/div>\n<p>If the spreadsheet table&#8217;s default configuration does not meet your needs, you can customize any UI elements (toolbar, context menu, search bar, etc.). For example, if you need to display the toolbar with a specific set of controls, you need to pass an array of block identifiers to <strong>toolbarBlocks<\/strong>, as shown below:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>ReactSpreadsheet<br \/>\n&nbsp; &nbsp;sheets<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span>sheets<span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;toolbarBlocks<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;undo&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;colors&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;decoration&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;align&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;format&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"sy0\">\/&gt;<\/span><\/div><\/div>\n<p>While most of the spreadsheet UI is configured via declarative props, some features are better handled via an imperative approach. For such cases, the wrapper allows accessing the underlying Spreadsheet API via <strong>SpreadsheetRef<\/strong>:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> useRef <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;react&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"kw5\">import<\/span> <span class=\"br0\">&#123;<\/span> ReactSpreadsheet<span class=\"sy0\">,<\/span> type SpreadsheetRef <span class=\"br0\">&#125;<\/span> from <span class=\"st0\">&quot;@dhtmlx\/trial-react-spreadsheet&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">function<\/span> App<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">const<\/span> ref <span class=\"sy0\">=<\/span> useRef<span class=\"sy0\">&lt;<\/span>SpreadsheetRef<span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw2\">null<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw1\">const<\/span> handleExport <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"kw1\">const<\/span> data <span class=\"sy0\">=<\/span> ref.<span class=\"me1\">current<\/span><span class=\"sy0\">?<\/span>.<span class=\"me1\">instance<\/span><span class=\"sy0\">?<\/span>.<span class=\"me1\">serialize<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;console.<span class=\"me1\">log<\/span><span class=\"br0\">&#40;<\/span>data<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw1\">const<\/span> handleUndo <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;ref.<span class=\"me1\">current<\/span><span class=\"sy0\">?<\/span>.<span class=\"me1\">instance<\/span><span class=\"sy0\">?<\/span>.<span class=\"me1\">undo<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw1\">return<\/span> <span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>button onClick<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span>handleExport<span class=\"br0\">&#125;<\/span><span class=\"sy0\">&gt;<\/span>Export<span class=\"sy0\">&lt;\/<\/span>button<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>button onClick<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span>handleUndo<span class=\"br0\">&#125;<\/span><span class=\"sy0\">&gt;<\/span>Undo<span class=\"sy0\">&lt;\/<\/span>button<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>ReactSpreadsheet ref<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span>ref<span class=\"br0\">&#125;<\/span> sheets<span class=\"sy0\">=<\/span><span class=\"br0\">&#123;<\/span><span class=\"br0\">&#91;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#125;<\/span> <span class=\"sy0\">\/&gt;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"sy0\">&lt;\/&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/div>\n<p>It works well for serializing data, triggering undo\/redo operations, or managing selections programmatically. <\/p>\n<h3>How to Get and Where to Start<\/h3>\n<p>The first thing to mention is that the React Spreadsheet wrapper will be a <strong>free addition<\/strong> to the DHTMLX JS Spreadsheet distributed under <strong>Commercial<\/strong>, <strong>Enterprise<\/strong>, and <strong>Ultimate<\/strong> licenses.<\/p>\n<p>After reading the information above, you should have a general understanding of the wrapper and its working principles. Now, you can move from theory to practice. To try DHTMLX React Spreadsheet in action absolutely free of charge, you have two options on npm:<\/p>\n<ul>\n<li>evaluation version on public npm (no additional configuration required)<\/li>\n<\/ul>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">npm install <span class=\"sy0\">@<\/span>dhtmlx<span class=\"sy0\">\/<\/span>trial<span class=\"sy0\">-<\/span>react<span class=\"sy0\">-<\/span>spreadsheet<\/div><\/div>\n<ul>\n<li>evaluation version on private npm<\/li>\n<\/ul>\n<p>This option implies pre-configuration:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">npm config <span class=\"kw1\">set<\/span> <span class=\"sy0\">@<\/span>dhx<span class=\"sy0\">:<\/span>registry https<span class=\"sy0\">:<\/span><span class=\"co1\">\/\/npm.dhtmlx.com<\/span><\/div><\/div>\n<p>And subsequent installation:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">npm install <span class=\"sy0\">@<\/span>dhx<span class=\"sy0\">\/<\/span>trial<span class=\"sy0\">-<\/span>react<span class=\"sy0\">-<\/span>spreadsheet<\/div><\/div>\n<p>The latter approach is applied for accessing the commercial version on npm:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">npm config <span class=\"kw1\">set<\/span> <span class=\"sy0\">@<\/span>dhx<span class=\"sy0\">:<\/span>registry https<span class=\"sy0\">:<\/span><span class=\"co1\">\/\/npm.dhtmlx.com<\/span><br \/>\nnpm install <span class=\"sy0\">@<\/span>dhx<span class=\"sy0\">\/<\/span>react<span class=\"sy0\">-<\/span>spreadsheet<\/div><\/div>\n<p>For more information, check the <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/react\/installation\/\" rel=\"noopener\" target=\"_blank\">installation guide<\/a>. <\/p>\n<p>The &#8220;<a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/react\/quick-start\/\" rel=\"noopener\" target=\"_blank\">Quick start<\/a>&#8221; tutorial provides clear step-by-step instructions for creating a basic app with DHTMLX React Spreadsheet. To make this process even more understandable, here is a <a href=\"https:\/\/github.com\/DHTMLX\/react-spreadsheet-examples\" rel=\"noopener\" target=\"_blank\">working demo<\/a> on GitHub.<\/p>\n<p>It is time to switch to other Spreadsheet novelties included in v6.0, which will be available for both JavaScript and React versions. <\/p>\n<h2>Calculation Engine with New Math Functions and Custom Options<\/h2>\n<p>In v6.0, our team also focused on improving the area that distinguishes spreadsheets from other data management tools, like a grid table, namely, the ability to perform calculations of any complexity level. Our already solid <a href=\"https:\/\/snippet.dhtmlx.com\/wux2b35b?mode=wide\" rel=\"noopener\" target=\"_blank\">collection of predefined formulas<\/a> has been expanded with new options.<\/p>\n<p>From now on, you can use popular conditional aggregate functions such as <strong>COUNTIF<\/strong>, <strong>COUNTIFS<\/strong>, <strong>SUMIF<\/strong>, <strong>SUMIFS<\/strong>, <strong>AVERAGEIF<\/strong>, <strong>AVERAGEIFS<\/strong>, <strong>MAXIFS<\/strong>, and <strong>MINIFS<\/strong>. They can be very helpful for simplifying criteria-based calculations for reporting, analytics, financial summaries, and KPIs.<\/p>\n<p>But even if you cannot find the right solution for your scenario among the available options, this is not a problem anymore. The updated DHTMLX Spreadsheet allows registering custom formulas via the new <strong><a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/api\/spreadsheet_addformula_method\/\" rel=\"noopener\" target=\"_blank\">addFormula()<\/a><\/strong> method. In this method, you specify the name of a new formula and a synchronous callback function that processes cell values and returns the result. Here is a basic example of creating a custom formula:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">spreadsheet.<span class=\"me1\">addFormula<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;DOUBLE&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#40;<\/span>value<span class=\"br0\">&#41;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">return<\/span> value <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p>Afterwards, it becomes another option at your disposal and is called by its uppercase name in any spreadsheet cell.<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">spreadsheet.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> cell<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;A1&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span> <span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;number&quot;<\/span> <span class=\"br0\">&#125;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp; <span class=\"br0\">&#123;<\/span> cell<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;B1&quot;<\/span><span class=\"sy0\">,<\/span> value<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;=DOUBLE(A1)&quot;<\/span><span class=\"sy0\">,<\/span> format<span class=\"sy0\">:<\/span><span class=\"st0\">&quot;number&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2026\/05\/2026-05-19_14-30-56.gif\" alt=\"custom formula\" width=\"932\" height=\"376\" class=\"alignleft size-full wp-image-15539\" \/><br \/>\n<a href=\"https:\/\/snippet.dhtmlx.com\/wvxdlahp?tag=spreadsheet\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a><\/p>\n<h2>New Formatting Option for Extreme Numeric Values<\/h2>\n<p>When spreadsheet tables are used for complex calculations in science, engineering, or statistical analysis, users often have to deal with very small or very large numbers. Presenting such values in full size is possible, but it often clutters the layout and affects readability. That is why we extended the list of supported numeric formats with <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/number_formatting\/#scientific-number-format\" rel=\"noopener\" target=\"_blank\">scientific (exponential) notation<\/a>. Added as a new default option, it offers a standardized way for a compact representation of extreme numeric values in spreadsheet cells. <\/p>\n<p>For instance, scientific notation allows displaying 12,300,000,000 as 1.23E+10. Programmatically, the new format is specified as a parameter (<strong>&#8220;scientific&#8221;<\/strong>) of the <strong>setFormat()<\/strong> method and uses the mask <strong>0.00E+00<\/strong>:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\">spreadsheet.<span class=\"me1\">setFormat<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;A1&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;scientific&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <br \/>\nc<br \/>\nThe updated API allows you to go even further and <span class=\"kw1\">set<\/span> up a custom option with a different mask using the <span class=\"sy0\">&lt;<\/span>strong<span class=\"sy0\">&gt;<\/span>formats<span class=\"sy0\">&lt;\/<\/span>strong<span class=\"sy0\">&gt;<\/span> property<span class=\"sy0\">,<\/span> where the list of formats is defined. <span class=\"me1\">For<\/span> instance<span class=\"sy0\">,<\/span> <span class=\"kw1\">if<\/span> you apply the mask like <span class=\"sy0\">&lt;<\/span>strong<span class=\"sy0\">&gt;<\/span><span class=\"nu0\">0<\/span>.###E<span class=\"sy0\">+<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">&lt;\/<\/span>strong<span class=\"sy0\">&gt;<\/span> to <span class=\"kw1\">get<\/span> a more compact output<span class=\"sy0\">:<\/span><br \/>\n<span class=\"sy0\">&lt;<\/span>code lang<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;javascript&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"kw1\">const<\/span> spreadsheet <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Spreadsheet<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;spreadsheet_container&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;formats<span class=\"sy0\">:<\/span> <span class=\"br0\">&#91;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;<span class=\"br0\">&#123;<\/span> id<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;scientific_compact&quot;<\/span><span class=\"sy0\">,<\/span> mask<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;0.###E+0&quot;<\/span><span class=\"sy0\">,<\/span> name<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;Scientific (compact)&quot;<\/span><span class=\"sy0\">,<\/span> example<span class=\"sy0\">:<\/span> <span class=\"st0\">&quot;1.5E+3&quot;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#93;<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<h2>Small UX Enhancements<\/h2>\n<p>DHTMLX Spreadsheet 6.0 includes a couple of handy usability improvements to toolbar content formatting. Now, it is possible to <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/customization\/#default-controls\" rel=\"noopener\" target=\"_blank\">configure a default font size<\/a> in the toolbar via the corresponding control and <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/customization\/#custom-font-size\" rel=\"noopener\" target=\"_blank\">rearrange the entire list of available fonts by adding custom ones<\/a>. To do the latter, you simply replace the default fonts with your own values, which will be shown in the toolbar\u2019s font-size menu:<\/p>\n<div class=\"codecolorer-container javascript default\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"kw1\">const<\/span> FONT_SIZES <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">8<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">10<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">12<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">14<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">16<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">20<\/span><span class=\"br0\">&#93;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\n<span class=\"kw1\">const<\/span> spreadsheet <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dhx.<span class=\"me1\">Spreadsheet<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;spreadsheet_container&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"co1\">\/\/ configuration options<\/span><br \/>\n<span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nspreadsheet.<span class=\"me1\">toolbar<\/span>.<span class=\"me1\">data<\/span>.<span class=\"me1\">removeAll<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;font-size&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\nspreadsheet.<span class=\"me1\">toolbar<\/span>.<span class=\"me1\">data<\/span>.<span class=\"me1\">add<\/span><span class=\"br0\">&#40;<\/span><br \/>\n&nbsp; &nbsp;FONT_SIZES.<span class=\"me1\">map<\/span><span class=\"br0\">&#40;<\/span>size <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#123;<\/span> value<span class=\"sy0\">:<\/span> size<span class=\"sy0\">,<\/span> id<span class=\"sy0\">:<\/span> `font<span class=\"sy0\">-<\/span>size<span class=\"sy0\">-<\/span>$<span class=\"br0\">&#123;<\/span>size<span class=\"br0\">&#125;<\/span>` <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">-<\/span><span class=\"nu0\">1<\/span><span class=\"sy0\">,<\/span><br \/>\n&nbsp; &nbsp;<span class=\"st0\">&quot;font-size&quot;<\/span><br \/>\n<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<br \/>\nspreadsheet.<span class=\"me1\">parse<\/span><span class=\"br0\">&#40;<\/span>dataset<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/div>\n<p><a href=\"https:\/\/snippet.dhtmlx.com\/tffbf11g?tag=spreadsheet&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">Check the sample ><\/a> <\/p>\n<h2>Improved Developer Experience<\/h2>\n<p>Finally, we want to mention that the Spreadsheet API now supports <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/using_typescript\/#jsdoc-hints\" rel=\"noopener\" target=\"_blank\">JSDoc annotations<\/a>. This addition makes it more convenient to work with the component via IDEs. From now on, you don\u2019t need to leave the code editor to see method descriptions, parameter types, and code snippets. Just hover over the required item, and the extra info will pop up on the display.<\/p>\n<p>This concludes the review of all the novelties included in DHTMLX Spreadsheet 6.0. If needed, you can refresh your memory on this major update and continue exploring it in more detail by visiting the  &#8220;<a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/whats_new\/#version-60\" rel=\"noopener\" target=\"_blank\">What\u2019s New<\/a>&#8221; section. Also, take time to get acquainted with the <a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/migration\/#52---60\" rel=\"noopener\" target=\"_blank\">migration notes to v6.0<\/a>.<\/p>\n<p>Only practice shows the true value of any new feature, so we encourage you to download a <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSpreadsheet\/download.shtml\" rel=\"noopener\" target=\"_blank\">free 30-day trial version<\/a> of DHTMLX Spreadsheet and see how they fit your projects. Current customers can access v6.0 via their <a href=\"https:\/\/dhtmlx.com\/clients\/\" rel=\"noopener\" target=\"_blank\">Client\u2019s Area<\/a>.<\/p>\n<h2>Related Materials<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/whats_new\/#version-60\" rel=\"noopener\" target=\"_blank\">What\u2019s new in v6.0<\/a><\/li>\n<li><a href=\"https:\/\/docs.dhtmlx.com\/spreadsheet\/\" rel=\"noopener\" target=\"_blank\">DHTMLX Spreadsheet documentation<\/a><\/li>\n<li><a href=\"https:\/\/snippet.dhtmlx.com\/atl9gd4h?tag=spreadsheet&#038;mode=wide\" rel=\"noopener\" target=\"_blank\">DHTMLX Spreadsheet samples<\/a><\/li>\n<li><a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxSpreadsheet\/download.shtml\" rel=\"noopener\" target=\"_blank\">Free 30-day trial version<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Today, we are delighted to announce the highly anticipated release of DHTMLX Spreadsheet 6.0. In this iteration, we take a major step toward modern React development workflows by introducing &#8230;<\/p>\n","protected":false},"author":101014,"featured_media":15541,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[70],"tags":[33,56,34],"class_list":["post-15536","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-releases","tag-all-posts","tag-react","tag-spreadsheet"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15536","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/101014"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=15536"}],"version-history":[{"count":8,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15536\/revisions"}],"predecessor-version":[{"id":15550,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/15536\/revisions\/15550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/15541"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=15536"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=15536"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=15536"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}