M365Con 2027 – free online conference · 11–22 Jan 2027 · 120 sessions→ m365con.net

2025-08-05

Build Office Add-Ins for Excel and Word Without VBA

Build Office Add-Ins for Excel and Word Without VBA
Stop Copy-Paste: Build Excel & Word Superpowers with Office Add-ins (No VBA Required) Office Add-ins aren’t mystic plugins—they’re just modular web apps (HTML/CSS/JS) that run inside Word and Excel. In this episode, we demystify task panes, content add-ins, and the XML manifest that tells Office…

Office Add-ins: Turn Web Skills into Excel & Word Superpowers (Without VBA)

TL;DR

Office Add-ins are web apps that run inside Office. A small XML manifest controls where they appear; the Office JavaScript API lets your code read/write documents safely. Build once, run on Windows, Mac, and Office for the web, and ship updates like any modern web app.


What They Are (and Aren’t)

  • Are: HTML/CSS/JS (or React/Angular/Vue) hosted on your web server, rendered in Office as task panes, content add-ins, or commands.

  • Aren’t: COM/VSTO binaries, machine installers, or OS-tied plugins. Updates ship by redeploying your web app.


The Three Core Pieces

  1. Manifest (XML): The blueprint—placement (ribbon/commands), scope (Word/Excel), permissions, and SourceLocation URLs.

  2. Web App: Your UI + logic, any front-end stack, talks to your APIs.

  3. Office JS API: The bridge to workbook/document data (async, scoped through Office/Excel/Word objects).


Minimal Manifest (copy/paste starter)

<?xml version="1.0" encoding="UTF-8"?> <OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="TaskPaneApp" Version="1.0.0.0" Id="00000000-0000-0000-0000-000000000001" ProviderName="Contoso" DefaultLocale="en-US" DisplayName DefaultValue="Contoso Reports"> <Hosts> <Host Name="Workbook"/> <Host Name="Document"/> </Hosts> <DefaultSettings> <SourceLocation DefaultValue="https://yourdomain.com/addin/index.html"/> </DefaultSettings> <Permissions>ReadWriteDocument</Permissions> <VersionOverrides xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" xsi:type="VersionOverridesV1_0"> <Hosts> <Host xsi:type="Workbook"> <Ribbons> <Ribbon> <Tabs> <Tab id="Contoso.Tab" label="Contoso"> <Group id="Contoso.Group" label="Reports"> <Control id="Contoso.OpenPane" label="Open" type="Button" superTip="Open Contoso task pane" onAction="ContosoAction.OpenPane" /> </Group> </Tab> </Tabs> </Ribbon> </Ribbons> <Actions> <FunctionFile resid="Contoso.FunctionFile.Url"/> <Function Name="ContosoAction.OpenPane" /> </Actions> </Host> </Hosts> <Resources> <bt:Urls xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0"> <bt:Url id="Contoso.FunctionFile.Url" DefaultValue="https://yourdomain.com/addin/functions.html"/> </bt:Urls> </Resources> </VersionOverrides> </OfficeApp>

Swap SourceLocation + URLs for your host. Keep Permissions minimal (e.g., ReadDocument until you truly need write).


Minimal Excel Code (Office.js)

// index.html includes: <script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js"></script> Office.onReady(() => { // Wire UI events, then… }); async function writeMarkup() { await Excel.run(async (context) => { const sheet = context.workbook.worksheets.getActiveWorksheet(); const range = sheet.getRange("A1:B2"); range.values = [["Product", "Revenue"], ["Widgets", 125000]]; range.format.autofitColumns(); await context.sync(); }); } async function readSelection() { await Excel.run(async (context) => { const range = context.workbook.getSelectedRange(); range.load("values,address"); await context.sync(); console.log("Selected:", range.address, range.values); }); }

Key rules

  • Use Excel.run(ctx => { …; return ctx.sync(); }) to batch + apply.

  • Load first (range.load("props")), await context.sync(), then read.

  • Everything is async—chain operations instead of imperative DOM-style edits.


Task Pane vs Content Add-ins

  • Task Pane: Side panel UI; best for tools, lookups, data ops, automations.

  • Content Add-in: Renders within the doc/sheet (e.g., embedded visual, map, KPI tile).

  • Commands: Ribbon buttons that open panes or run JS functions.


Deployment Paths

  • Centralized deployment (Admin Center): Assign by user/group/tenant.

  • Share a network/URL manifest: Side-load for dev/test.

  • AppSource: Public marketplace (branding/compliance needed).


Security & Governance Tips

  • Principle of least privilege in <Permissions>.

  • CORS, CSP, and HTTPS for all assets.

  • Don’t store tokens in localStorage; prefer session + short-lived tokens.

  • If using SSO, wire Office SSO (with Entra app) or fall back to PKCE/OAuth.

  • Log actions (non-PII) for supportability; respect tenant DLP.


Power Platform Tie-ins (bonus superpowers)

  • Trigger Power Automate flows from your pane (e.g., “Submit to Finance”).

  • Embed Power BI tiles/reports in the task pane.

  • Use Graph for M365 data (mail, files) where appropriate.


Common Pitfalls (and fixes)

  • Nothing appears in the ribbon: Manifest IDs/locations wrong or wrong host (e.g., Word-only on Excel).

  • Code “does nothing”: Missing Excel.run or await context.sync().

  • Auth breaks on Mac/Web: Ensure cross-origin, SSO, and popup flows are allowed; test all hosts.

  • Permissions errors: Requested capability not in manifest (e.g., write without ReadWriteDocument).


Starter File Layout

/addin /public index.html functions.html styles.css /src app.js excel-actions.js manifest.xml

Build It This Week: 5-Step Checklist

  1. Scaffold: Create index.html, include office.js, and render a simple UI.

  2. Wire Excel: Add one read (selection) and one write (A1:B2) operation via Excel.run.

  3. Manifest: Point SourceLocation to your index.html; set ReadDocument first.

  4. Side-load: Dev install (Office on web or desktop) and verify the ribbon button + pane.

  5. Harden: Add error handling, reduce permissions, test on Mac + web, then plan central deployment.


FAQ

Q: Do I need VBA or VSTO experience?
No—modern add-ins are pure web apps with Office JS. Web dev skills transfer directly.

Q: Can one codebase run everywhere?
Yes—Windows, Mac, and Office for the web (validate features by host and requirement sets).

Q: How do updates roll out?
Deploy a new web build; clients get it on next load. Update the manifest only for new commands/permissions.


Conclusion

Office Add-ins are the cleanest way to turn web skills into real Excel/Word automation—portable, governable, and fast to ship. Master the manifest, respect the async Office JS flow, and you’ll retire a mountain of manual reporting (and a lot of copy-paste).

YouTube

Host: Mirko Peters

Related articles

← Stop SharePoint Fine-Grained Permission SprawlMaintain Hybrid Exchange Beyond the Configuration Wizard →