diff --git a/README.md b/README.md index 942c929..da4586b 100644 --- a/README.md +++ b/README.md @@ -7,440 +7,405 @@ [![npm version](https://img.shields.io/npm/v/@microsoft/connected-workbooks)](https://www.npmjs.com/package/@microsoft/connected-workbooks) [![Build Status](https://img.shields.io/github/workflow/status/microsoft/connected-workbooks/CI)](https://github.com/microsoft/connected-workbooks/actions) -**Open your data directly in Excel for the Web with zero installation** - A JavaScript library that converts web tables and data into interactive Excel workbooks with Power Query integration and custom branded templates +**Send your users straight into Excel for the Web — no sign-in, no install, no friction.** + +A JavaScript library that turns any data in your web app into a real Excel workbook and opens it in a new tab in Excel Online — **anonymously**. Your users don't need a Microsoft account. They don't need Excel installed. They don't even need to download a file. They click a button and they're in Excel, ready to slice, sort, pivot, and analyze.
- - Connected Workbooks Demo - Click to watch video -
- 📺 Watch the video tutorial -
-
+ + +📺 Watch the 90-second demo + --- -## ✨ Key Features & Benefits +## 🎯 Why this matters -Transform your web applications with enterprise-grade Excel integration that goes far beyond simple CSV exports. +Every web app that shows data eventually hits the same wall: **users want to take that data into Excel.** -### 🎯 **Interactive Excel Workbooks, Not Static Files** -Convert raw data or HTML tables arrays to Excel tables while preserving data types, ensuring your data maintains its structure and formatting. instead of basic CSV exports that lose all structure and functionality. +Today, the options are all bad: -### 🌐 **Zero-Installation Excel Experience** -Launch workbooks directly in Excel for the Web through any browser without requiring Excel desktop installation, making your data accessible to any user anywhere. No installation required, works on any device. +| Approach | What goes wrong | +|----------|-----------------| +| 📄 **CSV download** | Loses types, formatting, and structure. Now the user is in their Downloads folder hunting for a file. | +| 🔐 **OneDrive / SharePoint upload** | Requires sign-in, tenant permissions, and a Microsoft account your users may not have. | +| 💻 **"Install Excel desktop"** | A non-starter on Mac, Linux, Chromebooks, mobile, or any locked-down enterprise device. | +| 🛠️ **Build it yourself** | Months of work wrestling with OOXML, ZIP packaging, and Microsoft's upload protocols. | -### 🎨 **Corporate Branding & Custom Dashboards** -Inject your data into pre-built Excel templates containing your company branding, PivotTables, charts, and business logic while preserving all formatting and calculations. Use your own branded Excel templates with PivotTables and charts to maintain corporate identity and pre-built analytics. +**Open In Excel removes the wall entirely.** One function call, one new tab, one happy user — already inside Excel for the Web, anonymously. -### 🔄 **Live Data Connections with Power Query** -Create workbooks that automatically refresh from your web APIs, databases, or data sources using Microsoft's Power Query technology, eliminating manual data updates. Create workbooks that refresh data on-demand using Power Query for real-time data updates and automated reporting. +--- -### ⚙️ **Advanced Configuration** -Full control over document properties including title and description for professional document management, allowing you to customize metadata and maintain enterprise standards. +## Open in Excel for the Web — no sign-in required ---- +A minimal end-to-end example: -## 🏢 Where is this library used? +```typescript +import { workbookManager } from '@microsoft/connected-workbooks'; + +const myData = { + config: { + promoteHeaders: true, // First row becomes the header row + adjustColumnNames: true // De-duplicate / sanitize column names + }, + data: [ + ["Region", "Q3 Revenue", "Q4 Revenue", "Growth"], + ["North America", 2_500_000, 2_750_000, "10%"], + ["Europe", 1_800_000, 2_100_000, "17%"], + ["Asia Pacific", 1_200_000, 1_400_000, "17%"], + ["Latin America", 800_000, 950_000, "19%"], + ], +}; -Open In Excel powers data export functionality across Microsoft's enterprise platforms: +const blob = await workbookManager.generateTableWorkbookFromGrid(myData); +await workbookManager.openInExcelWeb(blob, "Q4-Report.xlsx"); +``` -
+When the user triggers this flow, a new browser tab opens directly in Excel for the Web with the generated workbook loaded. No sign-in, no download, and no client-side install are required. The experience is consistent across operating systems and form factors — any modern browser is sufficient. -|Azure Data Explorer|Log Analytics|Datamart|Viva Sales| -|:---:|:---:|:---:|:---:| -|**Azure Data Explorer**|**Log Analytics**|**Datamart**|**Viva Sales**| +### Why anonymous access matters -
+Most existing "open in Excel" integrations assume the end user is signed into a Microsoft 365 account. In practice, this introduces several common failure modes: +- Users without a Microsoft 365 account cannot complete the flow. +- Enterprise users frequently encounter SSO and conditional-access friction that requires IT involvement. +- Any authentication step adds drop-off between the user and their data. +`openInExcelWeb()` avoids these issues by uploading the workbook through the same anonymous Office file service used elsewhere on the web and returning a direct link to Excel for the Web. The user reaches the workbook without authenticating. --- ## 🚀 Quick Start -### Installation +### Install ```bash npm install @microsoft/connected-workbooks ``` ---- - -## 💡 Usage Examples - -### 📋 **HTML Table Export** - -Perfect for quick data exports from existing web tables. +### The 3-line integration ```typescript import { workbookManager } from '@microsoft/connected-workbooks'; -// One line of code to convert any table -const blob = await workbookManager.generateTableWorkbookFromHtml( - document.querySelector('table') as HTMLTableElement -); +const blob = await workbookManager.generateTableWorkbookFromGrid({ data: myRows }); +await workbookManager.openInExcelWeb(blob, "MyData.xlsx"); +``` -// Open in Excel for the Web -// Edit mode with full editing capabilities (default) -workbookManager.openInExcelWeb(blob, "QuickExport.xlsx"); +That's the whole thing. Ship it. -// View mode with typing disabled -workbookManager.openInExcelWeb(blob, "QuickExport.xlsx", false, false); +--- -// View mode with typing enabled -workbookManager.openInExcelWeb(blob, "QuickExport.xlsx", true, false); -``` +## Using the library -### 📊 **Smart Data Formatting** +The library is used in two stages: produce an Excel workbook as a `Blob`, then deliver it to the user. -Transform raw data arrays into professionally formatted Excel tables. +### 1. Produce a workbook -```typescript -import { workbookManager } from '@microsoft/connected-workbooks'; +Call one of the generator functions to obtain a `Blob` containing a valid `.xlsx` file. Inputs may be an HTML `` element, a structured grid, or a Power Query definition. See [Generating the workbook](#-generating-the-workbook) for the available options. -const salesData = { - config: { - promoteHeaders: true, // First row becomes headers - adjustColumnNames: true // Clean up column names - }, - data: [ - ["Product", "Revenue", "InStock", "Category", "LastUpdated"], - ["Surface Laptop", 1299.99, true, "Hardware", "2024-10-26"], - ["Office 365", 99.99, true, "Software", "2024-10-26"], - ["Azure Credits", 500.00, false, "Cloud", "2024-10-25"], - ["Teams Premium", 149.99, true, "Software", "2024-10-24"] - ] -}; - -const blob = await workbookManager.generateTableWorkbookFromGrid(salesData); -workbookManager.openInExcelWeb(blob, "SalesReport.xlsx", true); -``` +The delivery functions accept any `Blob` representing a valid `.xlsx` file, so the workbook does not have to be produced by this library. Output from third-party libraries such as [ExcelJS](https://github.com/exceljs/exceljs), [SheetJS](https://sheetjs.com/), or any server-side generator can be passed directly to `openInExcelWeb()` or `getExcelForWebWorkbookUrl()`. For example: -
-Smart Formatted Excel Table -
+```typescript +import ExcelJS from 'exceljs'; +import { workbookManager } from '@microsoft/connected-workbooks'; +const workbook = new ExcelJS.Workbook(); +const sheet = workbook.addWorksheet('Sales'); +sheet.addRow(['Region', 'Revenue']); +sheet.addRow(['North America', 2_750_000]); +const buffer = await workbook.xlsx.writeBuffer(); +const blob = new Blob([buffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', +}); -### 🎨 **Custom Branded Templates** +await workbookManager.openInExcelWeb(blob, "SalesReport.xlsx"); +``` -Transform your data using pre-built Excel templates with your corporate branding. +### 2. Deliver the workbook +Two delivery functions are provided: +- **`openInExcelWeb(file, filename?, allowEdit?)`** — uploads the workbook and opens it in Excel for the Web in a new browser tab. `allowEdit` defaults to `true` (edit mode); pass `false` for read-only. +- **`getExcelForWebWorkbookUrl(file, filename?, allowEdit?)`** — performs the same upload but returns the URL as a string, allowing the caller to embed it in a link, email, or message. -**Steps:** +Both functions upload through the same anonymous Office file service and do not require the end user to sign in. -1. **Prepare Your Template File** +```typescript +// Open the workbook in a new tab +await workbookManager.openInExcelWeb(blob, "SalesReport.xlsx"); - Open Excel and create (or open) your branded file. -2. **Pick one sheet that will hold your data.** +// Open in read-only mode +await workbookManager.openInExcelWeb(blob, "Q4-Dashboard.xlsx", false); - The default "Sheet1"(3) -3. **Inside that sheet, choose were you want your data to be populated(1) and create a table (Insert → Table).** +// Or retrieve the URL for custom delivery +const url = await workbookManager.getExcelForWebWorkbookUrl(blob, "Report.xlsx"); +``` - The default table name is Table1(2) - The table need to have the same column structure as your incoming data. -4. **Add any charts, formulas, or formatting that reference this table.** +> **Note:** the returned URL is unauthenticated. Anyone in possession of the link can open the workbook. Treat it as an unlisted shareable link rather than a secret, and avoid including sensitive content in workbooks distributed this way. - Example: Pie chart using Gross column(4). -5. **Save the Excel file (e.g., my-template.xlsx).** -6. **Use the saved file as the template for your incoming data** +--- -The library will then populate the designated table with your data. Any functions, figures, or references linked to this table within the Excel template will automatically reflect the newly exported data. +## 📦 Generating the workbook -
-Custom Branded Excel Dashboard -
+`openInExcelWeb()` accepts any `Blob` containing a valid `.xlsx`. We give you three ways to produce one — pick whichever matches the data you already have. -
- - Download before.xlsxDownload after.xlsx -
+### From an HTML table on your page -#### 📁 **Loading Template Files** +You already render the data as an HTML `
`. Convert it in one line. ```typescript -// Method 1: File upload from user -const templateInput = document.querySelector('#template-upload') as HTMLInputElement; -const templateFile = templateInput.files[0]; - -// Method 2: Fetch from your server -const templateResponse = await fetch('/assets/templates/sales-dashboard.xlsx'); -const templateFile = await templateResponse.blob(); - -// Method 3: Drag and drop -function handleTemplateDrop(event: DragEvent) { - const templateFile = event.dataTransfer.files[0]; - // Use templateFile with the library -} +const blob = await workbookManager.generateTableWorkbookFromHtml( + document.querySelector('table') as HTMLTableElement +); + +await workbookManager.openInExcelWeb(blob, "QuickExport.xlsx"); ``` -#### 📊 **Generate Branded Workbook** +### From a raw data grid + +You have an array of arrays (or rows from an API). Promote headers, clean up names, ship it to Excel. ```typescript -const quarterlyData = { - config: { promoteHeaders: true, adjustColumnNames: true }, +const salesData = { + config: { + promoteHeaders: true, // First row becomes the header row + adjustColumnNames: true // De-duplicate / sanitize column names + }, data: [ - ["Region", "Q3_Revenue", "Q4_Revenue", "Growth", "Target_Met"], - ["North America", 2500000, 2750000, "10%", true], - ["Europe", 1800000, 2100000, "17%", true], - ["Asia Pacific", 1200000, 1400000, "17%", true], - ["Latin America", 800000, 950000, "19%", true] + ["Product", "Revenue", "InStock", "Category"], + ["Surface Laptop", 1299.99, true, "Hardware"], + ["Microsoft 365", 99.99, true, "Software"], + ["Azure Credits", 500.00, false, "Cloud"] ] }; -// Inject data into your branded template -const blob = await workbookManager.generateTableWorkbookFromGrid( - quarterlyData, - undefined, // Use template's existing data structure - { - templateFile: templateFile, - TempleteSettings: { - sheetName: "Dashboard", // Target worksheet - tableName: "QuarterlyData" // Target table name - } - } -); - -// Users get a fully branded report -workbookManager.openInExcelWeb(blob, "Q4_Executive_Dashboard.xlsx", true); +const blob = await workbookManager.generateTableWorkbookFromGrid(salesData); +await workbookManager.openInExcelWeb(blob, "SalesReport.xlsx"); ``` -
-Custom Branded Excel Dashboard -
+## Advanced: Power Query connections (live, refreshable data) -> 💡 **Template Requirements**: Include a query named **"Query1"** connected to a **Table**. +For scenarios that require workbooks to retrieve up-to-date data from a remote source rather than embedding a static snapshot, the library can produce a workbook containing a Power Query connection. When the user opens the workbook, Excel executes the embedded query and populates the worksheet with the latest result. -### 🔄 **Live Data Connections with Power Query** +This option is appropriate when: -Create workbooks that automatically refresh from your data sources. +- The underlying data changes frequently and recipients are expected to refresh. +- The data lives behind a stable HTTP endpoint or any other source supported by Power Query. +- A single workbook needs to be reused over time rather than regenerated for each request. -```typescript -import { workbookManager } from '@microsoft/connected-workbooks'; +`generateSingleQueryWorkbook()` accepts a Power Query M expression and a flag indicating whether to refresh automatically when the workbook is opened: -// Create a workbook that connects to your API +```typescript const blob = await workbookManager.generateSingleQueryWorkbook({ - queryMashup: `let - Source = {1..10} - in + queryMashup: `let + Source = Json.Document(Web.Contents("https://api.contoso.com/sales")) + in Source`, - refreshOnOpen: true + refreshOnOpen: true, }); -workbookManager.openInExcelWeb(blob, "MyData.xlsx", true); +await workbookManager.openInExcelWeb(blob, "LiveSales.xlsx"); ``` -> 📚 **Learn Power Query**: New to Power Query? Check out the [official documentation](https://docs.microsoft.com/en-us/power-query/) to unlock the full potential of live data connections. +Power Query supports a wide range of connectors, transformations, and authentication modes; a full description is outside the scope of this document. Refer to the [official Power Query documentation](https://docs.microsoft.com/en-us/power-query/) for guidance on authoring M expressions. For static exports, the HTML and grid generators described above are typically sufficient and do not require any Power Query knowledge. -
-Live Data Workbook -
-### 📄 **Professional Document Properties** +### With your own branded template -Add metadata and professional document properties for enterprise use. +Bring an Excel file with your charts, formulas, branding, and PivotTables already set up. We'll inject the user's data into the named table and open the result. All your formatting and visualizations come along for the ride. ```typescript -const blob = await workbookManager.generateTableWorkbookFromHtml( - document.querySelector('table') as HTMLTableElement, +const blob = await workbookManager.generateTableWorkbookFromGrid( + quarterlyData, + undefined, { - docProps: { - createdBy: 'John Doe', - lastModifiedBy: 'Jane Doe', - description: 'Sales Report Q4 2024', - title: 'Quarterly Sales Data' + templateFile: myBrandedTemplate, // File or Buffer + TempleteSettings: { + sheetName: "Dashboard", + tableName: "QuarterlyData" } } ); -// Download for offline use -workbookManager.downloadWorkbook(blob, "MyTable.xlsx"); +await workbookManager.openInExcelWeb(blob, "Q4-Executive-Dashboard.xlsx"); ```
-Professional Document Properties +Branded Excel dashboard
-## 📚 Complete API Reference +--- -### Core Functions +## 🎬 Real-world scenarios -#### 🔗 `generateSingleQueryWorkbook()` -Create Power Query connected workbooks with live data refresh capabilities. +### "Open in Excel" button on a public-facing report -```typescript -async function generateSingleQueryWorkbook( - query: QueryInfo, - grid?: Grid, - fileConfigs?: FileConfigs -): Promise -``` +Your marketing site shows a public sales leaderboard. Visitors aren't signed in and never will be. They click "Open in Excel" → new tab → they're in Excel Online, sorting and filtering. **No login wall.** -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `query` | [`QueryInfo`](#queryinfo) | ✅ **Required** | Power Query configuration | -| `grid` | [`Grid`](#grid) | Optional | Pre-populate with data | -| `fileConfigs` | [`FileConfigs`](#fileconfigs) | Optional | Customization options | +### Embedding live data in customer emails -#### 📋 `generateTableWorkbookFromHtml()` -Convert HTML tables to Excel workbooks instantly. +Your CRM sends quarterly summaries to customers. Generate the workbook, get the URL with `getExcelForWebWorkbookUrl()`, drop it in the email. The customer clicks once and is in Excel — no app, no install, no account. -```typescript -async function generateTableWorkbookFromHtml( - htmlTable: HTMLTableElement, - fileConfigs?: FileConfigs -): Promise -``` +### Internal tools for mixed-device fleets -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `htmlTable` | `HTMLTableElement` | ✅ **Required** | Source HTML table | -| `fileConfigs` | [`FileConfigs`](#fileconfigs) | Optional | Customization options | +Your ops team is on Macs, Chromebooks, and locked-down VDIs. Excel desktop isn't an option. `openInExcelWeb()` works identically on every one of them, because it's just a URL in a browser. -#### 📊 `generateTableWorkbookFromGrid()` -Transform raw data arrays into formatted Excel tables. +### View-only handoff to non-technical stakeholders -```typescript -async function generateTableWorkbookFromGrid( - grid: Grid, - fileConfigs?: FileConfigs -): Promise -``` +Generate a finished report, open it in **view mode** (`allowEdit: false`) so the stakeholder can read but not accidentally edit. They get the full Excel rendering — formulas, charts, conditional formatting — without any risk. -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `grid` | [`Grid`](#grid) | ✅ **Required** | Data and configuration | -| `fileConfigs` | [`FileConfigs`](#fileconfigs) | Optional | Customization options | +--- -#### 🌐 `openInExcelWeb()` -Open workbooks directly in Excel for the Web. +## 🏢 Already powering + +Open In Excel ships in production across Microsoft's enterprise platforms: + +
+ +||||| +|:---:|:---:|:---:|:---:| +|**Azure Data Explorer**|**Log Analytics**|**Datamart**|**Viva Sales**| + +
+ +--- + +## 📚 Full API Reference +### Open / share + +#### 🌐 `openInExcelWeb()` ```typescript async function openInExcelWeb( - blob: Blob, + file: Blob, filename?: string, allowEdit?: boolean ): Promise ``` +Uploads the workbook anonymously and opens it in Excel for the Web in a new tab. -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `blob` | `Blob` | ✅ **Required** | Generated workbook | -| `filename` | `string` | Optional | Custom filename | -| `allowEdit` | `boolean` | Optional | Open in edit mode with full editing capabilities (default: **true**) | +#### 🔗 `getExcelForWebWorkbookUrl()` +```typescript +async function getExcelForWebWorkbookUrl( + file: Blob, + filename?: string, + allowEdit?: boolean +): Promise +``` +Same upload, returns the URL. Use when you want to embed, share, or route the link yourself. #### 💾 `downloadWorkbook()` -Trigger browser download of the workbook. - ```typescript function downloadWorkbook(file: Blob, filename: string): void ``` +Old-school browser download fallback, in case you still need it. -#### 🔗 `getExcelForWebWorkbookUrl()` -Get the Excel for Web URL without opening (useful for custom integrations). +### Generate +#### 📋 `generateTableWorkbookFromHtml()` ```typescript -async function getExcelForWebWorkbookUrl( - file: Blob, - filename?: string, - allowEdit?: boolean -): Promise +async function generateTableWorkbookFromHtml( + htmlTable: HTMLTableElement, + fileConfigs?: FileConfigs +): Promise ``` -| Parameter | Type | Required | Description | -|-----------|------|----------|-------------| -| `file` | `Blob` | ✅ **Required** | Generated workbook | -| `filename` | `string` | Optional | Custom filename | -| `allowEdit` | `boolean` | Optional | Use edit URL with full editing capabilities (default: **true**) | +#### 📊 `generateTableWorkbookFromGrid()` +```typescript +async function generateTableWorkbookFromGrid( + grid: Grid, + fileConfigs?: FileConfigs +): Promise +``` + +#### 🔄 `generateSingleQueryWorkbook()` +```typescript +async function generateSingleQueryWorkbook( + query: QueryInfo, + grid?: Grid, + fileConfigs?: FileConfigs +): Promise +``` --- ## 🔧 Type Definitions -### QueryInfo -Power Query configuration for connected workbooks. - ```typescript interface QueryInfo { - queryMashup: string; // Power Query M language code + queryMashup: string; // Power Query M code refreshOnOpen: boolean; // Auto-refresh when opened - queryName?: string; // Query identifier (default: "Query1") + queryName?: string; // Default: "Query1" } -``` -### Grid -Data structure for tabular information. - -```typescript interface Grid { - data: (string | number | boolean)[][]; // Raw data rows - config?: GridConfig; // Processing options -} - -interface GridConfig { - promoteHeaders?: boolean; // Use first row as headers - adjustColumnNames?: boolean; // Fix duplicate/invalid names + data: (string | number | boolean)[][]; + config?: { + promoteHeaders?: boolean; + adjustColumnNames?: boolean; + }; } -``` - -### FileConfigs -Advanced customization options. -```typescript interface FileConfigs { - templateFile?: File | Buffer; // Custom Excel template - docProps?: DocProps; // Document metadata - hostName?: string; // Creator application name - TempleteSettings?: TempleteSettings; // Template-specific settings + templateFile?: File | Buffer; + docProps?: DocProps; + hostName?: string; + TempleteSettings?: { + tableName?: string; + sheetName?: string; + }; } -interface TempleteSettings { - tableName?: string; // Target table name in template - sheetName?: string; // Target worksheet name +interface DocProps { + title?: string; + subject?: string; + keywords?: string; + createdBy?: string; + description?: string; + lastModifiedBy?: string; + category?: string; + revision?: string; } ``` -### DocProps -Document metadata and properties. +--- -```typescript -interface DocProps { - title?: string; // Document title - subject?: string; // Document subject - keywords?: string; // Search keywords - createdBy?: string; // Author name - description?: string; // Document description - lastModifiedBy?: string; // Last editor - category?: string; // Document category - revision?: string; // Version number -} -``` +## ❓ FAQ + +**Does the user need a Microsoft account?** +No. That's the whole point. The workbook is uploaded to Microsoft's anonymous Office file service and opened in a new tab. No account, no sign-in, no tenant. + +**Does the user need Excel installed?** +No. It opens in Excel for the Web, in the browser they already have. + +**Can the workbook be edited after it opens?** +Yes — by default. Pass `allowEdit: false` if you want view-only. + +**Are the uploaded files private?** +The URL is unguessable but not authenticated — anyone with the link can open the workbook. Treat it like an unlisted share link. Don't put secrets in it. + +**Does this work on mobile?** +Yes. Excel for the Web works in mobile browsers, so anything that opens a new tab will work. + +**Can I host the file myself instead?** +Yes — generate the `Blob` with our helpers, host it wherever you want, and skip `openInExcelWeb()` entirely. The generation APIs are independent of the open-in-Excel flow. --- ## Contributing -This project welcomes contributions and suggestions. Most contributions require you to agree to a -Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us -the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. +This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. -When you submit a pull request, a CLA bot will automatically determine whether you need to provide -a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions -provided by the bot. You will only need to do this once across all repos using our CLA. +When you submit a pull request, a CLA bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately. Simply follow the bot's instructions. You only need to do this once across all repos using our CLA. -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). -For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or -contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. - -### Getting Started -1. Fork the repository -2. Create a feature branch -3. Make your changes -4. Add tests for new functionality -5. Submit a pull request +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com). ### Development Setup ```bash @@ -450,11 +415,12 @@ npm install npm run build npm test ``` + --- ## 📄 License -This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. +MIT — see [LICENSE](LICENSE). ## 🔗 Related Resources @@ -466,14 +432,10 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file ## Trademarks -This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft -trademarks or logos is subject to and must follow -[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). -Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. -Any use of third-party trademarks or logos are subject to those third-party's policies. +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies. --- ## Keywords -Power Query, Excel, Office, Workbook, Refresh, Table, xlsx, export, CSV, data export, HTML table, web to Excel, JavaScript Excel, TypeScript Excel, Excel template, PivotTable, connected data, live data, data refresh, Excel for Web, browser Excel, spreadsheet, data visualization, Microsoft Office, Office 365, Excel API, workbook generation, table export, grid export, Excel automation, data processing, business intelligence +Open in Excel, Excel for the Web, Excel Online, anonymous Excel, no sign-in Excel, Power Query, Excel, Office, Workbook, Refresh, Table, xlsx, export, data export, HTML table, web to Excel, JavaScript Excel, TypeScript Excel, Excel template, PivotTable, connected data, live data, data refresh, browser Excel, spreadsheet, data visualization, Microsoft Office, Office 365, Excel API, workbook generation, table export, grid export, Excel automation, business intelligence diff --git a/assets/open-in-excel-example.mp4 b/assets/open-in-excel-example.mp4 new file mode 100644 index 0000000..694396d Binary files /dev/null and b/assets/open-in-excel-example.mp4 differ diff --git a/assets/template example.gif b/assets/template example.gif deleted file mode 100644 index 1fd1ef1..0000000 Binary files a/assets/template example.gif and /dev/null differ diff --git a/package.json b/package.json index 70e1b00..c5789c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@microsoft/connected-workbooks", - "version": "3.4.2", + "version": "3.4.3", "description": "Microsoft backed, Excel advanced xlsx workbook generation JavaScript library", "main": "./dist/index.js", "types": "./dist/index.d.ts",