Most Excel trainers tell you Excel 'supports Python' — like it’s built-in, like pressing Alt+F11 opens a Jupyter notebook. It doesn’t. Not even close. Excel has zero native Python interpreter. If someone says 'Excel supports Python', they’re either conflating add-ins with core functionality or haven’t tried running import pandas in a cell. Let’s fix that.
Quick Answer
No — Excel does not support Python out of the box. But starting with Microsoft 365 (version 2308+), you *can* run Python scripts inside Excel via the Python in Excel preview feature — provided you have the right license, region, and admin permissions. It’s not VBA 2.0; it’s a tightly sandboxed, cloud-connected runtime with strict limits on libraries, execution time, and data size.
All the Methods
| Method | Steps | Best For | Limitations |
|---|---|---|---|
| Python in Excel (Microsoft 365) | Enable preview → Insert → Python → write code in cell (e.g., =PYTHON("import numpy as np; np.array([1,2,3])")) | Quick calculations, lightweight data transforms, users who can’t install software | No file I/O, no custom packages, max 10s runtime, only available to E3/E5 tenants in US/UK/AU/NZ |
| xlwings (Desktop Excel + Python) | Install xlwings → run xlwings quickstart MyBook → edit MyBook.py → press Alt+F8 → RunPython | Full Python access, local libraries (pandas, matplotlib), two-way Excel ↔ Python data sync | Requires Python installed locally, won’t work on Mac Excel Online, needs macro security adjusted |
| PyXLL | Download installer → activate license → restart Excel → use =my_function(A1:B10) like native formulas | Enterprise teams needing high-performance UDFs, Excel-native UX, audit trails | Commercial license required ($995/year), no free tier, Windows-only |
| Power Query + Python (via Azure Data Factory or Power BI) | Write Python in Power BI Desktop → publish → connect Excel to dataset → refresh | Teams already using Power BI, need reproducible ETL, don’t want desktop Python installs | Not true Excel-embedded Python — just indirect orchestration; latency, no interactivity |
| Custom COM Add-in (Advanced) | Build Python COM server → register → expose methods → call from VBA with CreateObject("MyPython.AddIn") | Legacy Windows deployments, air-gapped environments, deep integration with existing VBA | High dev overhead, fragile, breaks on Excel updates, requires admin rights |
Method 1 Deep Dive
Let’s walk through Python in Excel — the one Microsoft officially touts. First, check your version: go to File → Account → About Excel. You need Microsoft 365 Apps version 2308 or later. Then ask your IT admin if Python in Excel is enabled for your tenant. (Trust me, I learned this the hard way — spent two days debugging syntax before realizing our EU tenant wasn’t whitelisted.)
Once enabled: click Insert → Python. A new cell appears with =PYTHON(""). Type this inside the quotes:
import pandas as pd
df = pd.DataFrame({"Salesperson": ["Sarah Chen", "Diego Mora", "Amina Patel"],
"Q1_Sales": [42500, 38900, 51200],
"Region": ["APAC", "EMEA", "AMER"]})
df["Q1_Sales"].mean()
Press Enter. Cell returns 44200.0. That’s it. No setup, no install. But note: you can’t load df into a range directly — you’d need =PY(…) with structured output, or wrap in list(df.values). Also, pd.read_csv() fails — no file system access. So if your data lives in C:\Reports\sales.csv, this method won’t help.
Here’s the counterintuitive part: Python in Excel works *faster* on small arrays than native Excel formulas — especially with complex logic. Try =PYTHON("import numpy as np; np.where(np.array([1,2,3,4]) % 2 == 0, 'Even', 'Odd')") in A1:A4 vs writing four nested IFs. You’ll see the difference.
Method 2 Deep Dive
Now let’s go local: xlwings. This is what we use daily for client projects where Python in Excel isn’t available or powerful enough.
Step 1: Install Python (3.9–3.11) and run pip install xlwings. Step 2: Open Excel, press Alt+F11xlwings. Step 3: In Excel, go to Developer → Macros → RunPython.
But better: create a button. Right-click the ribbon → Customize Quick Access Toolbar → Choose Commands → select Run Python. Now you’ve got one-click access.
Try this script — save it as sales_analysis.py in the same folder as your workbook:
import pandas as pd
import xlwings as xw
def analyze_sales():
wb = xw.Book.caller()
sheet = wb.sheets["Data"]
data = sheet.range("A1:C10").options(pd.DataFrame, header=1).value
data['Growth'] = (data['Q1_Sales'] - data['Q4_Sales']) / data['Q4_Sales']
sheet.range("E1").value = data[['Salesperson', 'Growth']] # writes result starting at E1
Your sample data in A1:C10 should look like this:
| Salesperson | Q1_Sales | Q4_Sales |
|---|---|---|
| Sarah Chen | $45,200 | $41,800 |
| Diego Mora | $38,900 | $36,100 |
| Amina Patel | $51,200 | $49,300 |
| James Wu | $29,600 | $27,400 |
| Lena Dubois | $44,100 | $42,500 |
Run analyze_sales() — and watch column E populate with names and growth rates. No copy-paste. No manual refresh. And yes, it works with matplotlib: add plt.savefig('chart.png') and it drops the image in your workbook folder.
Cheat Sheet
| Task | Shortcut / Command | Notes |
|---|---|---|
| Open Python in Excel editor | Insert → Python (ribbon) | Only visible if preview enabled and licensed |
| Run xlwings Python script | Alt+F8 → select function → Run | Or assign to Quick Access Toolbar |
| Read Excel range into pandas | sheet.range("B2:C10").options(pd.DataFrame, header=1).value | Returns DataFrame — not list or array |
| Write DataFrame back to Excel | sheet.range("F1").value = df | Auto-resizes columns if index=False and headers match |
| Check Python in Excel status | File → Options → Add-ins → Manage: COM Add-ins → Go… | Look for 'Python in Excel' — grayed out = disabled by admin |
| Force-refresh Python output | Ctrl+Alt+F9 (full recalc) | Python cells don’t auto-refresh on data change — unlike formulas |