{"id":1955,"date":"2025-05-07T14:07:43","date_gmt":"2025-05-07T14:07:43","guid":{"rendered":"https:\/\/www.pyxll.com\/blog\/?p=1955"},"modified":"2025-05-11T11:54:59","modified_gmt":"2025-05-11T11:54:59","slug":"plotly-dash-apps-in-excel","status":"publish","type":"post","link":"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/","title":{"rendered":"How to Embed Plotly Dash Python Apps in Excel"},"content":{"rendered":"\n<p>Excel is where many business decisions get made. But when it comes to creating rich, interactive dashboards or data-driven applications, Python tools like Plotly Dash offer flexibility and power that Excel alone can\u2019t match.<\/p>\n\n\n\n<p>Plotly Dash is a Python framework for building interactive web apps and dashboards using just Python\u2014no JavaScript required. It\u2019s popular among data scientists and analysts for building custom, shareable apps that let users explore data visually in a web browser. But, when it comes down to it, users will always prefer to work in Excel.<\/p>\n\n\n\n<p>That\u2019s where PyXLL comes in.<\/p>\n\n\n\n<p>PyXLL is a Python add-in for Excel that bridges the gap between Python and spreadsheets. And with its support for embedding web apps directly into Excel workbooks, you can now run Plotly Dash apps inside Excel, just like any other part of your spreadsheet.<\/p>\n\n\n\n<p>In this article, you&#8217;ll learn:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What Plotly Dash is and why it&#8217;s useful<\/li>\n\n\n\n<li>How to build a simple Dash app<\/li>\n\n\n\n<li>How to embed that app into Excel using PyXLL, so your team can use it without ever leaving Excel.<\/li>\n<\/ul>\n\n\n\n<p>By the end, you&#8217;ll have a powerful way to deliver interactive dashboards to Excel users\u2014no web servers, no deployment headaches, just Python and Excel working together.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69f2d43e02520\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69f2d43e02520\"  aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Why_Embed_Dash_Apps_in_Excel\" >Why Embed Dash Apps in Excel?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%E2%9C%85_Workflows_Stay_in_Excel\" >\u2705 Workflows Stay in Excel<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%E2%9C%85_Share_Python-Powered_Insights\" >\u2705 Share Python-Powered Insights<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%E2%9C%85_Live_Interactive_Visualizations\" >\u2705 Live, Interactive Visualizations<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Bonus_Use_Case_Ideas\" >Bonus: Use Case Ideas<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Tools_Youll_Need_to_Embed_Dash_in_Excel\" >Tools You\u2019ll Need to Embed Dash in Excel<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%F0%9F%A7%A9_1_Python\" >\ud83e\udde9 1. Python<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%F0%9F%93%8A_2_Plotly_Dash\" >\ud83d\udcca 2. Plotly Dash<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%F0%9F%A7%AC_3_PyXLL\" >\ud83e\uddec 3. PyXLL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%F0%9F%93%88_4_PyXLL-Dash_Extension_Package\" >\ud83d\udcc8 4. PyXLL-Dash Extension Package<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Step-by-Step_Guide_Embed_a_Dash_App_in_Excel_Using_PyXLL\" >Step-by-Step Guide: Embed a Dash App in Excel Using PyXLL<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%F0%9F%94%A7_Step_1_Create_a_Simple_Dash_App\" >\ud83d\udd27 Step 1: Create a Simple Dash App<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#%F0%9F%A7%A9_Step_2_Embed_the_Dash_App_in_Excel_with_PyXLL\" >\ud83e\udde9 Step 2: Embed the Dash App in Excel with PyXLL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Step_3_Passing_Data_From_Excel_to_Dash\" >Step 3: Passing Data From Excel to Dash<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Step_4_Passing_Data_From_Dash_to_Excel\" >Step 4: Passing Data From Dash to Excel<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Next_Steps\" >Next Steps<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#What_to_Build_Next\" >What to Build Next<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/#Try_It_Yourself\" >Try It Yourself<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\" id=\"h-why-embed-dash-apps-in-excel\"><span class=\"ez-toc-section\" id=\"Why_Embed_Dash_Apps_in_Excel\"><\/span>Why Embed Dash Apps in Excel?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>If you already use Excel, you know its strengths: it&#8217;s flexible, familiar, and everywhere. But when it comes to interactive visualizations, advanced analytics, or custom UI components, Excel can fall short. That&#8217;s where Plotly Dash shines.<\/p>\n\n\n\n<p>So why not use both?<\/p>\n\n\n\n<p>Embedding a Dash app inside Excel combines the best of both worlds:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Excel&#8217;s accessibility and ubiquity<\/strong><\/li>\n\n\n\n<li><strong>Dash\u2019s ability to create rich, interactive Python dashboards<\/strong><\/li>\n<\/ul>\n\n\n\n<p>Here are some of the key benefits of integrating the two:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E2%9C%85_Workflows_Stay_in_Excel\"><\/span>\u2705 Workflows Stay in Excel<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Most business users live in Excel. Embedding your Dash app means you don\u2019t have to ask them to open a browser, run a server, or install Python\u2014<strong>they can interact with your app directly in the spreadsheet they already use<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-share-python-powered-insights\"><span class=\"ez-toc-section\" id=\"%E2%9C%85_Share_Python-Powered_Insights\"><\/span>\u2705 Share Python-Powered Insights<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Dash apps let you create custom UI around your Python models and data. With PyXLL, you can deliver those apps in a user-friendly interface <strong>without requiring any Python knowledge<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E2%9C%85_Live_Interactive_Visualizations\"><\/span>\u2705 Live, Interactive Visualizations<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Unlike static Excel charts, Dash apps can respond in real time to user input. Want to update a chart based on values in a cell? Want a dropdown that filters a dataset or runs a model? Dash makes it easy\u2014PyXLL makes it available in Excel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Bonus_Use_Case_Ideas\"><\/span>Bonus: Use Case Ideas<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Financial modeling with interactive scenario controls<\/li>\n\n\n\n<li>Real-time dashboards that respond to Excel cell changes<\/li>\n\n\n\n<li>Custom data exploration tools for business users<\/li>\n\n\n\n<li>Machine learning models with human-friendly interfaces<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Tools_Youll_Need_to_Embed_Dash_in_Excel\"><\/span>Tools You\u2019ll Need to Embed Dash in Excel<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Before we dive into building and embedding a Dash app, let\u2019s go over the tools you\u2019ll need. The good news: everything is based on Python and Excel, with no complex deployment setup required.<\/p>\n\n\n\n<p>Here\u2019s what you\u2019ll need:<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%A7%A9_1_Python\"><\/span>\ud83e\udde9 1. Python<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>If you&#8217;re reading this, you&#8217;re probably already using Python. Any recent version (3.7+) will work. You can install the required packages via pip.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Tip:<\/strong> Use a virtual environment (like <code>venv<\/code> or <code>conda<\/code>) to keep things clean.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%93%8A_2_Plotly_Dash\"><\/span>\ud83d\udcca 2. Plotly Dash<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><a href=\"https:\/\/dash.plotly.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Dash<\/a> is a Python framework for building interactive web applications. It\u2019s built on top of Plotly.js, React, and Flask\u2014but all of that complexity is abstracted away. You build the UI and the logic in pure Python.<\/p>\n\n\n\n<p>Install it with:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pip <code>install dash<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-3-pyxll\"><span class=\"ez-toc-section\" id=\"%F0%9F%A7%AC_3_PyXLL\"><\/span>\ud83e\uddec 3. PyXLL<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p><a href=\"https:\/\/www.pyxll.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">PyXLL<\/a> is a commercial Excel add-in that lets you write Excel worksheet functions, macros, menus, and ribbon UI in Python. Most importantly for this tutorial, it supports embedding <strong>web content<\/strong> (like Dash apps) inside Excel workbooks.<\/p>\n\n\n\n<p>To use it, you\u2019ll need:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A valid PyXLL installation<\/li>\n\n\n\n<li>A license (a free trial is available)<\/li>\n<\/ul>\n\n\n\n<p>Install the Python package via pip:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>pip install pyxll<\/code><\/pre>\n\n\n\n<p>And then install the PyXLL Excel add-in using the &#8220;pyxll install&#8221; script:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>pyxll install<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Note:<\/strong> If you&#8217;re new to PyXLL, there\u2019s a full <a href=\"https:\/\/www.pyxll.com\/docs\/userguide\/installation\/firsttime.html\" target=\"_blank\" rel=\"noreferrer noopener\">getting started guide here<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-4-pyxll-dash-extension-package\"><span class=\"ez-toc-section\" id=\"%F0%9F%93%88_4_PyXLL-Dash_Extension_Package\"><\/span>\ud83d\udcc8 4. PyXLL-Dash Extension Package<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>The &#8220;pyxll-dash&#8221; extension package adds Dash support to PyXLL. Install it using pip:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>pip install p<\/code>yxll-dash<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-step-by-step-guide-embed-a-dash-app-in-excel-using-pyxll\"><span class=\"ez-toc-section\" id=\"Step-by-Step_Guide_Embed_a_Dash_App_in_Excel_Using_PyXLL\"><\/span>Step-by-Step Guide: Embed a Dash App in Excel Using PyXLL<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Now that you\u2019ve got the tools installed, let\u2019s walk through how to create a simple Dash app and embed it into Excel. We\u2019ll keep things simple to start\u2014just a basic interactive chart\u2014and then we\u2019ll get it running inside Excel using PyXLL.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"1\" data-enlighter-title=\"\" data-enlighter-group=\"\">from dash import Dash, html, dcc, callback, Output, Input\nimport plotly.express as px\nimport pandas as pd\n\ndf = pd.read_csv('https:\/\/raw.githubusercontent.com\/plotly\/datasets\/master\/gapminder_unfiltered.csv')\n\napp = Dash()\n\n# Requires Dash 2.17.0 or later\napp.layout = [\n    html.H1(children='Title of Dash App', style={'textAlign':'center'}),\n    dcc.Dropdown(df.country.unique(), 'Canada', id='dropdown-selection'),\n    dcc.Graph(id='graph-content')\n]\n\n@app.callback(\n    Output('graph-content', 'figure'),\n    Input('dropdown-selection', 'value')\n)\ndef update_graph(value):\n    dff = df[df.country==value]\n    return px.line(dff, x='year', y='pop')\n\nif __name__ == '__main__':\n    app.run(debug=True)<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%94%A7_Step_1_Create_a_Simple_Dash_App\"><\/span>\ud83d\udd27 Step 1: Create a Simple Dash App<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Start by creating a basic Dash app. Save this in a Python file, for example dash_demo_<code>app.py<\/code>:<\/p>\n\n\n\n<p>You can run this app like any standard Dash app:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>python dash_demo_<code>app<\/code>.py<\/code><\/pre>\n\n\n\n<p>It should launch in your browser at <code>http:\/\/127.0.0.1:8050\/<\/code>. This is what we\u2019ll embed into Excel.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image.png\"><img decoding=\"async\" width=\"1024\" height=\"934\" data-attachment-id=\"1966\" data-permalink=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/image-34\/\" data-orig-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image.png\" data-orig-size=\"1060,967\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1024x934.png\" src=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1024x934.png\" alt=\"\" class=\"wp-image-1966\" srcset=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1024x934.png 1024w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-300x274.png 300w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-768x701.png 768w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image.png 1060w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%F0%9F%A7%A9_Step_2_Embed_the_Dash_App_in_Excel_with_PyXLL\"><\/span>\ud83e\udde9 Step 2: Embed the Dash App in Excel with PyXLL<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>With PyXLL and the &#8220;pyxll-dash&#8221; package, embedding a dash app is as simple as calling an Excel worksheet function.<\/p>\n\n\n\n<p>In our dash_demo_app.py Python module we do the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Refactor the code into a function called &#8220;dash_app&#8221;<\/li>\n\n\n\n<li>Add the &#8220;pyxll.xl_func&#8221; decorator to the dash_app function<\/li>\n\n\n\n<li>Call &#8220;pyxll.plot(app)&#8221; to show the app in Excel.<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"1,7,30\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"1\" data-enlighter-title=\"\" data-enlighter-group=\"\">from pyxll import xl_func, plot\nfrom dash import Dash, html, dcc, callback, Output, Input\nimport plotly.express as px\nimport pandas as pd\n\n\n@xl_func\ndef dash_app():\n\n    df = pd.read_csv('https:\/\/raw.githubusercontent.com\/plotly\/datasets\/master\/gapminder_unfiltered.csv')\n\n    app = Dash()\n\n    app.layout = [\n        html.H1(children='Title of Dash App', style={'textAlign':'center'}),\n        dcc.Dropdown(df.country.unique(), 'Canada', id='dropdown-selection'),\n        dcc.Graph(id='graph-content')\n    ]\n\n    @app.callback(\n        Output('graph-content', 'figure'),\n        Input('dropdown-selection', 'value')\n    )\n    def update_graph(value):\n        dff = df[df.country==value]\n        return px.line(dff, x='year', y='pop')\n    \n    # Show the dash app in Excel using PyXLL's plot function.\n    # This requires the \"pyxll-dash\" package to be installed.\n    plot(app)\n\n    return app<\/pre>\n\n\n\n<p>To tell PyXLL to load this module, update your pyxll.cfg config file and add your &#8220;dash_demo_app&#8221; module to the &#8220;modules&#8221; list, and update the &#8220;pythonpath&#8221; to include the folder where you saved it.<\/p>\n\n\n\n<p>Now go into Excel, type the following into a cell or use the function from the function wizard:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>=dash_app()<\/code><\/pre>\n\n\n\n<p>This opens a embedded browser window directly inside Excel, showing your live Dash app.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1.png\"><img decoding=\"async\" width=\"1024\" height=\"851\" data-attachment-id=\"1980\" data-permalink=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/image-35\/\" data-orig-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1.png\" data-orig-size=\"1684,1399\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1-1024x851.png\" src=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1-1024x851.png\" alt=\"\" class=\"wp-image-1980\" srcset=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1-1024x851.png 1024w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1-300x249.png 300w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1-768x638.png 768w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1-1536x1276.png 1536w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-1.png 1684w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">\u2705 What You Should See<\/h4>\n\n\n\n<p>Once everything is in place:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Excel displays a live, interactive Plotly Dash app inside a worksheet.<\/li>\n\n\n\n<li>Users can interact with charts and controls like they would on a web dashboard.<\/li>\n\n\n\n<li>The app updates in real time, just as if it were hosted in a browser.<\/li>\n<\/ul>\n\n\n\n<p><strong>Tip:<\/strong> To move or resize the web control, enter &#8220;Design Mode&#8221; in the &#8220;Developer&#8221; tab in Excel. Once you&#8217;ve finished, exit out of Design Mode to bring back the fully responsive, interactive, control. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-3-passing-data-from-excel-to-dash\"><span class=\"ez-toc-section\" id=\"Step_3_Passing_Data_From_Excel_to_Dash\"><\/span>Step 3: Passing Data From Excel to Dash<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In our &#8220;dash_app&#8221; we&#8217;re loading a CSV file from github. More commonly we will want to populate our dash apps using data from Excel.<\/p>\n\n\n\n<p>To do that we pass in a DataFrame of value as an argument to our function, so our &#8220;dash_app&#8221; function becomes:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"1\" data-enlighter-title=\"\" data-enlighter-group=\"\">@xl_func\ndef dash_app(df: pd.DataFrame):\n    app = Dash()\n\n    app.layout = [\n        html.H1(children='Title of Dash App', style={'textAlign':'center'}),\n        dcc.Dropdown(df.country.unique(), 'Canada', id='dropdown-selection'),\n        dcc.Graph(id='graph-content')\n    ]\n\n    @app.callback(\n        Output('graph-content', 'figure'),\n        Input('dropdown-selection', 'value')\n    )\n    def update_graph(value):\n        dff = df[df.country==value]\n        return px.line(dff, x='year', y='pop')\n    \n    # Show the dash app in Excel using PyXLL's plot function.\n    # This requires the \"pyxll-dash\" package to be installed.\n    plot(app)\n\n    return app<\/pre>\n\n\n\n<p>Let&#8217;s also add a new function to load the same data, so we can test this out:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"1\" data-enlighter-title=\"\" data-enlighter-group=\"\">@xl_func\ndef load_data() -> pd.DataFrame:\n    df = pd.read_csv('https:\/\/raw.githubusercontent.com\/plotly\/datasets\/master\/gapminder_unfiltered.csv')\n    return df<\/pre>\n\n\n\n<p>Note that in both of the functions above I am using Python type annotations to tell PyXLL what types to use when converting the Excel values.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2.png\"><img decoding=\"async\" width=\"1024\" height=\"783\" data-attachment-id=\"1981\" data-permalink=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/image-36\/\" data-orig-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2.png\" data-orig-size=\"1968,1504\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2-1024x783.png\" src=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2-1024x783.png\" alt=\"\" class=\"wp-image-1981\" srcset=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2-1024x783.png 1024w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2-300x229.png 300w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2-768x587.png 768w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2-1536x1174.png 1536w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-2.png 1968w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-step-4-passing-data-from-dash-to-excel\"><span class=\"ez-toc-section\" id=\"Step_4_Passing_Data_From_Dash_to_Excel\"><\/span>Step 4: Passing Data From Dash to Excel<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>We can make use of Dash&#8217;s callbacks to write data to Excel from Dash. In our &#8220;dash_app&#8221; function we have a callback that gets called when the country selection is changed, but how would we write that country back to Excel so that it can be used elsewhere in the sheet?<\/p>\n\n\n\n<p><a href=\"https:\/\/www.pyxll.com\/docs\/userguide\/vba.html\" target=\"_blank\" rel=\"noreferrer noopener\">PyXLL&#8217;s &#8220;xl_app&#8221; function<\/a> is used to get the Excel Application object. That Excel Application object is the same as the Application object in VBA and can be used to script Excel in the same way as VBA. We&#8217;ll use that to write the selected country to a cell.<\/p>\n\n\n\n<p><strong>Important: <\/strong>When using the Excel Application object we have to be careful. Calling it from outside of an Excel macro function or where Excel is not expecting it to be called (e.g. a background thread) is a common cause of Excel crashes! To avoid that, PyXLL has a function &#8220;schedule_call&#8221; that will schedule a Python function in a way that makes it safe to call into Excel.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"1\" data-enlighter-title=\"\" data-enlighter-group=\"\">from pyxll import xl_app, xl_func, plot, schedule_call\n\ndef update_cell(address, value):\n    # Get the Range we're going to update\n    xl = xl_app()\n    cell = xl.Range(address)\n\n    # Update the cell value\n    cell.Value = value\n\n\n@xl_func\ndef dash_app(df: pd.DataFrame):\n    app = Dash()\n\n    app.layout = [\n        html.H1(children='Title of Dash App', style={'textAlign':'center'}),\n        dcc.Dropdown(df.country.unique(), 'Canada', id='dropdown-selection'),\n        dcc.Graph(id='graph-content')\n    ]\n\n    @app.callback(\n        Output('graph-content', 'figure'),\n        Input('dropdown-selection', 'value')\n    )\n    def update_graph(value):\n        # Update the value of \"J2\" in Excel\n        schedule_call(update_cell, \"J2\", value)\n\n        dff = df[df.country==value]\n        return px.line(dff, x='year', y='pop')\n    \n    # Show the dash app in Excel using PyXLL's plot function.\n    # This requires the \"pyxll-dash\" package to be installed.\n    plot(app)\n\n    return app<\/pre>\n\n\n\n<p>Now when we update the selected country, the value in cell J2 updates:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3.png\"><img decoding=\"async\" width=\"1024\" height=\"783\" data-attachment-id=\"1984\" data-permalink=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/image-37\/\" data-orig-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3.png\" data-orig-size=\"1968,1504\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3-1024x783.png\" src=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3-1024x783.png\" alt=\"\" class=\"wp-image-1984\" srcset=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3-1024x783.png 1024w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3-300x229.png 300w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3-768x587.png 768w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3-1536x1174.png 1536w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-3.png 1968w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>It&#8217;s not ideal to hard-code a cell reference like this into our Python code. Instead, a better solution is to <a href=\"https:\/\/www.pyxll.com\/docs\/userguide\/udfs\/argtypes.html#standard-types\" target=\"_blank\" rel=\"noreferrer noopener\">pass a &#8220;range&#8221; object<\/a> in to our Python function and then update the value in that range.<\/p>\n\n\n\n<p>We have to be careful though as our function will be re-calculated each time any input to it changes. If we update the range passed to it from our callback, that will trigger the function to be called again. That can lead to an infinite loop where our function updates the cell, which calls the function, which updates the cell and so on &#8211; this would result in Excel becoming unresponsive!<\/p>\n\n\n\n<p>To avoid that, rather than simply setting the value, we check to see if the value is already set to the correct value and don&#8217;t update it if it is. That will break the cycle and ensure that our function doesn&#8217;t constantly recalculate.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"1\" data-enlighter-title=\"\" data-enlighter-group=\"\">from pyxll import xl_app, xl_func, plot, schedule_call\n\ndef update_cell(cell, value):\n    # Update the cell value, but only if needed to avoid an infinite loop\n    if cell.Value != value:\n        cell.Value = value\n\n\n@xl_func(\"dataframe df, range country_cell: var\")\ndef dash_app(df, country_cell):\n    app = Dash()\n\n    initial_value = country_cell.Value\n\n    app.layout = [\n        html.H1(children='Title of Dash App', style={'textAlign':'center'}),\n        dcc.Dropdown(df.country.unique(), initial_value, id='dropdown-selection'),\n        dcc.Graph(id='graph-content')\n    ]\n\n    @app.callback(\n        Output('graph-content', 'figure'),\n        Input('dropdown-selection', 'value')\n    )\n    def update_graph(value):\n        # Update the country cell in Excel\n        schedule_call(update_cell, country_cell, value)\n\n        dff = df[df.country==value]\n        return px.line(dff, x='year', y='pop')\n    \n    # Show the dash app in Excel using PyXLL's plot function.\n    # This requires the \"pyxll-dash\" package to be installed.\n    plot(app)\n\n    return app<\/pre>\n\n\n\n<p>Now, in Excel, update the function call and pass in the cell to write the selected country to as the second argument:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4.png\"><img decoding=\"async\" width=\"1024\" height=\"783\" data-attachment-id=\"1985\" data-permalink=\"https:\/\/www.pyxll.com\/blog\/plotly-dash-apps-in-excel\/image-38\/\" data-orig-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4.png\" data-orig-size=\"1968,1504\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4-1024x783.png\" src=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4-1024x783.png\" alt=\"\" class=\"wp-image-1985\" srcset=\"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4-1024x783.png 1024w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4-300x229.png 300w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4-768x587.png 768w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4-1536x1174.png 1536w, https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4.png 1968w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>With this change, every time the country is changed in the dash app it updates in Excel, and every time it changes in Excel the dash app updates!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-next-steps\"><span class=\"ez-toc-section\" id=\"Next_Steps\"><\/span>Next Steps<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Combining Plotly Dash with Excel using PyXLL opens up powerful new possibilities: you get the flexibility and interactivity of web-based dashboards, without asking your users to leave the comfort of their spreadsheets.<\/p>\n\n\n\n<p>In this post, you learned how to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Build a simple Plotly Dash app using Python,<\/li>\n\n\n\n<li>Embed that app inside Excel using PyXLL and the <code>pyxll-dash<\/code> package<\/li>\n\n\n\n<li>Connect the app to live Excel data for dynamic, real-time updates<\/li>\n\n\n\n<li>Update Excel in response to user interaction with your app<\/li>\n<\/ul>\n\n\n\n<p>This workflow is ideal for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Analysts who want to create rich visualizations without switching tools,<\/li>\n\n\n\n<li>Data scientists who need to share Python models or results with Excel users,<\/li>\n\n\n\n<li>Teams who want to modernize dashboards while keeping everything in Excel.<\/li>\n<\/ul>\n\n\n\n<p>If you&#8217;re interested in how the &#8220;pyxll-dash&#8221; package works, or if you want to embed other types of web apps, you can find the source code for this package on github here <a href=\"https:\/\/github.com\/pyxll\/pyxll-dash\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/pyxll\/pyxll-dash<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_to_Build_Next\"><\/span>What to Build Next<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Here are a few ideas for extending what you\u2019ve learned:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add dropdowns and sliders in Dash to control Excel-based simulations<\/li>\n\n\n\n<li>Create a financial model front-end with real-time charts and toggles<\/li>\n\n\n\n<li>Build a dashboard that pulls data from external APIs and displays it in Excel<\/li>\n\n\n\n<li>Use Dash DataTables to show large datasets and filter them interactively<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Try_It_Yourself\"><\/span>Try It Yourself<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Want to give it a try?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.pyxll.com\/docs\/userguide\/installation\/firsttime.html\">Try PyXLL for yourself with a free trial<\/a><\/li>\n\n\n\n<li>Check out some of the sample Dash apps from the <a href=\"https:\/\/dash.plotly.com\/\">Dash documentation<\/a><\/li>\n\n\n\n<li>Embed it into Excel and start customizing it for your team\u2019s workflow<\/li>\n<\/ul>\n\n\n\n<p>With just a bit of Python and PyXLL, you can bring modern, interactive analytics right into the tool your team already knows.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>If you found this guide helpful, consider sharing it or subscribing for more tutorials like this. And if you build something cool with PyXLL and Dash, <a href=\"https:\/\/www.pyxll.com\/contact.html\" target=\"_blank\" rel=\"noreferrer noopener\">we\u2019d love to see it<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Excel is where many business decisions get made. But when it comes to creating rich, interactive dashboards or data-driven applications, Python tools like Plotly Dash offer flexibility and power that Excel alone can\u2019t match. Plotly Dash is a Python framework for building interactive web apps and dashboards using just Python\u2014no JavaScript required. It\u2019s popular among<\/p>\n","protected":false},"author":1,"featured_media":1985,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[12,2,272],"tags":[673,671,651,665,3,674],"class_list":["post-1955","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python","category-pyxll","category-visualization","tag-dash","tag-dataviz","tag-plotly","tag-plotting","tag-python","tag-webcontrol"],"acf":[],"jetpack_featured_media_url":"https:\/\/www.pyxll.com\/blog\/wp-content\/uploads\/2025\/05\/image-4.png","jetpack_shortlink":"https:\/\/wp.me\/p7l3LP-vx","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/posts\/1955","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/comments?post=1955"}],"version-history":[{"count":1,"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/posts\/1955\/revisions"}],"predecessor-version":[{"id":1993,"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/posts\/1955\/revisions\/1993"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/media\/1985"}],"wp:attachment":[{"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/media?parent=1955"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/categories?post=1955"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pyxll.com\/blog\/wp-json\/wp\/v2\/tags?post=1955"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}